跳至內容

英文维基 | 中文维基 | 日文维基 | 草榴社区

dd (Unix)

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

dd是一個Unix類Unix系統上的命令,主要功能為轉換和複製文件。[1]

在Unix上,硬件的設備驅動(如硬盤)和特殊設備文件(如/dev/zero/dev/random)就像普通文件一樣,出現在文件系統中;只要在各自的驅動程序中實現了對應的功能,dd也可以讀取自和/或寫入到這些文件。這樣,dd也可以用在備份硬件的引導扇區、取得一定數量的隨機數據等任務中。dd程序也可以在複製時處理數據,例如轉換字節序、或在ASCIIEBCDIC編碼間互換。[2]

dd的名字可能來源於IBM工作控制語言(JCL)中的DD語句,[3]意為「Data Description」(數據描述)的縮寫。[4]該命令的語句與JCL中的相似,而與其他Unix命令較不同,因此這可能是個玩笑。[3]另一種解釋是「cc」(根據命令自身的描述,為「convert and copy」(轉換和複製))已經被C語言編譯器(C compiler)所占。[來源請求]

dd命令由單一UNIX規範的一部分,IEEE標準1003.1-2008所規定。

用法

[編輯]

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上的。

「記錄讀入」和「記錄寫出」行顯示了已完整傳輸的塊數+不完整的塊數,例如物理介質以不完整的塊結尾,或是一個物理錯誤使得一個完整的塊無法被讀取。

塊大小

[編輯]

是衡量一次讀取、寫入和轉換字節的單位。命令行選項可以為輸入/讀取(ibs)和輸出/寫入(obs)指定一個不同的塊大小,儘管塊大小(bs)選項會覆蓋ibsobs選項。輸入和輸出的默認塊大小為512字節(傳統的磁盤塊及POSIX規定的「塊」大小)複製的count選項、讀取的skip選項和寫入的seek選項都是以塊為單位。轉換操作也受「轉換塊大小」(cbs)影響。

dd的一些用途中,塊大小可能會影響表現。例如,當轉換硬盤中數據時,較小的塊大小通常會導致更多的字節被轉換。發出許多小塊的讀取是一種開銷的浪費,且可能會對執行性能有負面影響。較大的塊大小可能會提高複製速度。但是,由於要複製的字節量是由bs×count給出的,因此不可能在一次dd命令中複製素數個字節,除非使用兩個糟糕選項之一:bs=N count=1(消耗內存)或bs=1 count=N(大量讀請求開銷)。替代程序(見下文)允許指定字節,而不是塊。在用作網絡傳輸時,根據使用的網絡協議,塊大小可能會與大小衝突。

提供給塊大小的值會被解釋成十進制整數,也可以加入後綴指定倍數。後綴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格式
dd if=/dev/sr0 of=myCD.iso bs=2048 conv=noerror,sync 從CD-ROM中創建ISO磁盤鏡像
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

要創建整個x86主引導記錄的鏡像(包括MS-DOS分區表和MBR魔法字節):

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的輸出文件為塊設備時,它沒有效果。[5]

bs=4k選項使dd一次讀取或寫入4千字節。在現代系統中,由於傳輸容量(如RAID系統),一個更大的塊大小可能更有利。注意用隨機數據填充磁盤總是比用零慢的多,因為隨機數據必須先由CPU和/或HWRNG生成,且不同的設計有不同的性能特點。(後面PRNG的/dev/urandom可能比libc中的要慢。)在大多數較現代的磁盤中,用零擦除會使其中的數據永久丟失。[6]

用零擦除磁盤會使它的數據無法被軟件恢復。然而數據仍可能用特殊的實驗室技術恢復。

shred程序提供了完成相同任務的替代方法,最後,目前許多Linux發行版還提供了一個精心製作的工具wipe[7](做得「好」,如上面的Unix哲學),提供了更多方法擦除。

數據恢復

[編輯]

1984年,GNU dd開啟了開源軟件(OSS)恢復數據、文件、驅動器和分區的歷史。dd進程一次處理一個塊,它的算法只是在用戶界面顯示運行狀態。1999年10月,一個C語言的程序dd_rescue發布了。它的算法一次能處理兩個塊。但改進dd_rescue的數據恢復算法、2003年的shell腳本dd_rhelp作者現在推薦GNU ddrescue[8]它是一個發布於2004年的C++程序,與大多數的Linux發行版一起發行。在開源軟件中,GNU ddrescue有最先進的塊大小變換算法。[9]ddrescuedd_rescue儘管名字相近,但卻是不同的程序。因為如此,區分更為明確的備用名稱也有使用;使用的名稱有「addrescue」(freecode.com),「gddrescue」(Debian包名)和「gnu_ddrescue」(openSUSE包名)。)

GNU ddrescue既穩定又安全。[10]

另一個開源程序savehd7使用更複雜的算法,但它需要安裝自己的語言解釋器。

驅動器性能基準測試

[編輯]

對驅動器進行基準測試(通常是單線程),使用1024字節塊分析連續系統讀取和寫入的性能:

dd if=/dev/zero bs=1024 count=1000000 of=file_1GB
dd 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中的fallocatetruncate。)

局限

[編輯]

希捷的文檔警告說,「一些依賴底層硬盤訪問的硬盤工具(如DD)可能不支持48位邏輯區塊地址(LBA),除非進行升級」。[11]使用超過128 GiB的ATA硬盤時需要48位LBA。然而在Linux中,dd使用內核讀取或寫入原始設備文件[a]2003年釋出的2.4.23版本內核已經實現了對48位LBA的支持。[12][13]

有人開玩笑說,dd意為「destroy disk」(破壞硬盤)或「delete data」(刪除數據),因為在對硬盤進行底層操作時,類似顛倒輸入和輸出文件的一個小錯誤都可能造成部分或全部硬盤數據的丟失。[2]

dcfldd

[編輯]

dcfldddd的一個分支,由前美國國防部計算機取證實驗室雇員尼克·哈勃(Nick Harbour)開發的增強版本。[14][15][16]dd相比,dcfldd允許一個以上的輸出文件,同時支持多種校驗計算方法,還提供了驗證模式以匹配文件,並能顯示操作進度百分比。

參見

[編輯]

注釋

[編輯]
  1. ^ 這可以用strace檢查。

參考文獻

[編輯]
  1. ^ Bell Laboratories. dd man page. [2009-02-25]. (原始內容存檔於2011-02-08). 
  2. ^ 2.0 2.1 Sam Chessman. How and when to use the dd command?. CodeCoffee. [2008-02-19]. (原始內容存檔於2008-02-14). 
  3. ^ 3.0 3.1 Eric S. Raymond. dd. [2008-02-19]. (原始內容存檔於2018-12-13). 
  4. ^ 參見舊討論The Unix "dd" command. alt.folklore.computers. [2011-07-05]. (原始內容存檔於2011-07-09). 
  5. ^ linux - Why using conv=notrunc when cloning a disk with dd?. Stack Overflow. 2013-12-11 [2014-03-24]. (原始內容存檔於2014-03-24). 
  6. ^ Wright, Craig; Kleiman, Dave; Sundhar R.S., Shyaam. Overwriting Hard Drive Data: The Great Wiping Controversy. Lecture Notes in Computer Science. Information Systems Security. 2008, 5352: 243–257 [2012-03-07]. doi:10.1007/978-3-540-89862-7_21. (原始內容存檔於2019-09-24). 
  7. ^ Wipe: Secure File Deletion. Wipe.sf.net. [2014-03-24]. 
  8. ^ LAB Valentin. dd_rhelp author's repository. 2011-09-19 [2013-04-20]. (原始內容存檔於2008-05-16). Important note : For some times, dd_rhelp was the only tool (AFAIK) that did this type of job, but since a few years, it is not true anymore: Antonio Diaz did write a ideal replacement for my tool: GNU 'ddrescue'. 
  9. ^ Damaged Hard Disk. www.cgsecurity.org. [2008-05-20]. (原始內容存檔於2008-05-10). 
  10. ^ Interview with GNU ddrescue's Antonio Diaz Diaz. Blue-GNU. [2008-12-06]. (原始內容存檔於2008-04-15). 
  11. ^ Windows 137GB (128 GiB) Capacity Barrier - Seagate Technology (March 2003)
  12. ^ ChangeLog-2.4.23. www.kernel.org. [2009-12-07]. (原始內容存檔於2009-10-08). 
  13. ^ Linux-2.4.23 released Archive.is存檔,存檔日期2012-12-14 Linux kernel mailing list, 2003.
  14. ^ DCFLDD at Source Forge. Source Forge. [2013-08-17]. (原始內容存檔於2013-08-02). 
  15. ^ Jeremy Faircloth, Chris Hurley. Penetration Tester's Open Source Toolkit. Syngress. 2007: 470 – 472. ISBN 9780080556079. 
  16. ^ Jack Wiles, Anthony Reyes. The Best Damn Cybercrime and Digital Forensics Book Period. Syngress. 2011: 408 – 411. ISBN 9780080556086. 

外部連結

[編輯]