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所规定。
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
)选项会覆盖ibs
和obs
选项。输入和输出的默认块大小为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
却可能成功。源和目标磁盘应该具有相同的大小。
noerror
选项意味着如果发生错误,程序也将继续运行。sync
选项表示填充每个块到指定字节。
可以修复主引导记录。主引导记录可以转移到文件,或从中转移出来。
要复制软盘的前两个扇区:
dd if=/dev/fd0 of=MBRboot.img bs=512 count=2