我想重命名根卷所在的卷组。我该怎么做?
答案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