Linux man dd

dd(disk dump)-(从 stdio)复制一个具有可变 I/O 块大小的文件(到 stdout),同时可以选择对其执行转换。

版本

$ dd --version
dd (coreutils) 8.22

语法

dd [OPERAND]...
dd OPTION

描述

dd 根据给定的 OPERAND(操作数)对所复制的文件进行转换和格式化。其中,OPERAND 的语法是受 OS/360 JCLDD(数据定义)语句启发的。

OPERAND

bs=BYTES
  同时设置(覆盖) ibs、obs 值为 BYTES。
  此外,如果未设置 conv 值,即使输入的内容长度小于 BYTES,输入也会在读取后立即复制到输出中。

cbs=BYTES
  将转换块大小设置为 BYTES。
  即,在将可变长度记录转换为固定长度记录时(conv=block),使用 BYTES 作为固定记录长度。
  即,在将固定长度记录转换为可变长度记录时(conv=unblock),使用 BYTES 作为固定记录长度。

conv=CONV[,CONV]...
  按照 CONV 规则转换文件(逗号之间没有空格)。
  关于 CONV 详见下文。

count=N
  只从输入文件复制 N*ibs 字节的块(而不是完整的文件)。

ibs=BYTES
  将输入块大小设置为 BYTES,让 dd 读取的每一块大小为 BYTES(默认值:512 字节)。

if=FILE
  从 FILE 读取而不是 stdin。

iflag=FLAG[,FLAG]...
  按照 FLAG 模式访问输入文件(逗号之间没有空格)。

obs=BYTES
  将输出块大小设置为 BYTES,让 dd 写入的每一块大小为 BYTES(默认值:512 字节)。

of=FILE
  写入到 FILE 而不是 stdout。

oflag=FLAG[,FLAG]...
  按照 FLAG 模式访问输出文件(逗号之间没有空格)。

seek=N
  复制之前,在输出文件中,跳过 N*obs 个字节。
  如果指定 oflag=seek_bytes,则表示,复制之前,在输出文件中,跳过 N 个字节。

skip=N
  复制之前,在输入文件中,跳过 N*ibs 个字节。
  如果指定 oflag=skip_bytes,则表示,复制之前,在输入文件中,跳过 N 个字节。

status=LEVEL
  传输信息通常是在 dd 收到 INFO 信号或退出时打印到 stderr。
  而指定 LEVEL 将调整打印的信息量,以最后指定的 LEVEL 为准。
  LEVEL 可选值:
  - none:只打印错误信息;
  - noxfer:禁止打印最后的状态行(包含:传输速率和数量统计信息);
  - progress:处理每个输入块时,都打印一次状态行。在等待 I/O 时,可以延迟打印;

N、BYTES

N、BYTES 值可以使用以下几种后缀,每种后缀代表了不同的字节数,如下:

c=1, w=2, b=512, 
kB=1000, MB=1000*1000, GB=1000*1000*1000
K=1024, M=1024*1024 G=1024*1024*1024
T=1024G, P=1024T, E=1024P, Z=1024E, Y=1024Z

CONV

CONV 可选值:

ascii
  使用 POSIX 指定的转换表,将 EBCDIC 转为 ASCII。(为 256 个字节提供 1:1 转换)
  当 conv=unblock 时,输入被转换为 ASCII 之后,删除尾部空格。

ebcdic
  使用 POSIX 指定的转换表,将 ASCII 转为 EBCDIC。
  当 conv=block 时,输入被转换为 EBCDIC 之前,先添加尾随空格。

ibm
  等价于 conv=ebcdic,只不过使用的是 POSIX 备用的转换表。

block
  对于输入中的每一行,输出长度为 cbs,用空格替换输入换行符,并在必要时用空格填充。

unblock
  删除每个长度为 cbs 的输入块中的所有尾随空格,并添加换行符。

lcase
  将大写字母转为小写字母。

ucase
  将小写字母转为大写字母。

sparse
  尝试搜索而不是将 NUL([脱字符][3]-空字符)写入输出块。
  在支持稀疏文件的文件系统中,在执行扩展输出文件时,将会创建稀疏输出。
  当 conv=notrunc 时,输出文件中的已有数据与输入中相对应的 NUL 块将保持不变。
  当 oflag=append 时,搜索将无效。同样,当输出是设备而不是文件时,不会复制 NUL 输入块,因此 sparese 对虚拟设备或预清零设备最有用。

swab
  交换每一对输入字节。
  与其他非 GNU dd 不同,GNU dd 在读取奇数个字节时,仅复制最后一个字节(因为没有可交换的字节)。

sync
  使用尾随零字节,将每个输入块填充为 ibs 长度。
  与 block、unblock 一起使用时,使用空格代替 NUL。

以下 CONV 实际上是文件访问模式,不会影响转换:

excl
  如果输出文件已经存在,则失败;dd 必定创建输出文件本身。

nocreat
  不要创建输出文件;但输出文件必须已经存在。
  excl、nocreat 是互斥的。

notrunc
  不要截断输出文件。

noerror
  即使读取错误,仍然继续读取。

fdatasync
  在完成之前,同步输出数据(即:强制对输出数据进行物理写入)。

fsync
  与 fdatasync 相似,并同步输出元数据。

FLAG

FLAG 可选值:

append
  以追加模式进行写入,因此,即使其他进程正在写入 FILE,每次 dd 写入也将追加到 FILE 的当前内容。
  append 仅对输出生效。
  与 of=file 一起使用时,还应指定 conv=notrunc(否则,输出文件将在写入到输出之前将被截断)。

direct
  对数据使用直接 I/O,避免使用缓冲区高速缓存。
  注意!内核可能会对读取或写入缓冲区的大小有所限制。例如:基于 Linux 内核,在 ext4 文件系统中,如果输出缓冲区的大小不是 512 的倍数,则使用 oflag=direct 将导致写入失败,并产生 EINVAL。

directory
  除非 FILE 是目录,否则失败(因为大部分操作系统不允许对目录进行 I/O)。

dsync
  对数据使用同步 I/O。(对于输出文件,这会强制在每次写入时对输出数据进行物理写入。对于输入文件,如果是从远程文件中读取时,dsync 可能很重要)

sync
  同时对数据和元数据使用同步 I/O。

fullblock
  累积输入的完整块。如果没有完整的块,则 read 系统调用可能会提前返回。在这种情况下,会继续调用 read 来填充块的其余部分。
  只能与 iflag 一起使用。

nonblock
  使用非阻塞 I/O。

noatime
  不要更新 FILE 的访问时间戳。(一些旧系统会忽略 noatime,做好测试)

nocache
  请求删除文件的系统数据缓存。
  当 count=0 时,将指定 FILE 的所有缓存数据,否则将删除 FILE 已处理部分的缓存。
  同样,当 count=0 时,将诊断出删除高速缓存的失败问题,并反映在退出状态中。
  注意!尚未持久存储的数据不会被从缓存中删除。

noctty
  不要将文件指定为 dd 的控制终端。
  当 FILE 不是终端时,noctty 是无效的(即:在大部分主机上,noctty 都是无效的)。

nofollow
  不要跟进符号链接。

count_bytes
  将 count=N 解释为字节数。
  只能与 iflag 一起使用。

skip_bytes
  将 skip=N 解释为字节数。
  只能与 iflag 一起使用。

seek_bytes
  将 seek=N 解释为字节数。
  只能与 iflag 一起使用。

OPTION

--help
  显示帮助信息

--version
  显示版本信息

示例

  • 向正在运行的 dd 进程发送 USR1 信号,使其将 I/O 传输统计信息打印到 stderr,之后恢复复制。
#!/bin/bash

# 忽略信号,因此脚本不会被意外打断(只会运行到结束)
trap '' USR1

# 使用 iflag=fullblock 以避免 dd 短读(短读:通常是在接收信号时发生)
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

示例输出:

3788617+0 records in
3788617+0 records out
3788617000 bytes (3.8 GB) copied, 3.53638 s, 1.1 GB/s
4834882+0 records in
4834882+0 records out
4834882000 bytes (4.8 GB) copied, 4.55515 s, 1.1 GB/s
5000000+0 records in
5000000+0 records out
5000000000 bytes (5.0 GB) copied, 4.70615 s, 1.1 GB/s
  • 从发生故障(unmount)的磁盘分区中恢复数据
$ dd conv=noerror,sync iflag=fullblock if=/dev/vda1 of=/mnt/rescue.img
^C226913+0 records in
226912+0 records out
116178944 bytes (116 MB) copied, 1.59102 s, 73.0 MB/s

参考资料

添加评论

验证码: