dd 指令教學:製作空檔案、備份硬碟的好工具

dd 是個在 Linux、macOS 系統上能使用的工具,由於它可以對檔案進行 byte-level 的操作,因此很適合用來備份映像檔或製作空檔案。

dd 指令教學:製作空檔案、備份硬碟的好工具

dd 是個在 Linux、macOS 系統上能使用的工具,由於它可以對檔案進行 byte-level 的操作,因此很適合用來備份映像檔或製作空檔案。

dd 範例

dd 的全名有很多說法,最常見的是 Data Duplicator 或 Disk Duplicator,就是用來操作 Data 或 Disk 的。操作 dd 時最主要就是搞清楚你的來源(Input file, if)和目的(Output file, of),例如,你如果要把 /dev/sda 這顆硬碟備份成映像檔案,你可以這樣做:

dd if=/dev/sda of=/home/noob/backup.img

也可以善用 Linux 存放在 /dev 下的特殊檔案來達成有趣的效果,例如你可以用 /dev/zero 這個檔案當輸入來源,就可以寫一個全都是 0 的檔案。

dd if=/dev/zero of=/home/noob/zero.img bs=1M

上面這個指令,你會寫一個 1MB 的檔案,而內容都會是 0。你可以透過這種方式製作空檔案,然後再複製到不同地方來測試外接硬碟的速度、網路硬碟的速度等;你也可以使用 dd 製作的檔案來製作 swapfile。

而如果要寫一個 2G 大小的檔案,也可以這樣做:

dd if=/dev/urandom of=/home/noob/rand.img bs=1G count=2

上面這個範例,使用 /dev/urandom 這個檔案當輸入來源,把全部都是「隨機」的亂數內容,寫到 rand.img 檔案中。

dd 參數說明

在使用 dd 時會使用 bs(block size)這個參數,這代表每次要從來源取多少大小的內容,預設通常是 512 bytes。你可以提高 Block size 來提升速度,例如直接指定 1G,但可能會降低取檔寫檔的正確性,通常會以 4M 或 8M 左右當作 Block size。

在第一個範例中,由於 /dev/sda 是個有限容量的硬碟,因此寫入到 backup.img 寫完後就會停止。但第二個範例中,/dev/zero 是個取之不盡、用之不竭的檔案,因此會使用 count 來表示要寫幾次,因此最後寫入的檔案大小就會是 block size * count 相乘的積。

用 dd 來備份樹莓派

實務上常用 dd 來備份 Raspberry Pi 記憶卡,如果你會使用 dd 指令,就不需要打開 Etcher 或 Win32 DiskImager 等軟體來操作,例如你可以這樣將記憶卡的內容備份成檔案:

dd if=/dev/sdc of=/home/noob/raspi-backup.img bs=4M

甚至可以搭配 gzip 指令,壓縮並節省空間

dd if=/dev/sdc bs=4M | gzip > raspi-backup.img.gz

還原的時候也可以先解壓縮,再交由 dd 寫入記憶卡:

gzip -dc raspi-backup.img.gz | dd of=/dev/sdc

dd 進度

用 dd 寫入的時候,進度並不會直接顯示出來。小檔案還好,但檔案很大或是寫入目標/來源很慢的時候,就會等到不知道到底有沒有在跑。新版的 dd 指令中已經加入了 status 選項,可以直接加入 status=progress 來顯示進度條:

dd if=/raspi-backup.img of=/dev/sdc bs=4M

如果你是舊版的 dd,無法使用這功能的話,也可以搭配 pv 指令來顯示進度條:

dd if=~/raspi-backup.img | pv | dd of=/dev/sdc

pv 會讀取 dd 的輸出,來顯示現在已經傳輸了多少、傳輸速度等;如果它沒有自動跑出進度比例的話,也可以加上 -s 參數來指定總共要傳輸的大小,例如

dd if=~/raspi-backup.img | pv -s 2G | dd of=/dev/sdc

這樣 pv 就會幫你計算目前進行了多少比例,以及預計結束的時間。

我們正降低廣告比例以提升閱讀體驗。如果你喜歡這篇文章,不妨按下 Like 按鈕分享到社群,以行動支持我寫更多文章。 當然,你也可以 點此用新臺幣支持我,或 點此透過 BTC、ETH、USDC 等加密貨幣支持我
分享到: