linux迁移根分区
侧边栏壁纸
博主昵称
yuc

  • 累计撰写 291 篇文章
  • 累计收到 0 条评论

linux迁移根分区

yuc
yuc
2024-04-07 / 最后修改: 2024-04-08 06:27 / 0 评论 / 6 阅读 / 正在检测是否收录...
0x1 根分区迁移的背景

有时候系统根分区初始分配太小,后期使用过程中根分区很容易满,并且当初也没有使用 lvm,无法通过 lvm 来扩展分区大小,所以需要另外研究方法来更改根分区大小

0x2 修改根分区大小方法
  1. 分配一块新磁盘 sdb 并且分区 sdb1
  2. 创建 pv、vg、lvm,根分区修改为 lvm 有利于以后扩展
pvcreate /dev/sdb1
vgcreate vg_root  /dev/sdb1
lvcreate -L 4G -n lv0 vg_root
mkfs.ext4 /dev/vg_root/lv0
  1. 创建挂载目录,挂载到新 lvm,复制现在的根分区文件到新分区
mkdir /mnt/root/
mount /dev/vg_root/lv0  /mnt/root/
rsync -avxHAX --numeric-ids --progress /     /mnt/root/
mount --bind /dev/ /mnt/root/dev/
chroot   /mnt/root/
mount -t proc /proc /proc
mount -t sysfs /sys /sys
vgscan
vgchange -ay
  1. 根据新的 root 结构 (lvm信息)生成新的内核启动文件
mkinitrd -v /boot/initrd-`uname -r`.lvm.img `uname -r`
umount /sys
umount /proc
exit
  1. 把新的启动文件移动到原系统boot目录中
mv /mnt/root/boot/initrd-`uname -r`.lvm.img  /boot
  1. 把系统原旧启动文件备份,新启动文件重命名为旧文件,这样后续可以直接重启,不需要修改启动项
cd /boot
mv initramfs-3.10.0-xxx.el7.x86_64.img initramfs-3.10.0-xxx.el7.x86_64.img.bak
mv initrd-`uname -r`.lvm.img initramfs-3.10.0-xxx.el7.x86_64.img
  1. 修改根分区的挂载点 查询新磁盘 blkid
a. 修改 /etc/fstab 中根分区为新的 UUID
b. 同上UUID,修改 /boot/grub2/grub.cfg 中 root=UUID= 部分的内容(有多处)
  1. 以上操作没问题,可以重启了,重启后新盘会作为根分区,但是boot仍然是旧的(当前的场景是 boot 也有单独的分区)

  2. 把旧boot目录内容拷贝出来,然后卸载,再把备份内容复制到boot目录下,接下来在 /etc/fstab 中拿掉 boot 挂载内容,再次重启,即可验证拿掉boot分区挂载

  3. 至此原磁盘全部空闲

  4. 在虚拟机控制台,在此虚拟机不关机状态下删除原磁盘

  5. 重建引导。当前虽然使用的新盘启动,但仍然识别为 sdb,上面把原盘删除了,所以要把引导安装到新盘sdb上

grub2-install /dev/sdb
grub2-mkconfig -o /boot/grub2/grub.cfg
  1. 重启。再次进入系统可以看到变成了 sda,所以再次更新一下 grub.cfg
grub2-mkconfig -o /boot/grub2/grub.cfg
  1. 到此时,看起来基本上没有问题了,但其实还有一个坑,如果给这台机器添加一块磁盘,那么就会发现机器无法启动了,把盘移除则恢复正常,猜测原理如下:
在上面删除原磁盘后,虚拟机本身的记录磁盘顺序没有改变,更换系统的新盘仍然是靠后,如果再加一块盘,那么这个最新的盘会填补删除盘的位置。此时我们启动系统,引导会告诉系统在第一块盘,但第一块是最新的空盘,导致启动失败
  1. 要解决这个问题,那么需要修改虚拟机配置的磁盘id序号,操作如下
a. 关机
b. 在虚拟机配置中,找到这块唯一的系统盘,修改id顺序为最小
c. 重启,测试正常
d. 关机,添加新硬盘
e. 启动,至此迁移全部完成
0x3 efi 的处理方式

上面的扩展根分区方式是传统的bios启动。那如果是 uefi 的启动方式呢? Linux 会有一个隐藏的 分区,那么该如何迁移此分区到新盘上?

0

评论

博主关闭了当前页面的评论