根 VG 上的 vgrename - grub2 问题

Posted

技术标签:

【中文标题】根 VG 上的 vgrename - grub2 问题【英文标题】:vgrename on root VG - grub2 issues 【发布时间】:2016-03-17 13:27:41 【问题描述】:

在 Centos 7 的根 VG 上使用“vgrename”后,我正在努力更新 grub2。 我成功运行了“vgrename”,然后使用 VG 名称编辑了 /etc/fstab,然后使用新的 VG 名称在 /etc/default/grub 中编辑了“GRUB_CMDLINE_LINUX=”,然后尝试运行 grub2-mkconfig。正是在这一点上,我得到了错误:

# grub2-mkconfig
/usr/sbin/grub2-probe: error: failed to get canonical path of ‘/dev/mapper/centos_prod--stor01-root’.

它指向的这个规范路径是旧的 VG 名称。我不明白这一点,因为我认为更新 /etc/default/grub 中的 VG 名称会解决这个问题? 任何帮助表示赞赏:)

【问题讨论】:

现在在 CentOS 7 中遇到同样的问题:/ 【参考方案1】:

我的方法在 CentOS 7 和 8 中运行良好。

当前的 vg 和 lvs

# vgs
  VG #PV #LV #SN Attr   VSize    VFree
  cl   1   4   0 wz--n- <325.97g 4.00m
# lvs
  LV      VG Attr       LSize    Pool
  root    cl -wi-ao----  <46.57g

计划 将 vg 名称从 cl 更改为 vg_sys 和 将 lv 名称从 root 更改为 lv_root

重命名 vg 和 lv 名称

vgrename -v cl vg_sys
lvrename /dev/cl/root /dev/vg_sys/lv_root

然后修改/etc/fstab/boot/grub2/grub.cfg/etc/default/grub /boot/grub2/grubenv

sed -i 's/cl-root/vg_sys-lv_root/g' /etc/fstab
sed -i 's/cl-root/vg_sys-lv_root/g' /boot/grub2/grub.cfg
sed -i 's/cl\/root/vg_sys\/lv_root/g' /boot/grub2/grub.cfg
sed -i 's/cl-root/vg_sys-lv_root/g' /etc/default/grub
sed -i 's/cl\/root/vg_sys\/lv_root/g' /etc/default/grub
sed -i 's/cl-root/vg_sys-lv_root/g' /boot/grub2/grubenv
sed -i 's/cl\/root/vg_sys\/lv_root/g' /boot/grub2/grubenv

确保所有四个文件都已正确修改。 操作系统重新启动后,它的工作原理与您计划的一样。

【讨论】:

【参考方案2】:

这种烦恼是由于 grub 的错误假设造成的。

如果我运行vgrename centos7 vg_centos7 来更改卷组的名称,那么:

# df -h /
Filesystem                Size  Used Avail Use% Mounted on
/dev/mapper/centos7-root  6.5G  1.3G  5.3G  20% /

# ls /dev/mapper
control  vg_centos7-root  vg_centos7-swap

已安装卷的名称和 /dev/mapper 符号链接不再匹配。在这种情况下,grub2 使用当前挂载的卷的名称 (centos7-root),当它在 /dev/mapper/ 中找不到它时失败(因为它刚刚重命名为 vg_centos-root)。

您可以重新挂载和 chroot 来解决此问题,如下所示:

mount /dev/mapper/vg_centos-root /mnt
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys/ /mnt/sys
mount --bind /run/ /mnt/run
mount --bind /boot/ /mnt/boot

cat << EOF | chroot /mnt
grub-mkconfig --output=/boot/grub/grub.cfg
exit
EOF

umount /mnt/boot
umount /mnt/run
umount /mnt/sys
umount /mnt/proc
umount /mnt/dev
umount /mnt

【讨论】:

【参考方案3】:

我不确定所有步骤对于 centos 是否都是必需的,或者是否需要更多步骤,但我希望以下内容有所帮助。

对于 SLES 12 SP1,我必须在执行 vgrenamelvrename 后修改以下文件:

/etc/default/grub /etc/sysconfig/bootloader /etc/fstab

在 /etc/default/grub 中,我还添加了以下几行:

GRUB_DEVICE=/dev/VGname/LVname GRUB_DEVICE_UUID=e35b6f76-15b7-44ef-8bea-cd2c1ef8a547

之后,您必须使用 grub2-mkconfig 重新制作 grub 配置;但是,如果您正在修改设备路径,则此脚本似乎存在问题。我必须在其中修改一行(对我来说应该是 159 行):

GRUB_DEVICE="`$grub_probe --target=device /`" ||真的

主要区别在于 true 部分。否则,grub2-probe 将抛出一个错误,向上传播到 grub2-mkconfig,因为它会找到当前设备而不是新设备所在的位置。

我不只是运行 grub2-mkconfig,而是运行了 mkinitrd,它通过它和 dracut,它允许内核加载正确的文件系统来启动。

【讨论】:

谢谢,在 Debian 中,同一行在 /usr/sbin/grub-mkconfig 中,并且 /boot 有第二个非常相似的行需要相同的更改。我选择在那里用GRUB_DEVICE=/dev/VGname/LVname 替换它,而不是添加|| true

以上是关于根 VG 上的 vgrename - grub2 问题的主要内容,如果未能解决你的问题,请参考以下文章

Linux在线扩容根分区

CentOS 7.9 LVM卷组改名

Linux扩展根文件系统

CentOS7grub安装

linux 怎么对非lvm根分区dev/sda2 进行扩容

PE,VG,PV,LV概念与结构关系