来自 维基百科。http://zh.wikipedia.org/zh-cn/Dd_(Unix)
dd是一个Unix和类Unix系统上的命令,主要功能为转换和复制文件。[1]
在Unix上,硬件的设备驱动(如硬盘)和特殊设备文件(如/dev/zero和/dev/random)就像普通文件一样,出现在文件系统中;dd
也可以读取(有时也能写入)这些文件。这样,dd
也可以用在备份硬件的引导扇区、取得一定数量的随机数据等任务中。dd
程序也可以在复制时处理数据,例如转换字节序、或在ASCII与EBCDIC编码间互换。[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变种没有描述运行结束时,dd
输出到标准输出消息的格式。然而,其他的实现描述了它,例如BSD上的。
“记录读入”和“记录写出”行显示了已完整传输的块数+不完整的块数,例如物理介质以不完整的块结尾,或是一个物理错误使得一个完整的块无法被读取。
块大小 [编辑]
块是衡量一次读取、写入和转换字节的单位。命令行选项可以为输入/读取(ibs
)和输出/写入(obs
)指定一个不同的块大小,尽管块大小(bs
)选项会覆盖ibs
和obs
选项。输入和输出的默认块大小为512字节(Unix块设备的块大小)复制的count
选项、读取的skip
选项和写入的seek
选项都是以块为单位。转换操作也受“转换块大小”(cbs
)影响。
在dd
的一些用途中,块大小可能会影响表现。例如,当转换硬盘中数据时,较小的块大小通常会导致更多的字节被转换。较大的块大小可能会提高复制速度。在用作网络传输时,根据使用的网络协议,块大小可能会与包大小冲突。
提供给块大小的值会被解释成十进制整数,也可以加入后缀指定倍数。后缀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 | 从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
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 conv=notrunc
bs=4k
选项使dd
一次读取或写入4千字节。在较现代的系统中,这可以使整个进程大大加快。注意用随机数据填充磁盘总是比用零慢的多,因为随机数据必须先由CPU生成。在大多数较现代的磁盘中,用零擦除会使其中的数据永久丢失。[5]
用零擦除磁盘会使它的数据无法被软件恢复。需要注意的是,由于数据剩磁,数据仍然可能通过特殊的实验室技术恢复。
shred程序可作为执行相同任务的高级工具。
数据恢复 [编辑]
1984年,GNU dd
开启了开源软件(OSS)恢复数据、文件、驱动器和分区的历史。dd
进程一次处理一个块,它的算法只是在用户界面显示运行状态。1999年10月,一个C语言的程序dd_rescue
发布了。它的算法一次能处理两个块。但改进dd_rescue
的数据恢复算法、2003年的shell脚本dd_rhelp
作者现在推荐GNU ddrescue
。[6]它是一个发布于2004年的C++程序,与大多数的Linux发行版一起发行。在开源软件中,GNU ddrescue
有最先进的块大小变换算法。[7](ddrescue
和dd_rescue
尽管名字相近,但却是不同的程序。然而,Linux发行版Debian却将dd_rescue
包装为“ddrescue”,将GNU ddrescue包装为“gddrescue”)。
GNU ddrescue
既稳定又安全。[8]下面是一个未经测试的用法,使用了ddrescue
31个选项中的3个:
ddrescue -n /dev/old_disk /dev/new_disk # 快速扫描无错误区域,然后停止 ddrescue -d -r1 /dev/old_disk /dev/new_disk # 工作时直接访问磁盘的错误区域
另一个开源程序savehd7
使用更复杂的算法,但它需要安装自己的语言解释器。
驱动器性能基准测试 [编辑]
对驱动器进行基准测试,使用1024字节块分析连续读取和写入的性能:
dd if=/dev/zero bs=1024 count=1000000 of=file_1GB dd if=file_1GB of=/dev/null bs=64k
用随机数据生成文件 [编辑]
用100个随机字节生成文件:
dd if=/dev/random 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
局限 [编辑]
希捷的文档警告说,“一些依赖底层硬盘访问的硬盘工具(如DD)可能不支持48位逻辑区块地址(LBA),除非进行升级”。[9]使用超过128 GiB的ATA硬盘时需要48位LBA。然而在Linux中,dd
使用内核读取或写入原始设备文件。[10]2003年释出的2.4.23版本内核已经实现了对48位LBA的支持。[11][12]
有人开玩笑说,dd
意为“destroy disk”(破坏硬盘)或“delete data”(删除数据),因为在对硬盘进行底层操作时,类似颠倒输入和输出文件的一个小错误都可能造成部分或全部硬盘数据的丢失。[2]
dcfldd [编辑]
dcfldd
是dd
的一个分支,由美国国防部计算机取证实验室开发的增强版本。[13][14]与dd
相比,dcfldd
允许一个以上的输出文件,同时支持多种校验计算方法,还提供了验证模式以匹配文件,并能显示操作进度百分比。
参见 [编辑]
参考文献及注释 [编辑]
- ^ Bell Laboratories. dd man page. [2009-02-25].
- ^ 2.0 2.1 Sam Chessman. How and when to use the dd command?. CodeCoffee. [2008-02-19].
- ^ 3.0 3.1 Eric S. Raymond. dd. [2008-02-19].
- ^ 参见旧讨论The Unix "dd" command. alt.folklore.computers. [2011-07-05].
- ^ 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 [7 March 2012]. doi:10.1007/978-3-540-89862-7_21.
- ^ LAB Valentin. dd_rhelp author's repository. 19 September 2011. "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'."
- ^ Damaged Hard Disk. www.cgsecurity.org. [2008-05-20].
- ^ Interview with GNU ddrescue's Antonio Diaz Diaz. Blue-GNU. [2008-12-06]. (原始内容存档于2008-04-15).
- ^ Windows 137GB (128 GiB) Capacity Barrier - Seagate Technology (March 2003)
- ^ 这可以用strace检查。
- ^ ChangeLog-2.4.23. www.kernel.org. [2009-12-07].
- ^ Linux-2.4.23 released Linux kernel mailing list, 2003.
- ^ Jeremy Faircloth, Chris Hurley. Penetration Tester's Open Source Toolkit. Syngress. 2007: 470–472. ISBN 9780080556079.
- ^ Jack Wiles, Anthony Reyes. The Best Damn Cybercrime and Digital Forensics Book Period. Syngress. 2011: 408–411. ISBN 9780080556086.
外部链接 [编辑]
- 单一UNIX®规范,由国际开放标准组织发布 : convert and copy a file – 命令与工具(Commands & Utilities)参考,
- dd:GNU核心工具组手册页。
- Darwin和Mac OS X通用命令(General Commands)手册页 –
- dd for Windows
- savehd7 - Save a potentially damaged harddisk partition
- GNU ddrescue
- GNU ddrescue手册页
- dd_rescue
- dd_rhelp
- Softpanorama dd page
- DD at Linux Questions Wiki
- How to use ddrescue to image a damaged harddisk partition and mount it in Windows.
- Forensics (DD) Dcfldd
|
|