必须用Live USB启动,因为系统运行时关键目录被持续读写,直接dd或rsync会导致文件锁死、缓存不一致甚至数据损坏;Live环境独立运行于内存,可安全挂载源盘为只读、自由操作目标盘。

不能直接在运行系统里迁移。必须进 Live 环境操作,否则 dd 或 rsync 会读到被占用的文件、缓存不一致,甚至损坏源盘数据。
为什么必须用 Live USB 启动
Linux 系统运行时,/、/usr、/boot 等关键目录被内核和进程持续读写。你无法安全地复制正在被挂载的根分区——rsync 可能跳过锁住的文件,dd 则可能写入中途被修改的扇区,导致新盘启动后报 unknown filesystem 或卡在 initramfs。
- Live 环境(如 Ubuntu Live、Clonezilla Live)是独立运行在内存中的完整系统,不依赖任何本地硬盘
- 此时旧硬盘可只读挂载,新硬盘可自由格式化、分区、写入
- 所有操作都在“外部视角”下进行,避免了运行态干扰
选 dd 还是 rsync:看你要不要保留原 UUID 和引导结构
dd 是块级拷贝,rsync 是文件级同步。两者适用场景完全不同,混用必翻车。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 用
dd if=/dev/sda of=/dev/sdb bs=4M status=progress conv=fsync:适合整盘克隆,保留原分区表、MBR/GPT、GRUB 配置、所有 UUID。但要求目标盘 ≥ 源盘已用空间,且后续需手动扩展空闲空间(用gparted或parted) - 用
rsync -aAXhv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*"} /old-root/ /new-root/:适合重分区场景(比如把旧盘的/boot+/合并到新盘单一分区),新盘 UUID 必然不同,必须重装 GRUB 并更新/etc/fstab - 别用
rsync /old-root /new-root(缺尾斜杠):这会把整个/old-root目录嵌套复制进去,导致新系统多一层目录结构,启动失败
迁移后必须做的三件事,漏一项就起不来
无论用哪种方式,只要换了物理盘,以下步骤不可跳过:
-
更新
/etc/fstab:如果新盘 UUID 改了(rsync方式必然改),就得用blkid查新 UUID,替换掉 fstab 里所有旧值;若沿用旧 UUID(dd方式),这步可跳过,但要确认没多个同 UUID 分区共存 -
chroot 后重装 GRUB:挂载新根分区后,依次
mount --bind /dev /mnt/dev、mount --bind /proc /mnt/proc、mount --bind /sys /mnt/sys,再chroot /mnt,执行grub-install /dev/sdX(X 是目标磁盘,不是分区!)、update-grub -
检查 initramfs 是否适配新硬件:尤其换 NVMe 盘或新芯片组后,运行
update-initramfs -u,否则可能卡在 “Loading initial ramdisk…”
最易被忽略的是 initramfs 重建和 GRUB 安装目标设备写错(比如写成 /dev/sda1 而非 /dev/sda)。这两个点出问题,系统根本进不了内核,连错误日志都看不到。

















