دستور dd در لینوکس
dd چیست؟
فرمان تشریح داده یا دیدی (data duplicator)، دستوری در یونیکس است که کاربرد معمول آن برای رونوشت گرفتن و تبدیل سطح پایین دادگان خام است. این دستور، رونوشتی از پرونده را تبدیل کرده و برطبق عملگرهای دادهشده آن را قالببندی میکند.
این ابزار یک ابزار سطح پایین وبسیار قدرتمند لینوکس است که دارای توانایی های زیر است:
- پشتیبان گیری و بازیابی یک هارد دیسک یا یک پارتیشن.
- ایجاد سیستم فایل مجازی و تصاویر پشتیبان از سی دی یا دی وی دی ها به نام فایل های ISO
- کپی مناطق فایل های دستگاه خام مثل پشتیبان گیری از MBR (master boot record).
- تبدیل فرمت های داده مانند ASCII به EBCDIC.
- تبدیل حروف کوچک به حروف بزرگ و برعکس.
- ساخت یک فلش با قابلیت بوت برای نصب سیستم عامل ها
فقط کاربر superuser می تواند این دستور را اجرا کند. در هنگام استفاده از این دستور باید بسیار مراقب باشید زیرا استفاده نادرست ممکن است باعث از بین رفتن اطلاعات زیادی شود. بنابراین، بعضی افراد این ابزار را بعنوان ناوشکن اطلاعاتی یا data destroyer در نظر می گیرند.
سینتکس دستور dd
استفاده پایه از دستور dd آسان است زیرا فقط دو آرگومان دارد: if برای مشخص کردن فایل ورودی و of برای مشخص کردن فایل خروجی.
شما می توانید فایل ها یا دستگاه های بلوک به عنوان مقادیر به این گزینه ها اعمال کنید. با این حال، من توصیه نمی کنم از DD برای کپی کردن فایلها استفاده کنم زیرا CP بسیار ساده است و این کار را با خطر کمتری برای ما انجام میدهد.
با این حال، شما می توانید از آن برای کلون کردن هارد دیسک استفاده کنید.
سینتکس به صورت زیر است
dd if=<source file name> of=<target file name> [Options]
توی مثال ها قسمت option رو بررسی می کنیم
سناریو های مختلف دستور dd
پشتیبان گیری از یک دیسک یا پارتیشن روی یک دیسک یا پارتیشن دیگر
شما می توانید تمام داده های یک دیسک یا یک پارتیشن را در دیسک / پارتیشن دیگر ذخیره کنید.
یک کپی ساده مانند دستور cp نیست و کپی آن به صورت Block size یااندازه بلوک است.
شما می توانید تمام داده ها (کل دیسک) را از دیسک dev/sda/ به dev/sdb/ کپی کنید. dd هیچ چیز درباره سیستم فایل یا پارتیشن نمی داند و فقط همه چیز را از dev/sda/ به dev/sdb/ کپی می کند
. شما می توانید اندازه بلوکی که در هر زمان کپی می شود را با گزینه bs مشخص کنید.
# dd if=/dev/sda of=/dev/sdb bs=4096 conv=noerror,sync
s
97281+0 records in
97280+0 records out
99614720 bytes (100 MB) copied, 2.75838 s, 36.1 MB/
این کار فقط در صورتی انجام می شود که دستگاه دوم حجم برابر یا بزرگتر از اول داشته باشد.
در غیر این صورت، دستور بدرستی کار خودش را به اتمام نمیرساند.
در اینجا، if برای فایل ورودی یا Input file و of مخفف فایل خروجی یا Output file است و bs مخفف اندازه بلوک یا Block size (تعداد بایت هایی است که در یک زمان خوانده یا نوشته می شود).
مطمین شین که اندازه بلوک مضربی از 1024 که برابر با 1KB است استفاده شود.
اگر اندازه بلوک را مشخص نکنید، dd از اندازه بلوک پیش فرض 512 بایت استفاده می کند.
پارامتر conv در این مثال دارای دو مقدار است که noerror به ابزار می فهماند تا به کپی کردن داده ها در صورت برخورد به هر گونه خطا ادامه دهد.
گزینه sync برای همگام سازی بین ورودی و خروجی I/O استفاده می شود.
برای کپی یک پارتیشن رو یک پارتیشن دیگر از دستور زیر استفاده می کنیم
# dd if=/dev/sda1 of=/dev/sdb1 bs=4096 conv=noerror,sync
ایجاد پشتیبان به کمک Image از یک دیسک یا یک پارتیشن
شما می توانید یک تصویر از یک دیسک یا یک پارتیشن ایجاد کنید. پشتیبان گیری دیسک به یک فایل image خیلی سریعتر از کپی دقیق داده ها خواهد بود. همچنین، image دیسک، کار ریکاوری اطلاعات را بسیار ساده تر می کند.
# dd if=/dev/sda of=/sdadisk.img
فایل خروجی را می توانید در هر جایی که می خواهید ذخیره کنید، اما حتما باید در انتهای نام فایل از img. استفاده کنید.
فایل خروجی دقیقا هم سایز دیسک dev/sda/ خواهد بود نه مقدار حجمی که در آن اطلاعات هست
برای فشرده کردن این پشتیبان می توانید از دستور زیر استفاده کنید
# dd if=/dev/sda | gzip -c >/tmp/sdadisk.img.gz
علامت | خروجی را از دستور سمت چپ به عنوان ورودی به دستور سمت راست می دهد. گزینه c – خروجی را در خروجی استاندارد می نویسد و فایل های اصلی را بدون تغییر نگه می دارد.
برای ساخت Image از یک پارتیشن از دستور زیر استفاده کنید
# dd if=/dev/sda1 of=/tmp/sda1.img
بازگرداندن اطلاعات یک دیسک یا تصویر آن
برای بازگرداندن، شما بایستی فایل ورودی را با فایل خروجی که در طول عملیات پشتیبان گیری استفاده کردین، معکوس کنید.
# dd if=/tmp/sdadisk.img of=/dev/sda
برای پارتیشن هم میتوانید از دستور زیر استفاده کنید
# dd if=/tmp/sda1disk.img of=/dev/sda1
اگر از فشره سازی استفاده کردین ابتدا باید آن را از حالا فشرده خارج کنید
# gzip -dc /tmp/sdadisk.img.gz | dd of=/dev/sda
گزینه d- برای عملیات اکسترکت استفاده میشود
ایجاد سیستم فایل مجازی
یک سیستم فایل مجازی یک سیستم فایل است که در یک پرونده وجود دارد که به نوبه خود روی یک دیسک فیزیکی وجود دارد.
شما می توانید آن را برای مثال برای ایجاد یک مبادله اضافی یا حلقه یا یک ماشین مجازی ایجاد کنید
نیاز داریم که از dev / zero/ که یک پرونده ای برای ایجاد یک فایل بدون داده استفاده کنیم اما با اندازه مورد نظر (یک فایل با تمام صفر).
به عبارت دیگر، این یک فایل تمام صفر با اندازه دلخواه.
# dd if=/dev/zero of=/file bs=1024K count=500
500+0 records in
500+0 records out
524288000 bytes (524 MB) copied, 1.21755 s, 431 MB/s
گزینه Count به تعداد بلوک های ورودی اشاره می کند که باید کپی شوند که همراه با مقدار اندازه بلوک کل اندازه را برای کپی نشان می دهد.
برای مثال bs = 1024k و count=500 که حجم کا فایل از حاصل ضرب bs در count محاسبه میشود
total size=bs*count
500*1024=524288000 bytes =524MB
خروجی دستور ls -l سایز این فایل را نشان میدهد
# ls -lh /file
-rw-r--r-- 1 root root 500M May 17 18
:57 /file
حال شما یک فایل سیستم خالی با حجم دلخواه دارین از این می توانید برای دستگاه های loop یا یک virtual disk و … استفاده کنید
تصاویر پشتیبان از سی دی یا دی وی دی ها به عنوان فایل های ISO
ممکنه از خودتون بپرسین که چرا فقط محتویات CD خود را به یک پوشه کپی نکنم و از این طریق از اون پشتیبان بگیرم.
وقتی شما از یک دیسک نوری یک فایل iso میگرید قابلیت های زیادی رو به شما میده از جمله بارگزاری مانند یک دیسک ، رایت روی یک دیسک ذیگر ، سهولت در جابجایی و خیلی از قابلیت های دیگر.
# dd if=/dev/cdrom of=/mycd.iso
برای نحوه استقاده از فایل های iso می توانید به مقاله فایل های ISO در لینوکس مراجعه کنید
پشتیبان گیری و بازیابی MBR
بوت لودر GRUB اغلب در MBR درایو قابل بوت ذخیره می شود.
MBR اولین 512 بایت دیسک را تشکیل می دهد، اجازه می دهد تا 466 بایت ذخیره سازی برای بوت لودر. فضای اضافی برای ذخیره جدول پارتیشن برای آن درایو مورد استفاده قرار می گیرد.
اگر MBR خراب شود، ما نمی توانیم به لینوکس بوت کنیم.
از آنجا که MBR اولین 512 بایت دیسک را تشکیل می دهد، فقط باید آن اندازه بلوک را کپی کنیم
# dd if=/dev/sda of=/tmp/sdambr.img bs=512 count=1
می توانید MBR را همانطور که در دستورات قبلی خود نشان دادیم بازگردانی کنید.
# dd if=/tmp/sdambr.img of=/dev/sda
تبدیل فرمت داده یک فایل از EBCDIC به ASCII و برعکس
اگر یک فایل ebcdic دارین که بیشتر از سیستم های mainframe بازیابی می شود، شما می می توانید آن را به ASCII تبدیل کنید تا تغییرات را با استفاده از ویراستاران متن در سرورهای یونیکس انجام دهید
# dd if=textfile.ebcdic of=textfile.ascii conv=ascii
پس از اصلاح نسخه ASCII و یک اتمام ویرایش، شما می توانید مجدد آن را به EBCDIC تبدیل کنید تا توسط سرور شما مورد استفاده قرار گیرد.
# dd if=textfile.ascii of=textfile.ebcdic conv=ebcdic
تبدیل محتویات یک فایل از حروف بزرگ به کوچک و برعکس
کار خاصی نیست و میشود با ابزار های دیگه راحت انجامش داد ولی dd هم این قابلیت رو داره
برای تبدیل کل محتویات فایل به حروف بزرگ از دستور زیر استفاده میکنیم
# dd if=~/file1 of=~/file2 conv=ucase
برای تبدیل کل محتویات فایل به حروف کوچک از دستور زیر استفاده میکنیم
# dd if=~/file1 of=~/file2 conv=lcase
ساخت یک فلش با قابلیت بوت bootable flash drive
گاهی اوقات نیاز است این فایل تصویر iso را روی یک فلش ریخته و از طریق آن سیستم عاملی را نصب کنیم بدین منظور از دستور زیر استفاده می کنیم
# umount /dev/sda
# dd if=debian.iso of=/dev/sda bs=4M conv=fdatasync status=progress
نکته: دستور dd خروجی درست حسابی ندارد و از میزان پیشرفت کار مطلع نمیشین . بدین منظور از status=progress در دستور dd برای اطلاع از میزان پیشرفت استفاده میکنیم.
برای مشاهده میزان پیشرفت کار در dd میتوان از ابزار pv هم استفاده کرد ابتدا می بایست pv را روی سیتم نصب کنید و دستور را به شکل زیر اصلاح کنید
# dd if=debian.iso | pv | of=/dev/sda bs=4M conv=fdatasync