dd - 按块复制和转换数据

dd 按块读取输入并写入输出,也可以执行有限的数据转换。它不会根据文件类型判断操作是否合理,目标写错可能立即覆盖文件、分区或整块设备。

常用操作数

操作数作用
if=FILE输入文件;省略时读取标准输入
of=FILE输出文件;省略时写到标准输出
bs=SIZE同时设置输入和输出块大小
count=N最多复制 N 个输入块
skip=N跳过输入中的 N 个块
seek=N在输出中跳过 N 个块
status=progress周期性显示进度,GNU 扩展
conv=excl目标已存在时失败,GNU 扩展
conv=fsync结束前同步数据和元数据,GNU 扩展

of=FILE 默认会截断已有目标文件。处理普通文件时,可使用 conv=excl 防止意外覆盖。

安全的普通文件示例

# 复制镜像文件;copy.img 已存在时失败
dd if=input.img of=copy.img bs=4M status=progress conv=excl,fsync
 
# 只复制输入文件开头的 1 MiB
dd if=input.bin of=first-megabyte.bin bs=1M count=1 conv=excl
 
# 创建一个 16 MiB 的测试文件
dd if=/dev/zero of=test-data.bin bs=1M count=16 status=progress conv=excl

这些示例仍会写入磁盘。执行前应确认当前目录、目标文件名和可用空间。

原始设备操作

/dev/sdX/dev/nvme... 等块设备写入数据可能不可恢复地破坏分区表和文件系统。因此:

  • 不在公开教程中提供可直接复制执行的整盘写入命令。
  • 写入前必须通过多种信息核对设备身份、容量和挂载状态,不能只凭设备字母判断。
  • 源设备和目标设备不能互换,目标上需要保留的数据必须已有独立备份。
  • 处理故障介质时优先使用为数据恢复设计、支持重试和日志的工具,例如 GNU ddrescue。

性能测试注意事项

简单的 dd 结果会受页缓存、同步方式、块大小、文件系统和存储控制器影响,不能直接代表真实业务性能。写入测试应只针对明确的临时文件或专用测试设备,并限制大小;不要对生产磁盘或不确定路径执行。

参考资料