首页/系统/Linux 运维命令速查/dd 镜像备份/克隆与写盘
磁盘与文件系统51 条

dd 镜像备份/克隆与写盘

dd 按块复制一切(设备、镜像、内存盘),用于整盘克隆、备份引导区、生成测试文件;参数写错(if/of 互换)会瞬间覆盖数据。

Linux 运维命令速查系统更新于 2026-10-13

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 逐块写出。镜像复制完成后比对待写目标与来源的校验值,是确认完整最直接的办法。

易错点

  • if= 与 of= 写反(把设备写在 of= 上)会没有任何提示地销毁整盘数据,执行前必须逐字符核对并确认设备名
  • 沿用默认 bs=512 导致复制速度极慢,大镜像应使用 bs=64M 以上并加 status=progress 观察进度
  • dd 复制运行中的文件系统得到的镜像可能不一致,应停写或使用快照后再复制
  • 写完不执行 sync 就拔出设备,缓存中的数据可能尚未落盘,造成介质内容不完整
  • 只造测试文件时用 dd 而不用 truncate 或 fallocate,既慢又多了一次误覆盖设备的风险
  • 对已挂载的设备直接写入:内核缓存与文件系统元数据仍在工作,写入会破坏其上的数据且两边状态互相打架,动手前必须确认目标未被挂载

数据来源与参考

  • man 1 dd(coreutils)
  • coreutils 手册 dd invocation

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌