dd是一個Unix和類Unix系統上的命令,主要功能為轉換和複製檔案。
在Unix上,硬體的設備驅動(如硬碟)和特殊設備檔案(如/dev/zero和/dev/random)就像普通檔案一樣,出現在檔案系統中;只要在各自的驅動程式中實現了對應的功能,dd也可以讀取自和/或寫入到這些檔案。這樣,dd也可以用在備份硬體的引導扇區、獲取一定數量的隨機數據等任務中。dd程式也可以在複製時處理數據,例如轉換位元組序、或在ASCII與EBCDIC編碼間互換。
dd的名字可能來源於IBM的工作控制語言(JCL)中的DD語句,意為“Data Description”(數據描述)的縮寫。該命令的語句與JCL中的相似,而與其他Unix命令較不同,因此這可能是個玩笑。另一種解釋是“cc”(根據命令自身的描述,為“convert and copy”(轉換和複製))已經被C語言編譯器(C compiler)所占。
dd命令由單一UNIX規範的一部分,IEEE標準1003.1-2008所規定。
基本介紹
用法[,輸出訊息,塊大小,用途,數據轉換[,備份和恢復主引導記錄,數據修改,磁碟擦除,數據恢復,驅動器性能基準測試[,用隨機數據生成檔案,將檔案轉換為大寫[,創建任意大小的空檔案[,局限,dcfldd,套用實例,命令的解釋,定義,參數,
用法[
dd的命令行語句與其他的Unix程式不同,因為它的命令行選項格式為選項=值,而不是更標準的--選項 值或-選項=值。dd默認從標準輸入中讀取,並寫入到標準輸出中,但可以用選項if(input file,輸入檔案)和of(output file,輸出檔案)改變。
由於作業系統的不同,用法會有出入。另外,dd的一些特定功能取決於計算機系統的能力,例如直接訪問記憶體。向運行中的dd進程傳送SIGINFO信號(Linux上為USR1)可以使它將I/O統計信息列印到標準錯誤一次,然後繼續複製(注意在OS X上,信號可能導致進程終止)。dd可以從鍵盤中讀取標準輸入。到達檔案結尾時,dd將會退出。信號和EOF是由軟體決定。例如,移植到Windows的Unix工具使用不同的EOF:Cygwin使用<ctrl-d> (通常的Unix EOF),而MKS工具箱使用<ctrl-z>(通常的Windows EOF)。
正如Unix哲學一樣,dd只做好一件事(並被認為做得“好”)。與複雜的和高度抽象的實用程式不同,除了為不同的選項做底層決定,dd沒有其它的算法。一般在每一次運行時,會改變dd的選項以分步處理一個計算機問題。
輸出訊息
Linux上GNU coreutils提供的變種沒有描述運行結束時,dd輸出到標準輸出訊息的格式。然而,其他的實現描述了它,例如BSD上的。
“記錄讀入”和“記錄寫出”行顯示了已完整傳輸的塊數+不完整的塊數,例如物理介質以不完整的塊結尾,或是一個物理錯誤使得一個完整的塊無法被讀取。
塊大小
提供給塊大小的值會被解釋成十進制整數,也可以加入後綴指定倍數。後綴w表示2倍,b表示512倍,k表示1024倍,M表示1024 × 1024倍,G表示1024 × 1024 × 1024倍,等等。另外,在塊大小和計數參數中,一些實現也可以使用x表示乘運算。
例如,塊大小bs=2x80x18b表示2 × 80 × 18 × 512 = 1474560位元組,也就是一張1440 KiB軟碟的確切大小。
用途
dd命令可用於各種用途。
數據轉換[
dd可以在檔案、設備、分區和卷之間複製數據。數據可以從其中任何地方輸入或輸出;但輸出到分區時有重要差異。此外在傳輸過程中,數據可以用conv選項修改以適應介質。
如果最後一個塊有意外長度,試圖使用cp複製整個磁碟可能會忽略掉它;然而dd卻可能成功。源和目標磁碟應該具有相同的大小。
dd if=/dev/sr0 of=myCD.iso bs=2048 conv=noerror,sync | |
dd if=/dev/sda2 of=/dev/sdb2 bs=4096 conv=noerror | |
dd if=/dev/ad0 of=/dev/ad1 bs=1M conv=noerror | 克隆硬碟“ad0”到“ad1”。 |
noerror選項意味著如果發生錯誤,程式也將繼續運行。sync選項表示填充每個塊到指定位元組。
備份和恢復主引導記錄
可以修復主引導記錄。主引導記錄可以轉移到檔案,或從中轉移出來。
要複製軟碟的前兩個扇區:
dd if=/dev/fd0 of=MBRboot.img bs=512 count=2
dd if=/dev/sda of=MBR.img bs=512 count=1
dd if=/dev/sda of=MBR_boot.img bs=446 count=1
數據修改
dd可以原地修改數據。
用空位元組覆蓋檔案的前512個位元組:
dd if=/dev/zero of=path/to/file bs=512 count=1 conv=notrunc
轉換選項notrunc意味著不縮減輸出檔案,也就是說,如果輸出檔案已經存在,只改變指定的位元組,然後退出,並保留輸出檔案的剩餘部分。沒有這個選項,dd將創建一個512位元組長的檔案。
在不同的分區中複製磁碟分區到磁碟映像檔案中:
dd if=/dev/sdb2 of=partition.image bs=4096 conv=noerror
磁碟擦除
主條目:數據擦除
出於安全方面的考慮,有時需要擦除丟棄的磁碟。
檢查驅動器上是否有數據,並將其輸出到標準輸出:
dd if=/dev/sda
用零擦除磁碟:
dd if=/dev/zero of=/dev/sda bs=4k
相較於上面數據修改的例子,不需要使用轉換選項notrunc,因為當dd的輸出檔案為塊設備時,它沒有效果。
bs=4k選項使dd一次讀取或寫入4千位元組。在現代系統中,由於傳輸容量(如RAID系統),一個更大的塊大小可能更有利。注意用隨機數據填充磁碟總是比用零慢的多,因為隨機數據必須先由CPU和/或HWRNG生成,且不同的設計有不同的性能特點。(後面PRNG的/dev/urandom可能比libc中的要慢。)在大多數較現代的磁碟中,用零擦除會使其中的數據永久丟失。
用零擦除磁碟會使它的數據無法被軟體恢復。然而數據仍可能用特殊的實驗室技術恢復。
shred程式提供了完成相同任務的替代方法,最後,當前許多Linux發行版還提供了一個精心製作的工具wipe(做得“好”,如上面的Unix哲學),提供了更多方法擦除。
數據恢復
1984年,GNUdd開啟了開源軟體(OSS)恢復數據、檔案、驅動器和分區的歷史。dd進程一次處理一個塊,它的算法只是在用戶界面顯示運行狀態。1999年10月,一個C語言的程式dd_rescue發布了。它的算法一次能處理兩個塊。但改進dd_rescue的數據恢復算法、2003年的shell腳本dd_rhelp作者現在推薦GNU ddrescue。它是一個發布於2004年的C++程式,與大多數的Linux發行版一起發行。在開源軟體中,GNUddrescue有最先進的塊大小變換算法。(ddrescue和dd_rescue儘管名字相近,但卻是不同的程式。因為如此,區分更為明確的備用名稱也有使用;使用的名稱有“addrescue”(freecode.com),“gddrescue”(Debian包名)和“gnu_ddrescue”(openSUSE包名)。)
GNUddrescue既穩定又安全。
另一個開源程式savehd7使用更複雜的算法,但它需要安裝自己的語言解釋器。
驅動器性能基準測試[
對驅動器進行基準測試(通常是單執行緒),使用1024位元組塊分析連續系統讀取和寫入的性能:
dd if=/dev/zero bs=1024 count=1000000 of=file_1GBdd if=file_1GB of=/dev/null bs=1024
用隨機數據生成檔案
使用核心隨機數驅動,用100個隨機位元組生成檔案:
dd if=/dev/urandom of=myrandom bs=100 count=1
將檔案轉換為大寫[
將檔案轉換為大寫:
dd if=filename of=filename1 conv=ucase
創建任意大小的空檔案[
創建1GiB的稀疏檔案,或增加現有檔案的大小:
dd if=/dev/zero of=mytestfile.out bs=1 count=0 seek=1G
(更先進的工具是GNU coreutils中的fallocate或truncate。)
局限
希捷的文檔警告說,“一些依賴底層硬碟訪問的硬碟工具(如DD)可能不支持48位邏輯區塊地址(LBA),除非進行升級”。使用超過128 GiB的ATA硬碟時需要48位LBA。然而在Linux中,dd使用核心讀取或寫入原始設備檔案。2003年釋出的2.4.23版本核心已經實現了對48位LBA的支持。
有人開玩笑說,dd意為“destroy disk”(破壞硬碟)或“delete data”(刪除數據),因為在對硬碟進行底層操作時,類似顛倒輸入和輸出檔案的一個小錯誤都可能造成部分或全部硬碟數據的丟失。
dcfldd
dcfldd是dd的一個分支,由前美國國防部計算機取證實驗室雇員尼克·哈勃(Nick Harbour)開發的增強版本。與dd相比,dcfldd允許一個以上的輸出檔案,同時支持多種校驗計算方法,還提供了驗證模式以匹配檔案,並能顯示操作進度百分比。
套用實例
1.將本地的/dev/hdb整盤備份到/dev/hdd
dd if=/dev/hdb of=/dev/hdd
2.將/dev/hdb全盤數據備份到指定路徑的image檔案
dd if=/dev/hdb of=/root/image
3.將備份檔案恢復到指定盤
dd if=/root/image of=/dev/hdb
4.備份/dev/hdb全盤數據,並利用gzip工具進行壓縮,保存到指定路徑
dd if=/dev/hdb | gzip > /root/image.gz
5.將壓縮的備份檔案恢復到指定盤
gzip -dc /root/image.gz | dd of=/dev/hdb
6.備份磁碟開始的512個位元組大小的MBR信息到指定檔案
dd if=/dev/hda of=/root/image count=1 bs=512
count=1指僅拷貝一個塊;bs=512指塊大小為512個位元組。
恢復:
dd if=/root/image of=/dev/hda
7.備份軟碟
dd if=/dev/fd0 of=disk.img count=1 bs=1440k
(即塊大小為1.44M)
8.拷貝記憶體內容到硬碟
dd if=/dev/mem of=/root/mem.bin bs=1024
(指定塊大小為1k)
9.拷貝光碟內容到指定資料夾,並保存為cd.iso檔案
dd if=/dev/cdrom(hdc) of=/root/cd.iso
10.增加swap分區檔案大小
第一步:創建一個大小為256M的檔案:
dd if=/dev/zero of=/swapfile bs=1024 count=262144
第二步:把這個檔案變成swap檔案:
mkswap /swapfile
第三步:啟用這個swap檔案:
swapon /swapfile
第四步:編輯/etc/fstab檔案,使在每次開機時自動載入swap檔案:
/swapfile swap swap defaults 0 0
11.銷毀磁碟數據
dd if=/dev/urandom of=/dev/hda1
注意:利用隨機的數據填充硬碟,在某些必要的場合可以用來銷毀數據。
12.測試硬碟的讀寫速度
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
dd if=/root/1Gb.file bs=64k | dd of=/dev/null
通過以上兩個命令輸出的命令執行時間,可以計算出硬碟的讀、寫速度。
13.確定硬碟的最佳塊大小:
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file
dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file
通過比較以上命令輸出中所顯示的命令執行時間,即可確定系統最佳的塊大小。
14.修復硬碟
dd if=/dev/sda of=/dev/sda
當硬碟較長時間(比如1,2年)放置不使用後,磁碟上會產生magnetic fluxpoint。當磁頭讀到這些區域時會遇到困難,並可能導致I/O錯誤。當這種情況影響到硬碟的第一個扇區時,可能導致硬碟報廢。上邊的命令有可能使這些數據起死回生。且這個過程是安全,高效的。
15.dd命令做usb啟動盤
dd if=xxx.iso of=/dev/sdb bs=1M
root用戶或者sudo,用以上命令前必須卸載u盤,sdb是你的u盤,bs=1M是塊的大小,後面的數值大,寫的速度相對快一點,但也不是無限的,我一般選2M,注意,執行命令後很快完成,但u盤還在閃,等不閃了,安全移除。
命令的解釋
定義
參數
1.if=檔案名稱:輸入檔案名稱,預設為標準輸入。即指定源檔案。<if=inputfile>2.of=檔案名稱:輸出檔案名稱,預設為標準輸出。即指定目的檔案。< of=output file >3.ibs=bytes:一次讀入bytes個位元組,即指定一個塊大小為bytes個位元組。obs=bytes:一次輸出bytes個位元組,即指定一個塊大小為bytes個位元組。bs=bytes:同時設定讀入/輸出的塊大小為bytes個位元組。4.cbs=bytes:一次轉換bytes個位元組,即指定轉換緩衝區大小。5.skip=blocks:從輸入檔案開頭跳過blocks個塊後再開始複製。6.seek=blocks:從輸出檔案開頭跳過blocks個塊後再開始複製。注意:通常只用當輸出檔案是磁碟或磁帶時才有效,即備份到磁碟或磁帶時才有效。7.count=blocks:僅拷貝blocks個塊,塊大小等於ibs指定的位元組數。8.conv=conversion:用指定的參數轉換檔案。ascii:轉換ebcdic為asciiebcdic:轉換ascii為ebcdicibm:轉換ascii為alternateebcdicblock:把每一行轉換為長度為cbs,不足部分用空格填充unblock:使每一行的長度都為cbs,不足部分用空格填充lcase:把大寫字元轉換為小寫字元ucase:把小寫字元轉換為大寫字元swab:交換輸入的每對位元組noerror:出錯時不停止notrunc:不截短輸出檔案sync:將每個輸入塊填充到ibs個位元組,不足部分用空(NUL)字元補齊。