必须用live系统操作,因根分区运行时无法卸载;关键风险包括数据清空、启动失败及ext4在超大目录下性能劣于xfs。

根分区不能“在线迁移”,必须进 Live 环境操作
Linux 根分区(/)在系统运行时被内核和所有进程持续占用,无法卸载、无法直接复制、更无法替换挂载点。所谓“在线迁移”是常见误解——哪怕用 rsync 或 cp -a 同步完数据,也依然要重启进 Live 环境才能切换根文件系统。强行在运行中改 /etc/fstab 或 mount --bind 到新盘,大概率导致 systemd 卡死、journalctl 失效、SSH 断连、图形界面崩溃。
真正能做的“近似在线”动作只有:提前在 Live 环境下完成大部分复制 + 仅剩最后几步在重启后验证。但核心操作本身必须脱离原系统上下文。
dd 全盘克隆 vs rsync 增量同步:选哪个?
两者适用场景完全不同,别混用:
-
dd if=/dev/sda of=/dev/sdb适合源盘未用空间少、目标盘容量刚好或略大、且你接受分区大小完全一致的情况。它复制的是扇区级二进制,包括 MBR/GPT、/boot、LVM 元数据、所有空块——速度慢、浪费 I/O,但引导成功率最高。 -
rsync -aAXH --exclude='/proc' --exclude='/sys' --exclude='/dev' --exclude='/run' --exclude='/tmp' / /mnt/newroot/是生产环境推荐方式:只复制实际文件,保留权限、ACL、硬链接、SELinux 上下文(-X)、扩展属性(-A),跳过虚拟文件系统。目标盘可任意分区布局,后续还能调整大小。
注意:rsync 后必须重装 GRUB 并更新 initramfs,否则新盘大概率无法启动;dd 后若目标盘更大,需用 parted 或 gparted 手动扩展分区+文件系统(resize2fs 或 xfs_growfs)。
fstab 和 GRUB 配置必须按 UUID 改,不能写设备名
新硬盘插入后,/dev/sda 和 /dev/sdb 的映射可能互换,尤其多盘系统。一旦 fstab 里写 /dev/sda1,重启就卡在 emergency mode。
正确做法:
- 用
blkid查新根分区 UUID:blkid /dev/sdb1→ 得到类似UUID=1a2b3c4d-... - 编辑新盘上的
/mnt/newroot/etc/fstab,把原/行的设备路径替换成该 UUID - 编辑新盘上的
/mnt/newroot/boot/grub/grub.cfg(或运行chroot后grub-mkconfig -o /boot/grub/grub.cfg),确保linux行中的root=UUID=...指向新分区 - 如果用了 LVM 或加密,还要确认
/etc/crypttab和/etc/lvm/cache是否同步
最容易被忽略的三件事:initramfs、EFI 分区、SELinux 上下文
迁移后黑屏、卡在 “Loading initial ramdisk…” 或 “dracut initqueue timeout”,往往不是 GRUB 错,而是这三点没处理:
-
initramfs 里没包含新盘驱动:尤其 NVMe 或 RAID 卡,需在 chroot 环境中运行
dracut -f(RHEL/CentOS)或update-initramfs -u(Debian/Ubuntu)强制重建 -
EFI 系统没复制 ESP 分区:新盘若有 EFI 系统,必须单独挂载旧 ESP(如
/dev/sda1)并cp -r /boot/efi/EFI /mnt/newroot/boot/efi/EFI,再用efibootmgr添加新启动项 -
SELinux 上下文损坏:CentOS/RHEL 默认启用 SELinux,
rsync -aX能保留上下文,但若中途出错或用了cp,需在 chroot 中执行touch /.autorelabel && reboot触发重打标
这些细节不显眼,却决定迁移成败。别跳过验证步骤——哪怕只是 chroot /mnt/newroot bash 后跑一遍 ls /、mount、systemctl status,都能提前暴露问题。











