必须确认设备名、目标盘容量和挂载状态,否则极易丢数据;最常见错误是写反if和of,dd不二次确认,执行即覆盖。

能克隆,但必须确认设备名、目标盘容量和挂载状态,否则大概率丢数据。
怎么确认源盘和目标盘不写反
写反 if 和 of 是最常见也是最致命的错误,dd 不会二次确认,执行即覆盖。
- 用
lsblk -d -o NAME,SIZE,MODEL看设备名和物理尺寸,区分sda(老硬盘)和sdb(新盘) - 再用
sudo fdisk -l /dev/sda和sudo fdisk -l /dev/sdb对比分区数量、起始扇区、总扇区数,确认哪个是源、哪个是目标 - 检查是否挂载:
mount | grep sda或mount | grep sdb,有输出说明被占用,必须先sudo umount /dev/sda*(含所有分区) - 强烈建议在 Live USB 环境下操作,避免系统盘被
dd误伤
克隆命令里哪些参数不能省
默认参数极慢且不安全,关键参数缺一不可:
-
bs=4M:块大小设太小(如默认 512 字节)会让复制慢 10 倍以上;设太大(如 128M)可能吃光内存导致 OOM -
conv=noerror,sync:遇到坏道时跳过并填零(noerror),避免卡死;强制每次写入都刷盘(sync),防止断电丢最后几 MB -
status=progress:GNU coreutils ≥ 8.24 才支持,没这参数你只能干等,不知道还要几个小时 - 别加
notrunc——它只对文件输出有效,对块设备(如/dev/sdb)无效,加了也没用
克隆完为什么系统还是无法启动
扇区级复制虽然完整,但 UEFI/GPT 或 BIOS/MBR 启动依赖硬件识别逻辑,容易漏掉关键标记:
- 如果是 GPT+UEFI 盘,克隆后必须手动确认目标盘的 ESP 分区(通常是
/dev/sdb1)是否被标记为boot,esp:sudo blkid /dev/sdb1查看 TYPE 是否为vfat,再用sudo gdisk /dev/sdb→t→ 选分区 → 设类型码ef00 - MBR 盘克隆后,若 BIOS 不认,可能是目标盘未激活主分区:用
sudo fdisk /dev/sdb→a→ 选 1 号分区 →w -
dd复制的是字节流,不更新磁盘 UUID;若系统用 UUID 挂载(/etc/fstab或grub.cfg),需手动改或运行sudo update-grub+sudo grub-install /dev/sdb
大硬盘克隆太慢,有没有更实用的替代方案
全盘 dd 复制未用空间纯属浪费时间,尤其对 2TB SSD 克隆 200GB 实际数据的情况:
- 先收缩源盘文件系统:
sudo resize2fs -M /dev/sda2(ext4)或sudo xfs_growfs -D /mnt -n(XFS 需先卸载),再用fdisk或parted调小分区 - 只克隆实际使用扇区:
sudo dd if=/dev/sda of=/dev/sdb bs=4M count=$(( $(blockdev --getsz /dev/sda) / 2 ))(仅限 MBR 且最后一个分区紧贴末尾) - 更稳妥的做法:用
ddrescue替代dd,它自动跳过坏块、支持断点续传、可估算剩余时间,安装后直接sudo ddrescue -D -f -v /dev/sda /dev/sdb rescue.log - 若只是迁移系统而非做镜像,
rsync -aAXH --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*"} / /mnt/target/+ 重装引导更灵活,还能跨大小盘
真正麻烦的不是命令本身,而是设备识别错、启动标记漏、UUID 冲突这三处——它们不会报错,但会让你在重启后面对黑屏或 GRUB rescue 提示符。











