dd 指令教學:製作空檔案、備份硬碟的好工具
dd 是個在 Linux、macOS 系統上能使用的工具,由於它可以對檔案進行 byte-level 的操作,因此很適合用來備份映像檔或製作空檔案。
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 就會幫你計算目前進行了多少比例,以及預計結束的時間。