dd

复制与转换文件


语法格式

dd [operands]
dd [--help] [--version]

命令简介

dd命令主要用于复制文件,或按照要求在复制过程中执行必要的数据转换。如果不加if和of参数,则dd命令把标准输入复制到标准输出中。

dd命令的最大特点是能够采用原始读写的方式,逐块、逐道地把一个存储介质上的数据原封不动地复制到另一个存储介质上。此外还可以把一个文件系统完整地复制到另一个磁盘分区中,从而实现文件系统的备份。

在复制过程中,dd命令还具有数据转换功能,可以把不同代码格式的数据转换为另一种编码的数据,实现不同系统之间的数据交换。

在上述语法格式中,operands是一个或一组操作数,可用的操作数详见“命令参数”一节的说明。

在复制过程中,如果向正在运行的dd进程发送一个USR1信号,可以让dd把当前完成的I/O统计数据写到标准错误输出,然后恢复运行,继续复制数据。

命令参数

bs=n  指定读写数据块的字节数量。数值n后面可以附加一个表示字节数量单位的字符,如K、M、G和T等,分别表示n个1KB、1MB、1GB和1TB的数据块。如果未指定数量单位字符,计数单位为字节。如果忽略了bs参数,默认的读写数据块为512字节。注意,这个参数可以同时强制取代ibs和obs两个参数。

cbs=n  表示每次转换多少个字节。数值n后面也可以附加一个表示字节数量单位的字符,如K、M、G和T等,分别表示每次转换n个1KB、1MB、1GB和1TB的字节。

conv=convs  指定一个或由逗号“,”分隔的一组转换关键字,按照指定的要求转换文件中的数据。

count=blocks  指定复制的数据块数量。每个数据块的大小以ibs、obs或bs的定义为准。

ibs=n  指定输入数据块的字节数量。数值n后面可以附加一个表示字节数量单位的字符,如K、M、G和T等,分别表示n个1KB、1MB、1GB和1TB的数据块。如果未指定数量单位字符,计数单位为字节。如果忽略了ibs参数,默认的输入数据块为512字节。

if=file  指定输入文件。文件可以是普通数据文件,也可以是磁盘分区、磁带、软盘或CD/DVD等设备文件。默认的输入文件为标准输入。

iflag=flags  指定一个或一组标志(中间加逗号分隔符),使用指定的标志访问输入文件。

obs=n  指定输出数据块的字节数量。数值n后面可以附加一个表示字节数量单位的字符,如K、M、G和T等,分别表示n个1KB、1MB、1GB和1TB的数据块。如果未指定数量单位字符,计数单位为字节。如果忽略了obs参数,默认的输出数据块为512字节。

of=file  指定输出文件。文件可以是普通数据文件,也可以是磁盘分区、磁带、软盘或CD/DVD等设备文件。默认的输出文件为标准输出。

oflag=flags  指定一个或一组标志(中间加逗号分隔符),使用指定的标志访问输出文件。

seek=blocks  在开始写入之前,首先从输出文件的起始位置跳过指定数量的数据块(以obs或bs定义的输出数据块为计数单位)。

skip=blocks  在开始读取之前,首先从输入文件的起始位置跳过指定数量的数据块(以ibs或bs定义的输入数据块为计数单位)。

status=noxfer  禁止显示复制过程的统计数据(常规显示的最后一行)。

dd支持的数据转换关键字如下:

ascii  根据POSIX指定的转换表,把EBCDIC转换成ASCII字符,对于所有的256字节,提供1:1的转换。

ebcdic  根据POSIX指定的转换表,把ASCII转换成EBCDIC字符。

ibm  根据POSIX指定的补充转换表,把ASCII转换成补充的EBCDIC字符。

block  对于每一行输入数据,使用空格替换其中的换行符,输出cbs指定字节长度的数据,必要时附加适当数量的空格。

unblock  对于cbs指定长度的输入数据,删除后面多余的空格,最后附加一个换行符。

lcase  把大写字母转换成小写字母。

nocreat  禁止创建输出文件,输出文件事先必须存在。

excl  如果输出文件已经存在,则复制失败(输出文件必须由dd自己创建)。

notrunc  禁止截断输出文件。

ucase  把小写字母转换成大写字母。

swab  交换输入的每一对字节(如果字节数为奇数,最后一个字节仅是复制而已)。

noerror  遇到读数据错误时仍然继续。

sync  对于每个输入数据块,在后面附加适当数量的NULL字符,以达到ibs指定的字节长度。当与block或unblock一起使用时,附加空格而非NULL字符。

fdatasync  在复制完成之前,采用物理写的方式同步输出数据。

fsync  在复制完成之前,采用物理写的方式同步输出数据和元数据。

dd支持的部分读写标志如下:

append  采用追加模式写文件(仅适用于数据输出)。

cio  采用并发的方式读写数据。

direct  采用直接I/O的方式读写数据,避免使用缓存。

dsync  采用同步方式读写数据。

sync  采用同步方式读写数据与元数据。

nonblock  采用非封锁的I/O方式。

noatime  禁止更新文件的访问时间。

nofollow  禁止读写符号链接文件引用的文件。

应用实例

1. 软盘复制。首先使用dd命令把软盘复制到一个临时文件中。

$ dd if=/dev/fd0 of=/tmp/tmpfile
2880+0 records in
2880+0 records out
1474560 bytes (1.5 MB) copied. 48.6294 seconds. 30.3 kB/s
$

然后,再使用dd命令,交换输入和输出文件的位置,把临时文件复制到一个新的软盘中:

$ dd if=/tmp/tmpfile of=/dev/fd0
2880+0 records in
2880+0 records out
1474560 bytes (1.5 MB) copied. 98.822 seconds. 14.9 kB/s
$

2. 给dd进程发送一个USR1信号,查询当前数据复制的进度。

$ dd if=/dev/zero of=/dev/null count=256M & pid=$!
[1] 2035
$ kill -USR1 $pid; wait $pid
6271544+0 records in
6271544+0 records out
3211030528 bytes (3.2 GB) copied, 10.1363 s, 317 MB/s
16777216+0 records in
16777216+0 records out
8589934592 bytes (8.6 GB) copied, 27.1247 s, 317 MB/s
[1]+  Done                    dd if=/dev/zero of=/dev/null count=16M
$

索引:A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z