如何在 LVM 中重命名包含根卷的卷组?

fli*_*fly 23 lvm

我想重命名我的根卷所在的卷组。我怎样才能做到这一点?

fli*_*fly 28

注意:您的发行版可能不鼓励编辑 /boot/grub/grub.cfg。如果是这种情况,这个脚本可能是个坏主意。或者,您可能只能运行 grub-mkconfig 来解决该问题。我还没有在这些发行版上测试过,所以请检查你的情况。

首先,您需要知道卷组名称中可能有一个破折号。如果是这样,那么 /dev/mapper/ 引用的任何使用都需要有两个破折号。在 16.04 中,它默认在名称后附加“-vg”,因此应该假设这一点。

其次,您应该知道将其弄乱可能会导致您的系统无法启动,并导致必须从救援磁盘启动并修复导致停机的内容。(又名:不要在生产中这样做。

要进行实际重命名,请使用lvrename oldname newname.

重命名后,您必须编辑两者/etc/fstab/boot/grub/grub.cfg更新名称的使用,以便对您的根以及可能还有您的交换位置进行任何引用。

此外,您需要运行此命令来更新所有内核的 initramfs。

update-initramfs -c -k all
Run Code Online (Sandbox Code Playgroud)

部署新模板时,我使用以下脚本来处理此问题。同样,除非您对停机时间有很高的容忍度,否则不要在生产中这样做

#!/bin/bash

# Must be run with root permissions 
# sudo will be sufficient

if [ "$(id -u)" != "0" ]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

#Ask for new hostname $newhost
read -p "Enter new hostname: "
newhostname=$REPLY
oldhostname=$(cat /etc/hostname)

echo "Changing LVM names"
# ${var//-} syntax removes all dashes from the name simplifying the 
# requirement to use a double-dash in some places to escape the dash
newvg=${newhostname//-}

# Find the volume group that root is in 
vg=`lvdisplay -C|awk '$1=="root" {print $2}'`
if [[ ${vg} == *"-"* ]]; then
    #has dashes in current name
    vgrename ${vg} ${newhostname//-}
    vg=`echo $vg|sed "s/-/--/g"`
    sed -i "s/${vg}/${newvg}/g" /etc/fstab
    sed -i "s/${vg}/${newvg}/g" /boot/grub/grub.cfg
  else
    #no dashes in current name
    vgrename ${vg} ${newvg}
    sed -i "s/${vg}/${newvg}/g" /etc/fstab
    sed -i "s/${vg}/${newvg}/g" /boot/grub/grub.cfg
fi

update-initramfs -c -k all
Run Code Online (Sandbox Code Playgroud)

如果您对此脚本有任何改进,请分享。我一直在寻找改进和解决各种边缘情况的方法。

  • 似乎`update-grub` 在重新启动之前无法正常运行-它失败并出现错误`/usr/sbin/grub-probe: error: failed to get canonical path of '/dev/mapper/ubuntu-- vg-root'` 对我来说。对于自动生成 `/boot/grub/grub.cfg` 的系统,也许最安全的选择是手动更新,就像在这个脚本中一样,然后重启,然后运行 ​​`update-grub`,然后再次重启。 (3认同)
  • 我相信你的意思是 `vgrename` 而不是 `lvrename`,并且由于 `/boot/grub/grub.cfg` 是从 `/etc/grub.d` 中的条目生成的,你需要在之后运行 `update-grub`重命名而不是直接编辑它。 (2认同)