تهیه پشتیبان با دستور dd

dd یک دستور بیش از حد قوی، بیش از حد ساده، بیش از حد کارا و بیش از حد خطرناک است. دستور dd این قابلیت‌ را دارد که فایل‌ها را کپی کند و فرمت آن‌ها را تغییر دهد. همین! آنهم به این شکل:

dd if=INPUT of=OUTPUT

پس چرا اینقدر از آن تعریف کردم؟ چون ورودی و خروجی می‌توانند چیزهای عجیبی باشند و انواع و اقسام گزینه‌ها هم برای کنترل و تبدیل فرمت وجود دارد. خوشبختانه ما با ساده‌ترین حالت dd کار تهیه پشتیبان را پیش می‌بریم.

می‌دانیم که در لینوکس دیسک‌های سخت، با اسامی‌ای مثل sda و sdb شناخته می‌شوند. پارتیشن‌های روی آن ها هم با اسم‌هایی مثل sda0 و sda1 و … و همه این سخت‌افرازها، مثل بقیه سخت‌افزارها در شاخه dev/ قرار دارند.

حالا هر چیزی که برای بک‌آپ گرفتن از لینوکستان را لازم دارید، بلدید. برای گرفته یک کپی برابر اصل از هاردی که همین الان به کامپیوترتان وصل است (که می‌شود dev/sda/) روی هارد اکسترنالی که همین الان به کامپیوتر وصل کرده‌اید (یعنی dev/sdb/)، کافی است بزنید:

dd if=/dev/sda of=/dev/sdb

و هارد اکسترنال دقیقا به شکل هارد اینترنال درخواهد آمد.

اگر شما هم مثل من یک هارد اکسترنال خیلی بزرگتر داشته باشید و بخواهید هربار فقط یک تصویر از هارد فعلی روی آن کپی کنید، کافی در بخش خروجی دستور dd اسم یک فایل را بدهید. مثلا روی شاخه‌ای که روی هارد اکسترنال هست بروید و بزنید:

dd if=/dev/sda of=./backup_10mordad.img

جذاب نیست؟ هر وقت هم خواستید آن را برگردانید می‌زنید:

dd if=./backup_10mordad.img if=/dev/sda

dd if=./backup_10mordad.img of=/dev/sda

و آن بک‌آپ روی هارد برگردانده می‌شود.

به راحتی حدس می‌نید (و درست هم هست) که برای کلون کردن فقط یک پارتیشن کافی است بزنید:

dd if=/dev/sda5 of=./mydisk_partition5.img

جذاب نیست؟ (:‌ به همین سادگی. البته به شرطی که این چند نکته را هم رعایت کنید:

  • این دستور خطرناک است. کپی پارتیشن‌ها می‌تواند کل اطلاعات را از بین ببرد. اگر شک دارید، اول دقیق یاد بگیرید.
  • dd در سطح خیلی پایین کار می‌کند و فهمی از محتوای فایل و این چیزها ندارد بلکه فقط بایت‌ها را می‌خواند و کپی می‌کند.
  • این دستور باید با دسترسی روت اجرا شود. sudo کنید.
  • منبع نباید تغییر کند. روی هارد ماونت شده کار نکنید. با سی دی لایو بوت کنید و روی سخت‌افزارهایی که ماونت نشده‌اند کار کنید.
  • سلام ، در این خط :
    dd if=./backup_10mordad.img if=/dev/sda

    if دوم باید of یعنی output format باشه . فکر کنم اشتباه تایپی شده

    • admin

      اصلاح کردم (:‌مرسی از تذکر.

  • جالب بود جادی عزیز.

  • پدرام

    سلام
    برای کپی و تهیه نسخه پشتیبان از rsync استفاده کردم
    میشه بگی برای تهیه پشتیبان rsync بهتره یا dd ؟
    موفق باشی

  • علي

    Cool!

  • هومن

    سلام.
    فكر كنم اين دستور براي تعويض HDD لپ تاپ با SSD خيلي عالي باشه! (هر دو رو به يك كامپيوتر وصل كرد وSSD رو با dd مثل HDD كرد)
    اما اين سوال رو دارم:
    HDD لپ تاپ ما فرضا 250GB و شامل يك پارتيشن تقريبا مخفي(!)[محتوي ويندوز و ساير ملزومات recovery] با حجم 10GBو يك پارتيشن 240GB هست و SSD ما 100GB! حالا بايد چي كنيم كه dd تغييري تو پارتيشن recovery نده و پارتيشن اصلي رو به مقدار لازم كوچيك كنه؟
    و اينكه به نظر شما با اين كار مشكلي پيش نمياد؟ (مي شه از ويندوز و reovery مثل زماني كه HDD بود استفاده كرد؟)
    متشكر.

  • جادی

    اینکار به شکل معقول شدنی نیست (: حداقل به نظر من. dd در سطح پایین از دیسک می خونه و روی اون یکی می نویسه. این وسط بعید می دونم بشه پارتیشن رو کوچیک کرد و از این جور کارها. کاری که باید بکنی احتمالا اینه که پارتیشن مخفی ویندوز رو با dd کپی کنی و بعد توی فضای باقی مونده یک پارتیشن بسازی و فایل هایی که می خوای رو کپی کنی.

  • هومن

    واقعا ممنون! (زیاد واسم قابل باور نبود که جواب بدید!)
    درسته٬ البته من هم برای همین سطح پایین بودن dd اون رو برای این کار انتخاب کردم. احتمالا اون راهی که پیشنهاد دادید مناسب باشه.

    فقط برام این سوال پیش اومده بود که این dd اگر اندازه ی دو هارد فرق کنه چی می کنه(مثلا اگر یه هارد ۶۰GB با dd رو یک هارد ۸۰GB کپی کنیم یا بالعکس چی می شه!)

    و هشداری که تو http://en.wikipedia.org/wiki/Dd_(Unix) در مورد دیسک های بزرگ بود چی هست؟! شما تا حالا برای دیسک های بیشتر از ۱۳۷GB استفاده کردید؟

    و آخر هم اینکه اگر استفاده کنم حتما جزئیات رو اینجا می ذارم، اما ممکنه چند ماه دیگه از اون دستور استفاده کنم! به هر حال ممنون.

  • afsar

    من میخواستم از یه کامپیوتر اسپارک که روش سولاریس و برنامه های صنعتی نصبه روی نوار tapeبک آپ بگیرم. میشه راهنماییم کنید.

  • هومن

    سلام!
    اگر بخوام با این دستور از هاردم یه نسخه‌ی پشتیبان تهیه کنم (دو هارد رو یکی کنم!)، باید حتماً اندازه‌ی اونا مشابه باشه؟ اگر هارد مقصد بزرگتر باشه، چه اتفاقی می‌اُفته؟(و اگر خروجی فایل باشه، چطور می‌شه به محتویات اون دسترسی داشت؟)
    متشکرم.