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