dd 命令可以從標(biāo)準(zhǔn)輸入或文件中讀取數(shù)據(jù),根據(jù)指定的格式來轉(zhuǎn)換數(shù)據(jù),再輸出到文件、設(shè)備或標(biāo)準(zhǔn)輸出。
同樣是對(duì)數(shù)據(jù)的復(fù)制轉(zhuǎn)移操作,cp 命令針對(duì)的是文件系統(tǒng)級(jí)別,操作的是文件和目錄;而 dd 針對(duì)的是扇區(qū)級(jí)別,對(duì) blocks 進(jìn)行操作。所以可以用它來做整盤數(shù)據(jù)的備份與恢復(fù)、備份 MBR 及啟動(dòng)盤的制作等。
比如將 disk1 上的數(shù)據(jù)使用 dd 命令復(fù)制到 disk2 上,則兩塊硬盤上的數(shù)據(jù)包括布局都是完全一樣的(扇區(qū)級(jí)別)。而 cp 命令只是將 disk1 上的數(shù)據(jù)復(fù)制到 disk2 上,由于系統(tǒng)寫硬盤不是順序?qū)懙?,則兩塊硬盤上相同扇區(qū)號(hào)上的數(shù)據(jù)有可能不一樣。
dd 命令將原始數(shù)據(jù)按照數(shù)據(jù)源的格式原封不動(dòng)地拷貝到目的地;而cp將文件和目錄拷貝到目的地后按照目的地的格式排列新數(shù)據(jù)。對(duì)于不能以文件或目錄格式呈現(xiàn)的數(shù)據(jù)(如引導(dǎo)扇區(qū)的數(shù)據(jù)),cp 是不能操作的。所以需要使用 dd 命令來創(chuàng)建啟動(dòng) U 盤。
一、鏡像格式轉(zhuǎn)換
從網(wǎng)上下載的 Linux iso 鏡像文件,是不受 MacOS 系統(tǒng)支持的。需要先使用 hdiutil 命令進(jìn)行格式轉(zhuǎn)換,才可以使用 dd 命令讀取。
$ hdiutil convert -format UDRW -o <dmg 文件> <iso 文件>
-format 指定生成文件的權(quán)限,UDRW 表示轉(zhuǎn)換成有 read/write 權(quán)限的鏡像

PS:前面講過 dd 命令的原理,即無視文件系統(tǒng),完成扇區(qū)級(jí)別的數(shù)據(jù)轉(zhuǎn)移。所以雖然,網(wǎng)上所有的教程都有格式轉(zhuǎn)換這一步。我嘗試了不做轉(zhuǎn)換直接將 iso 文件寫入磁盤,事實(shí)證明也是可行的。
二、卸載U盤
查看U盤的設(shè)備號(hào)
$ diskutil list
可以通過 diskutil 的 list 選項(xiàng)查看系統(tǒng)當(dāng)前掛載的磁盤設(shè)備。其中的 /dev/disk2 即用來制作啟動(dòng)盤的U盤。

可使用 diskutil 的 unmountDisk 選項(xiàng)來卸載U盤。
$ diskutil unmountDisk /dev/disk2只有當(dāng)U盤成功卸載后,才可以使用 dd 命令將鏡像文件寫入U(xiǎn)盤(否則會(huì)報(bào) Resource busy 錯(cuò)誤)
三、將鏡像文件寫入U(xiǎn)盤
$ sudo dd if=lubuntu-16.04.dmg of=/dev/disk2 bs=1m
其中 if 選項(xiàng)用于指定輸入文件,of 選項(xiàng)用于指定輸出文件,bs 選項(xiàng)用于指定塊大小。

出現(xiàn)以上提示后,則數(shù)據(jù)寫入成功。Linux 啟動(dòng)U盤制作完成。
附:dd 命令介紹
dd 命令可以用指定大小的 blocks 復(fù)制一個(gè)文件,并在復(fù)制的同時(shí)進(jìn)行指定的轉(zhuǎn)換。
命令參數(shù)
- if=文件名:指定輸入文件名,缺省為標(biāo)準(zhǔn)輸入
- of=文件名:指定輸出文件名,缺省為標(biāo)準(zhǔn)輸出
- ibs=bytes:一次讀入 bytes 個(gè)字節(jié),即指定一個(gè)塊大小為 bytes 個(gè)字節(jié)
- obs=bytes:一次輸出 bytes 個(gè)字節(jié),即指定一個(gè)塊大小為 bytes 個(gè)字節(jié)
- bs=bytes:同時(shí)設(shè)置讀入/輸出的塊大小為 bytes 個(gè)字節(jié)
- cbs=bytes:一次轉(zhuǎn)換 bytes 個(gè)字節(jié),即指定轉(zhuǎn)換緩沖區(qū)大小
- skip=blocks:從輸入文件開頭跳過 blocks 個(gè)塊后再開始復(fù)制
- seek=blocks:從輸出文件開頭跳過 blocks 個(gè)塊后再開始復(fù)制
- count=blocks:僅復(fù)制 blocks 個(gè)塊,塊大小等于 ibs 指定的字節(jié)數(shù)
命令示例
將 /dev/disk2 全盤數(shù)據(jù)備份到指定路徑的 image 文件
dd if=/dev/disk2 of=/home/starky/image將備份文件恢復(fù)到指定磁盤
dd if=/home/starky/image of=/dev/disk2備份 /dev/disk2 全盤數(shù)據(jù),并利用 gzip 工具進(jìn)行壓縮,保存到指定路徑
dd if=/dev/disk2 | gzip > /home/starky/image.gz將壓縮的備份文件恢復(fù)到指定盤
gzip -dc /home/starky/image.gz | dd of=/dev/disk2備份磁盤開始的 512 個(gè)字節(jié)大小的 MBR 信息到指定文件
dd if=/dev/disk2 of=/home/starky/image count=1 bs=512
count=1指僅拷貝一個(gè)塊;bs=512指塊大小為 512 個(gè)字節(jié)。拷貝內(nèi)存內(nèi)容到硬盤(Linux)
dd if=/dev/mem of=/home/starky/mem.bin bs=1024(指定塊大小為 1k)銷毀磁盤數(shù)據(jù)(利用隨機(jī)的數(shù)據(jù)填充硬盤)
dd if=/dev/urandom of=/dev/disk2 bs=16M
測(cè)試
- 使用 dd 命令將整個(gè)U盤(包括分區(qū)信息和文件數(shù)據(jù))寫入 dmg 格式鏡像文件disk to dmg
上圖中的 hdiutil 命令在 MacOS 系統(tǒng)中用于操作 dmg 格式的磁盤鏡像(包括掛載、驗(yàn)證、轉(zhuǎn)換、壓縮、燒錄等)。而 attach 選項(xiàng)則用于掛載 dmg 文件(就像使用 mount 命令掛載物理磁盤一樣)。
而從截圖中可以看出,原 U 盤(disk2)和掛載的 dmg 磁盤鏡像(disk3)分區(qū)信息是完全一樣的,同樣的磁盤(分區(qū))大小、分區(qū)表類型(mbr)、文件系統(tǒng)(FAT32)和卷標(biāo)(F01)。dmg 文件就像是對(duì)整個(gè) U 盤的克隆,而不只是文件數(shù)據(jù)的轉(zhuǎn)移。
而分區(qū)中的文件內(nèi)容也完全一致。
disk and dmg - 使用 dd 命令將部分U盤寫入 dmg 格式的磁盤鏡像文件disk to dmg
這種行為,其實(shí)當(dāng)前我也不是很理解。。。disk and dmg
參考資料
man diskutil
man hdiutil
man dd



