dd 是什么
dd 做的是块级复制:它不理解文件系统结构,只是从一个输入按块读到输出,输入输出分别由 if= 与 of= 指定,bs= 与 count= 控制每次读写的块大小与次数。这种「什么都不问」的直白既带来能力——整盘克隆、备份引导扇区、生成测试文件、顺序读写压测,也带来风险:它没有任何确认提示,of= 指向错误设备就会立刻覆盖数据。
基本信息
| 适用平台 | Linux、macOS、BSD(coreutils / BSD dd);GNU 版支持 status=progress |
|---|---|
| 命令语法 | dd if=输入 of=输出 [bs=块大小] [count=块数] [skip=] [seek=] [conv=] |
| 常用参数 | if=、of=、bs= 块大小、count= 块数、status=progress 显示进度、conv=fdatasync 结束时刷盘、conv=noerror 遇错继续、oflag=direct 绕过缓存 |
| 块大小经验 | 默认 512 字节在大量数据下非常慢,顺序复制常用 64k 到 64M 不等 |
| 权限要求 | 读写块设备需要 root;写入 /dev/ 下的设备会直接覆盖其上的数据 |
典型使用场景
- 备份引导扇区:只复制磁盘开头的引导记录,便于快速修复
- 整盘或整分区镜像:用于迁移、留档或交付给取证流程
- 生成指定大小的文件:用 /dev/zero 配合 bs 与 count 造 swap 文件或测试占位文件
- 顺序读写压测:读写测试获得粗略吞吐基线
- 写入镜像到介质:把安装镜像写到移动存储设备
- 扇区级校验:与 cmp 配合确认两块设备内容是否完全一致
常用示例
常用示例
dd if=/dev/sda of=/root/sda-mbr.bak bs=512 count=1 # 备份 MBR
dd if=/dev/sda of=/backup/sda.img bs=64M status=progress # 整盘镜像
dd if=/dev/zero of=/swapfile bs=1M count=4096 conv=fdatasync
chmod 600 /swapfile; mkswap /swapfile; swapon /swapfile # 启用 swap 文件
dd if=/dev/zero of=/tmp/test.img bs=1M count=1024 oflag=direct # 写性能基线
dd if=/tmp/test.img of=/dev/null bs=1M iflag=direct # 读性能基线
cmp -s /dev/sdb /backup/sda.img && echo identical # 校验一致性
sync # 完成后刷盘再拔设备关键参数对照
| 参数 | 作用 | 注意 |
|---|---|---|
| if= / of= | 输入与输出对象 | 写反或指向错误设备会立刻覆盖数据 |
| bs= | 每次读写的块大小 | 默认 512 太慢,大镜像用 64M 以上 |
| count= | 复制的块数 | 不指定则读到输入结束 |
| skip= / seek= | 输入跳过的块数 / 输出起始偏移 | 用于定位到指定位置读写 |
| conv=fdatasync | 结束时把数据真正刷到设备 | 写盘与压测后都建议加上 |
| status=progress | 显示进度与速率 | 长任务必加,否则只能干等 |
块大小直接决定效率:默认 512 字节会带来大量系统调用,顺序复制大镜像时用 bs=64M 或更大通常能明显提升吞吐。做性能基线测试时要考虑缓存的影响,用 oflag=direct 或 iflag=direct 绕过页缓存,否则测到的只是内存速度。
只造一个指定大小的文件,用 truncate 或 fallocate 比 dd 更快也更安全:它们不做实际写入(truncate 造稀疏文件、fallocate 预分配空间),不会因为参数写错把数据写到设备上。dd 在需要真实写入或兼容老环境时再使用。
dd 复制正在运行的文件系统无法保证一致性:边写边拷可能得到不可用的镜像。生产环境应先把写入停掉,使用 LVM 快照或文件系统快照,或只在离线盘上操作。执行前把 if= 与 of= 逐字符核对,并确认目标容量足够。
dd 的统计摘要(复制字节数与耗时)写在标准错误上,重定向日志时要写 2> 才不会丢;脚本判断成功应看退出码。另外默认遇到读错误会直接中断,加 conv=noerror,sync 可以跳过坏块继续复制,但输出内容的偏移会被填充改变,做数据抢救前要清楚这一点。
造测试文件优先用 fallocate 或 truncate:前者立即分配真实块并写入零,速度最快,后者生成稀疏文件、几乎瞬时完成但不占实际空间;只有需要真实落盘读取的基准测试才用 dd 逐块写出。镜像复制完成后比对待写目标与来源的校验值,是确认完整最直接的办法。