常用命令
制作 USB 启动盘(常用于系统安装):
dd bs=4M conv=fdatasync if=/path/to/ubuntu-20.04.3-live-server-amd64.iso of=/dev/sdX
语法格式
dd [OPERAND]... dd OPTION
命令描述
使用可更改的I/O块大小来复制文件,默认情况下从标准输入读取,然后输出到标准输出,并对其执行可选择的转换。
命令选项
命令dd接受下列操作数,其语法受OS/360 JCL的DD(Data Definition,数据定义)语句的启发。
if=file
从文件FILE读取数据,而不是标准输入。
of=file
将输出写入文件FILE而不是标准输出。除非给出’conv=notrunc’,否则dd将文件FILE截断为零字节(或用’seek=’指定的大小)。
ibs=bytes
将输入块大小设置为bytes字节。这使dd的每块会读取bytes字节。默认值是512字节。
obs=bytes
将输出块大小设置为bytes字节。这使dd的每块会输出bytes字节。默认值是512字节。
bs=bytes
将输入和输出块大小都设置为bytes字节。这使dd的每块读取和写入bytes字节,bs会覆盖所有的’ibs’和’obs’设置。另外,如果没有指定数据转换conv选项,则输入也会立即复制到输出,即使读取的输入小于块大小也是如此。
cbs=bytes
将转换块大小设置为bytes字节。将可变长度记录转换为固定长度记录(conv=block)或反过来(conv = unblock)时,使用bytes字节作为固定记录长度。
skip=n
在复制之前,从输入文件中跳过n个’ibs’字节块。如果指定了’iflag=skip_bytes’,则n被解释为字节数,而不是块计数。
seek=n
在复制前,在输出文件中跳过n个’obs’字节块。如果指定了’oflag=seek_bytes’,则n被解释为字节数,而不是块计数。
count=n
从输入文件中复制n个’ibs’字节块,而默认的一直复制到文件结尾。如果指定了“iflag=count_bytes”,则n被解释为字节数,而不是块计数。
请注意,如果输入返回可能短于读取(例如从管道读取时可能会出现这种情况),使用’iflag=fullblock’将确保’count=’对应于完整的输入块,而不是传统的POSIX指定的对输入读取操作进行计数的行为。
status=level
通常在收到’INFO’信号或dd退出时,传送信息才会输出到标准错误中。指定级别level将控制打印的信息量,最后指定的级别level优先级别高。
‘noxfer’,不要打印通常构成最后状态行的最终传输速率和卷统计信息。
‘progress’,在处理每个输入块时,在标准错误上打印传输速率和卷统计信息。统计信息每秒至多输出一行,但在等待I/O时可能会延迟更新。
conv=conversion[,conversion]…
按照转换参数 conversion 指定的文件转换。(在逗号周围没有空格)conversion 可以是下面的值之一:
‘ebcdic’,将ASCII转换为EBCDIC。这是’ascii’转换的反面。这个选项暗含了’conv=block’;在被转换为EBCDIC之前,会现在尾部添加空格。
‘ibm’,这就像’conv=ebcdic’一样,除了它使用POSIX指定的替代转换表。这不是1:1的转换,但反映了’~’,'[‘,’]’的常见历史实践。
‘ascii’,’ebcdic’和’ibm’转换是相互排斥的。如果你使用这些选项中的任何一个,则还应该使用’cbs=’选项。
‘unblock’,删除每个’cbs’大小的输入块中的任何尾部空格,然后附加一个换行符。
‘block’和’unblock’转换是相互排斥的。
‘ucase’,将小写字母改为大写。
‘lcase’和’ucase’转换是相互排斥的。
‘swab’,交换每对输入字节。与其他不同,GNU的dd在读取奇数个字节时,最后一个字节被简单地复制(因为没有任何可交换的字节)。
‘sync’,将每个输入块填充为大小为’ibs’且尾部为零的字节。与’block’或’unblock’一起使用时,填充空格,而不是零字节。
‘nocreat’,不要创建输出文件; 输出文件必须已经存在。
‘excl’和’nocreat’转换是相互排斥的。
‘noerror’,读取错误后继续。
‘fdatasync’,在完成输出前同步输出数据。这会强制进行输出数据的物理写入。
‘fsync’,在完成之前同步输出数据和元数据。这会强制进行输出数据和元数据的物理写入。注意,很多操作都储存在内存中并推迟写入磁盘,该选项告诉 dd 将所有数据写入到磁盘中。
iflag=flag[,flag]…
使用flag参数指定的标志访问输入文件。(在逗号周围没有空格。)
oflag=flag[,flag]…
使用flag参数指定的标志访问输出文件。(在逗号周围没有空格。)下面是可用的flag,但并不是所有的操作系统都支持。
dd if=ifile iflag=nocache count=0
dd of=ofile oflag=nocache conv=notrunc,fdatasync count=0
# Note the kernel will only consider complete and
# already persisted pages.
dd if=ifile iflag=nocache skip=10 count=10 of=/dev/null
# See also the ‘direct’ flag.
dd if=ifile of=ofile iflag=nocache oflag=nocache,sync
上面的数值字符串(n和bytes)后面可以跟一个乘数单位:‘b’=512, ‘c’=1, ‘w’=2, ‘xm’=m,或任何标准块大小后缀,像’k’= 1024(参见块大小)。
任何通过‘bs=’, ‘ibs=’, ‘obs=’, ‘cbs=’指定的块大小不应该太大。大于几兆字节的值通常是浪费的,或者是彻头彻尾的反作用或错误诱导,如在GB、EB的情况中。
要处理偏移量或大小不是I/O块大小倍数的数据,可以使用’skip_bytes’,’seek_bytes’,’count_bytes’标志。或者,可以使用独立的dd调用的传统方法。例如,以下shell命令会在磁盘和磁带之间以512 KiB块复制数据,但不要在磁盘开始时保存或恢复4KiB标签:
tape=/dev/rmt/0
(dd bs=4k skip=1 count=0 && dd bs=512k) <$disk >$tape
(dd bs=4k seek=1 count=0 && dd bs=512k) <$tape >$disk
对于发生故障的磁盘,其他工具中有各种额外的功能,以便在磁盘最终死亡之前减少尽可能多的数据保存,例如, GNU的ddrescue。但是,在某些情况下,此类工具不可用,或者管理员对处理dd更加满意。作为一种简单的救援方法,请按以下示例所示调用dd:
# Rescue data from an (unmounted!) partition of a failing disk.
dd conv=noerror,sync iflag=fullblock </dev/sda1 > /mnt/rescue.img
向正在运行的dd进程发送’INFO’信号(或’USR1’信号不可用),使其将I/O统计信息打印到标准错误,然后继续复制。在下面的例子中,dd在后台运行以复制5GB的数据。kill命令使其输出中间I/O统计信息,当dd正常完成或被SIGINT信号终止时,它会输出最终的统计信息。
# Note this is not needed when SIGINFO is available.
trap ” USR1
# which can be triggered by reception of signals.
dd iflag=fullblock if=/dev/zero of=/dev/null count=5000000 bs=1000 & pid=$!
while kill -s USR1 $pid 2>/dev/null; do sleep 1; done
以上脚本将以下列格式输出:
3441325+0 records out
3441325000 bytes (3.4 GB, 3.2 GiB) copied, 1.00036 s, 3.4 GB/s
5000000+0 records in
5000000+0 records out
5000000000 bytes (5.0 GB, 4.7 GiB) copied, 1.44433 s, 3.5 GB/s
‘status=progress’选项会定期更新上面传输统计信息的最后一行。
在缺少’INFO’信号的系统上,dd会响应’USR1’信号,除非设置了POSIXLY_CORRECT环境变量。
附加说明
退出状态
=0 表示成功。
>0 表示失败。
参考文献
man 1 dd, version GNU coreutils 8.28
查看在线手册:http://www.gnu.org/software/coreutils/dd
查看 info 手册:info ‘(coreutils) dd invocation’
What does the conv-fdatasync do in dd command in linux? – Stack Overflow
What is the ‘bs’ option in dd? – Ask Ubuntu