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

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

我想重命名根卷所在的卷组。我该怎么做?

答案1

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

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

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

要对卷组进行实际重命名,请使用vgrename oldname newname

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

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

update-initramfs -c -k all

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

#!/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

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

答案2

还有一种替代方法,不需要担心改变(和搞乱)启动过程。

重命名卷组时,UUID逻辑卷的不会改变。

/etc/fstab如果您首先使用其 UUID指定所有挂载(如/dev/disk/by-uuid/UUID),则可以安全地重命名卷组。

要获取磁盘的 UUID,您可以检查的输出lsblk -o name,uuid,mountpoint,size

答案3

重命名后,您必须编辑/etc/fstab/boot/grub/grub.cfg更新名称的使用,以便引用您的根目录以及可能还有您的交换位置。/etc/initramfs-tools/conf.d/resume这也是必要的。

因此,添加以下代码:

sed -i "s/${vg}/${newvg}/g" /etc/initramfs-tools/conf.d/resume

答案4

我对脚本做了一些修改,也更改了主机名。

#!/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`

# ${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}'`
echo
echo "old hostname          : " $oldhostname
echo "old vg name           : " $vg
echo "new hostname / vg name: " $newvg

echo
echo "Changing LVM names..."
vgrename ${vg} ${newvg}
if [[ ${vg} == *"-"* ]]; then
    #has dashes in current name
    vg=`echo $vg|sed "s/-/--/g"`
fi
sed -i "s/${vg}/${newvg}/g" /etc/fstab
sed -i "s/${vg}/${newvg}/g" /boot/grub/grub.cfg
sed -i "s/${vg}/${newvg}/g" /etc/initramfs-tools/conf.d/resume

echo
echo "Changing Hostname..."
sed -i "s/${oldhostname}/${newvg}/g" /etc/hostname
sed -i "s/${oldhostname}/${newvg}/g" /etc/hosts

#check files
echo
echo fstab update:
grep ${newvg} /etc/fstab

echo grub.cfg update:
grep ${newvg} /boot/grub/grub.cfg

echo resume update:
grep ${newvg} /etc/initramfs-tools/conf.d/resume

echo hostname update:
grep ${newvg} /etc/hostname

echo hosts update:
grep ${newvg} /etc/hosts

update-initramfs -c -k all

相关内容