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


20

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


只是好奇:我为什么要这样做?
guntbert '16

2
我的用例是我有一个以主机名“ template”安装的VMWare模板。部署该模板后,我希望所有这些机器的vgname都不是“ template-vg”。坚持vgname与主机名相关的一般想法,我为模板设置脚本,用主机名将vg重命名。这也使我可以轻松地确保自己正在使用正确的vg,而不是以某种方式在错误的ssh会话中工作。
flickerfly '16

Answers:


25

注意:您的发行版可能不鼓励编辑/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

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

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

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


如果您在sed -i没有输入文件的情况下运行,则会出错sed: no input files。删除-i标志。
wjandrea

啊好吧。那讲得通。不知道我的sed版本处理方式是否有所不同。此外,@ Diego Souza似乎在没有其他评论的情况下就将其关闭。
flickerfly

2
我相信您的意思是,vgrename而不是lvrename,并且由于/boot/grub/grub.cfg是从中的条目生成的/etc/grub.d,因此您需要update-grub在重命名后运行,而不是直接对其进行编辑。
埃里克·斯特珀

不,我的意思是音量组。另外,也许您的发行版与我的发行版在grub配置上有所不同。
flickerfly

3
update-grub重启前似乎无法正常运行-失败并显示错误消息/usr/sbin/grub-probe: error: failed to get canonical path of '/dev/mapper/ubuntu--vg-root'。对于/boot/grub/grub.cfg自动生成的系统,也许最安全的选择是手动更新,如此脚本所示,然后重新启动,然后运行update-grub,然后再次重新启动。
Michael Firth'Mar

1

/boot/grub/grub.cfg不应手动编辑文件。

下面是文件头:

"
 DO NOT EDIT THIS FILE

 It is automatically generated by grub-mkconfig using templates
 from /etc/grub.d and settings from /etc/default/grub

BEGIN /etc/grub.d/00_header
"

是的,我的回答有点老了,我的用例不再是问题。我鼓励您贡献您所学的知识,以使其保持最新。您看到的是哪个发行版和版本?
flickerfly

1

这使我无法使用ubuntu 18.04.1 LTS-vgrename并启动失败了。我还注意到,由于交换(引用旧的vg名称)卸载失败,关机停止了。

我将vg重命名为使用initramfs提示符下的lvm。尚未按照上面的说明“正确”重新命名vgrename。


0

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

因此,添加以下代码:

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

我不需要在Ubuntu上执行此操作。'update-initramfs -c -k all'就足够了。您正在使用哪种发行版本显示出这种需求?它没有update-initramfs工具吗?我在运行包含此脚本的脚本后立即进行了重新引导,因此这也可能是导致我获得不同结果的一个因素。
flickerfly

0

这是修订版,修复了vg的字符串替换问题,并且还打印了更新的文件。

#!/bin/bash

# Must be run with root permissions
# sudo will be sufficient
if [ "$(id -u)" -ne 0 ]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

# Ask for new hostname $newhost
read newhostname -p "Enter new hostname: "
#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}')
echo "old vg name: " $vg
echo "new vg name: " $newvg
if [[ ${vg} == *"-"* ]]; then
    # has dashes in current name
    vgrename ${vg} ${newhostname//-}
    vg=${vg//-/--}
    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
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
    sed -i "s/${vg}/${newvg}/g" /etc/initramfs-tools/conf.d/resume
fi

#check files
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

update-initramfs -c -k all

使用此脚本时,计算机尝试“停止”映射时可能无法正确关闭。根据您的配置,这甚至可能看起来好像机器处于启动状态,而实际上它甚至没有先关闭。

在看到消息时,从GRUB_CMDLINE_LINUX_DEFAULT中删除“安静的飞溅”很有帮助。


0

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

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

0

启动菜单还需要在Ubuntu 18(可能还有其他)上进行编辑。因此-简化为仅更改vg名称并保留名称中的破折号:

#!/bin/bash

oldvg="ubu16svr-vg"
oldvgdash="ubu16svr--vg"
newvg="ubusvr-vg"
newvgdash="ubusvr--vg"

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

vgrename ${oldvg} ${newvg}
sed -i "s/${oldvg}/${newvg}/g" /etc/fstab
sed -i "s/${oldvgdash}/${newvgdash}/g" /etc/fstab
sed -i "s/${oldvg}/${newvg}/g" /boot/grub/grub.cfg
sed -i "s/${oldvgdash}/${newvgdash}/g" /boot/grub/grub.cfg
sed -i "s/${oldvg}/${newvg}/g" /boot/grub/menu.lst
sed -i "s/${oldvgdash}/${newvgdash}/g" /boot/grub/menu.lst
sed -i "s/${oldvg}/${newvg}/g" /etc/initramfs-tools/conf.d/resume
sed -i "s/${oldvgdash}/${newvgdash}/g" /etc/initramfs-tools/conf.d/resume
update-initramfs -c -k all
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.