dd可完整克隆磁盘,但须确保目标设备容量≥源盘总字节数,用lsblk或fdisk -l确认/dev/sda等设备名,避免覆写;推荐sudo dd if=/dev/sda of=/dev/sdb bs=4m conv=fsync status=progress。

dd 能完整克隆磁盘,但必须确认目标设备空间 ≥ 源设备已用+未用的总字节数,否则写入会中途失败且无警告。
确认源盘和目标盘设备名
执行 lsblk 或 fdisk -l 查看设备列表,注意区分 /dev/sda、/dev/sdb 等——顺序错一个字符,就可能把系统盘覆写成空盘。尤其在多盘系统中,sda 不一定总是主系统盘;热插拔 SATA 盘或 NVMe 盘(如 /dev/nvme0n1)也需单独识别。不要依赖上次的记忆,每次操作前都重新运行命令确认。
用 dd 克隆整块磁盘(不压缩)
最简形式是 dd if=/dev/sda of=/dev/sdb,但它默认使用 512 字节块,速度极慢。实际应显式设置 bs:
-
bs=4M是多数 SSD/HDD 的较优值,兼顾吞吐与内存占用 - 加
conv=fsync确保每次写入真正落盘,避免断电丢数据 - 加
status=progress(GNU coreutils ≥ 8.24)实时显示进度和速率 - 务必以 root 权限运行,否则
of=/dev/sdb会因权限拒绝而报错Permission denied
完整命令示例:sudo dd if=/dev/sda of=/dev/sdb bs=4M conv=fsync status=progress
备份为镜像文件并压缩
直接写入另一块物理盘风险高,更稳妥的是先存为文件再传输:
-
dd if=/dev/sda of=disk.img bs=4M conv=fsync生成原始镜像 - 压缩时不要用
gzip disk.img,那会先占满磁盘再压缩;改用管道:dd if=/dev/sda bs=4M | gzip > disk.img.gz - 若网络带宽有限,可边传边压:
ssh user@remote "dd if=/dev/sda bs=4M | gzip -1" | gunzip | sudo dd of=/dev/sdb - 注意:压缩后的
.gz文件无法直接挂载或用于dd of=恢复,必须先gunzip解出原始.img
恢复镜像到磁盘时的关键检查点
执行 dd if=disk.img of=/dev/sda 前,漏掉任一检查都可能导致不可逆损坏:
- 用
fdisk -l disk.img验证镜像内分区表结构是否完整(不是所有版本fdisk都支持读取文件,可用parted disk.img print替代) - 确认
/dev/sda当前未挂载任何分区(mount | grep sda),否则写入会触发内核 I/O 错误 - 检查目标盘容量:用
blockdev --getsize64 /dev/sda得到字节数,确保它 ≥stat -c "%s" disk.img的结果 - MBR/GPT 引导信息是否包含在镜像里?如果只备份了
/dev/sda1,那/dev/sda的前 512 字节(MBR)或前几个扇区(GPT 头)就丢了,系统无法启动
最易被忽略的是:dd 镜像不区分“已用空间”和“空闲空间”,哪怕源盘只用了 5%,它仍会复制全部 1TB —— 这也是为什么建议先用 gparted 收缩分区再备份。











