راهنمای کامل استفاده از دستور dd در لینوکس
دستور dd در لینوکس مخفف data duplicator است و به عنوان یک ابزار قدرتمند برای تبدیل و کپی فایل ها استفاده می شود که به مراتب سینتکس متفاوتی نسبت به سایر دستورات لینوکسی دارد.
از مهم ترین کاربردهای دستور dd می توان به ایجاد نسخه پشتیبان از دیسک ها و پارتیشن ها، پاکسازی اطلاعات دیسک ها، ایجاد درایور USB قابل بوت و تبدیل و دستکاری داده ها اشاره کرد.
پیش نیازهای استفاده از دستور dd در لینوکس
- سیستم یا سرور مبتنی بر لینوکس
- دسترسی به ترمینال
- دسترسی به یک حساب کاربری با امتیازات sudo
- فضای ذخیره سازی کافی
- نصب بودن دستور dd در لینوکس
دستور dd به طور پیش فرض در اکثر توزیع های لینوکس نصب است ولی اگر بعد از اجرای دستور dd –version متوجه شدید که این دستور در سیستم شما نصب نیست، ابتدا باید دستور نصب پکیج coreutils در لینوکس را اجرا کنید:
دستور نصب dd در توزیع های مبتنی بر دبیان مثل اوبونتو
sudo apt install coreutils
دستور نصب dd در توزیع های مبتنی بر ردهت مثل CentOS و فدورا
sudo yum install coreutils
یا
sudo dnf install coreutils
دستور نصب dd در آرچ لینوکس
sudo pacman -S coreutils
دستور نصب dd در OpenSUSE
sudo zypper install coreutils
بعد از اینکه دستور نصب با موفقیت اجرا شد، با استفاده از دستور زیر می توانید از نصب موفقیت آمیز آن مطمئن شوید:
dd --version
اگر نیاز به انعطاف بیشتری در مدیریت و حفاظت از اطلاعات سیستم خود دارید، می توانید به صفحه خرید سرور مجازی لینوکس مراجعه کنید و با تهیه یک سرور مناسب، از قدرت دستور dd نهایت استفاده را ببرید.
سینتکس دستور dd در لینوکس
سینتکس پایه دستور dd به صورت زیر است:
dd if=input_file of=output_file bs=block_size count=number_of_blocks
شاید این سینتکس در مقایسه با سینتکس سایر دستورات کمی متفاوت باشد ولی بعداً که با آپشن ها و کاربرد آنها آشنا خواهید شد، می بینید که استفاده از آن چقدر راحت است.
آپشن های دستور dd
آپشن | کاربرد |
if | تعیین فایل ورودی یا مبدا |
of | تعیین فایل خروجی یا مقصد |
bs | تعیین سایز بلاک برای انتقال داده |
count | تعیین تعداد بلاک موردنظر برای کپی |
skip | رد کردن تعدادی از کاراکترها یا بایت ها موقع خواندن فایل ورودی |
seek | رد کردن تعدادی از بلاک ها یا بایت ها موقع نوشتن در فایل خروجی |
status | نمایش وضعیت اجرای دستور dd |
conv | تعیین گزینه های تبدیل ورودی یا خروجی |
برای آشنایی بیشتر با آپشن های دستور dd می توانید از دو دستور زیر کمک بگیرید:
man dd
dd -h
مثال های کاربردی از دستور dd لینوکس
مثال های زیر به صورت ساده تا پیشرفته مرتب شده اند و با بررسی آنها می توانید به طور کامل با طرز کار این دستور dd آشنا شوید:
کپی محتویات یک فایل در فایل دیگر
برای اینکه محتویات فایل مبدا را در یک فایل دیگر کپی کنید، کافیست از آپشن های if و of استفاده کنید.
فرض کنید اسم فایل مبدا source.txt و اسم فایل مقصد destination.txt است و می خواهید محتویات فایل اول را در فایل دوم کپی کنید:
sudo dd if=source.txt of=destination.txt
این دستور محتویات source.txt را می خواند و آن ها را در فایل جدیدی به اسم destination.txt می نویسد.
اگر فایل مقصدی که می خواهید محتویات فایل مبدا را در آن کپی کنید، از قبل وجود داشته باشد، با اجرای دستور بالا فایل موجود بازنویسی می شود و اندازه فایل مقصد به اندازه فایل مبدا محدود می شود.
برای جلوگیری از این قضیه می توانید از آپشن conv=notrunc استفاده کنید.
sudo dd if=source.txt of=destination.txt conv=notrunc
با وارد کردن این آپشن، در واقع از dd می خواهید که به جای بازنویسی کل فایل موجود، محتویات قبلی destination.txt را حفظ کند و فقط بخش های جدید را از source.txt به destination.txt اضافه کند.
اگر هم می خواهید داده های موردنظر را به انتهای فایل موجود اضافه کنید، باید از append استفاده کنید:
sudo dd if=users.txt of=newusers.txt conv=append
یا اگر می خواهید کلاً از بازنویسی جلوگیری کنید، یعنی اگر فایل مقصد از قبل موجود بود، عملیات کپی کلاً شروع نشود، می توانید از گزینه excl استفاده کنید:
sudo dd if=source.txt of=destination.txt conv=excl
البته آپشن conv، امکان Uppercase یا Lower کردن محتویات فایل را هم به شما می دهد.
به عنوان مثال اگر محتویات file1 به صورت lower case (حروف کوچک) است و می خواهید در حین این عملیات کپی در file2، حروف آن را هم به upper case تغییر دهید، باید دستور زیر را اجرا کنید:
sudo dd if=file1.txt of=file2.txt conv=ucase
برعکس این قضیه هم با دستور زیر عملی است:
sudo dd if=file1.txt of=file2.txt conv=lcase
رد کردن بایت ها یا کاراکترهای موردنظر موقع خواندن فایل ورودی
شما می توانید با استفاده از آپشن های ibs و skip از چند کاراکتر اول رد شده و از کپی شدن آن را در فایل خروجی جلوگیری کنید.
به عنوان مثال فرض کنید یک فایل دارید که دارای متن زیر است:
this is a sample text file
حالا اگر بخواهید ۸ کاراکتر اول آن را در پروسه کپی فایل نادیده بگیرید، باید از دستور زیر استفاده کنید:
sudo dd if=file1.txt of=file2.txt ibs=8 skip=1
حالا اگر فایل خروجی را باز کنید، با چنین متنی روبرو خواهید شد:
a sample text file
ایجاد بکاپ از یک پارتیشن
برای پشتیبان گیری از یک پارتیشن دیسک، ابتدا باید دستگاه بلوک مرتبط با پارتیشن را شناسایی کنید که برای این کار می توانید از دستور زیر استفاده کنید:
df -h
بعد از اینکه پارتیشن موردنظر خود را شناسایی کردید، کافیست مسیر پارتیشنی که می خواهید از آن بکاپ بگیری را به آپشن if و اسم فایل بکاپ با پسوند img را هم به آپشن of بدهید.
sudo dd if=/dev/hda1 of=~/partition_backup.img
این دستور محتویات موجود در dev/hda1/ را می خواند و آن را در فایل partition_backup.img ذخیره می کند.
بکاپ گیری از کل هارددیسک
این دستور هم مشابه دستور بالا است. با این تفاوت که این بار باید مسیر اولین دیسک یعنی dev/sda/ را به دستور dd بدهید تا عملیات بکاپ گیری از سیستم شروع شود:
sudo dd if=/dev/sda of=~/hard_disk_backup.img
بازیابی سیستم با دستور dd
اگر به خاطر ریکاوری سیستم خود می خواهید فایل بکاپی که قبلاً از هارددیسک ایجاد کرده اید را بازیابی کنید، باید جای مقدار if و of مربوط به دستور بکاپ را عوض کنید.
ابتدا تمام پارتیشن های دیسک dev/sdb/ را با دستور زیر حذف کنید:
lsblk /dev/sdb
سپس عملیات بازیابی را شروع کنید:
sudo dd if=~/hard_disk_backup.img of=/dev/sda
این دستور محتویات فایل بکاپ را می خواند و سپس مجدداً آن ها را در هارددیسک dev/sda/ می نویسد که همین کار برای بازیابی کل سیستم کافی است.
البته، اگر قصد بازیابی یک پارتیشن را دارید، باز هم می توانید از دستور بالا برای بازیابی آن استفاده کنید (منتها با فایل بکاپ پارتیشن و مسیر پارتیشن موردنظر ).
بکاپ گیری از MBR و بازیابی آن با دستور dd
Master Boot Record (MBR) یکی از اجزای ضروری هارددیسک است و شامل بوت لودر و جدول پارتیشن بندی است.
اگر می خواهید محکم کاری کنید و یک نسخه بکاپ از MBR ایجاد کنید تا در صورت خرابی یا بازنویسی بخش بوت، از آن برای بازیابی وضعیت استفاده کنید، می توانید از دستور زیر استفاده کنید:
sudo dd if=/dev/sda of=mbr_backup.img bs=512 count=1
این دستور، دیسک dev/sda/ را برای خواندن MBR لازم است را به عنوان فایل ورودی می گیرد و بعد فایل خروجی را هم mbr_backup.img تعیین می کند. bs=512 سایز بلوک و count هم تعداد بلوکی که باید کپی شوند را مشخص می کند.
حالا اگر بعدا به مشکل خوردید، می توانید آن را با دستور زیر بازیابی کنید:
sudo dd if=mbr_backup.img of=/dev/sda bs=512 count=1
این دستور، محتویات فایل mbr_backup را می خواند و آن را در دیسک dev/sda/ می نویسد که این کار هم باعث بازیابی MBR می شود.
* هر چه bs بزرگ تر باشد، سرعت کپی بالاتر است.
ایجاد USB قابل بوت
اگر قصد نصب یا راه اندازی سیستم لینوکس خود را دارید و می خواهید این کار را با استفاده از USB انجام دهید، ابتدا باید دستگاه USB موردنظر را بوتیبل کنید که برای این کار می توانید از دستور dd استفاده کنید.
برای ایجاد یک درایو USB قابل بوت، باید فایل iso را به عنوان ورودی و درایو USB را به عنوان فایل خروجی مشخص کنید.
sudo dd if=linux_distro.iso of=/dev/sdX
اگر قصد افزایش سرعت کپی را دارید می توانید آپشن bs را هم به دستور اضافه کنید و مقدار آن را هم روی 4M تنظیم کنید. البته برای برررسی وضعیت کپی فایل ها از مبدا در مقصد هم می توانید status را روی progress تنظیم کنید.
sudo dd if=linux_distro.iso of=/dev/sdX bs=4M status=progress
بعد از اجرای این دستور می توانید از این دستگاه USB برای عملیات نصب و راه اندازی سیستم عامل استفاده کنید.
کپی محتوا از یک درایو CD/DVD
برای اینکه تمام محتوای موجود در CD یا DVD مربوط به دستگاه dev/cdrom/ را در یک فایل iso کپی کنید و از آن به عنوان یک نسخه ی باینری از دیسک اصلی برای کارهای رایت مجدد یا نصب نرم افزار استفاده کنید، می توانید از دستور زیر استفاده کنید:
sudo dd if=/dev/cdrom of=disk_copy.iso
فشرده سازی اطلاعات خوانده شده توسط dd
گفتیم که کاربرد اصلی dd، کپی کردن داده ها است. حالا اگر بخواهید اندازه فایل را با ابزارهای فشرده سازی کاهش دهید، باید دستور dd را با ابزار موردنظر مثل gzip پایپ کنید:
dd if=/dev/sda bs=1M | gzip -c -9 > sda.dd.gz
دستور بالا dev/sda/ را به عنوان فایل ورودی مشخص می کند و جهت بهبود عملکرد هم اندازه بلوک را روی 1M تنظیم می کند.
سپس داده ها را به دستور gzip پایپ می کند، آپشن c به gzip می گوید که به جای ذخیره کردن فایل، خروجی فشرده شده را به خروجی استاندارد ارسال کند و آپشن ۹ هم بالاترین سطح فشرده سازی را برای فایل خروجی لحاظ می کند.
سپس خروجی که یک نسخه خام از دیسک است در یک فایل فشرده شده به اسم sda.dd.gz ذخیره می شود.
* با توجه به این که یک مرحله فشرده سازی هم به دستور dd اضافه شده است، اجرای دستور بالا می تواند کمی زمان بر باشد.
پاکسازی بلوک دستگاه
اگر به دلایلی مثل فروش سیستم، پاکسازی داده های قبلی یا … قصد دارید داده های دستگاه خود را پاک سازی کنید، باز هم دستور dd لینوکس در کنار شماست.
برای این کار باید dev/zero/ را به عنوان فایل ورودی تعیین کنید و دستگاهی که می خواهید پاکسازی کنید را به عنوان مقدار آپشن of قرار دهید.
sudo dd if=/dev/zero bs=1M of=/dev/sda
dev/zero/ یک سری کاراکتر تهی ارائه می دهد و وقتی دستور dd این کاراکترها را در دستگاه موردنظر می نویسد، محتویات این دستگاه پاک می شود.
اگر به فکر پاکسازی امن تر دادهای سیستم هستید و دوست دارید کاری کنید که بازیابی داده های قبلی دشوارتر باشد، می توانید به جای dev/zero/ از dev/urandom/ استفاده کنید.
sudo dd if=/dev/urandom bs=1M of=/dev/sda
این دستور تمام داده های موجود در دیسک dev/sda/ را حذف می کند و با داده های تصادفی بازنویسی می کند.
سخن آخر
دستور dd در لینوکس در زمینه هایی مثل کپی داده ها، ایجاد USB قابل بوت، پاکسازی داده ها و … قابل استفاده است و با آپشن های متنوعی که دارد، به کیفیت و سرعت این عملیات کمک می کند.