我想重命名我的根卷所在的卷组。我怎样才能做到这一点?
我想重命名我的根卷所在的卷组。我怎样才能做到这一点?
Answers:
注意:您的发行版可能不鼓励编辑/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
标志。
vgrename
而不是lvrename
,并且由于/boot/grub/grub.cfg
是从中的条目生成的/etc/grub.d
,因此您需要update-grub
在重命名后运行,而不是直接对其进行编辑。
update-grub
重启前似乎无法正常运行-失败并显示错误消息/usr/sbin/grub-probe: error: failed to get canonical path of '/dev/mapper/ubuntu--vg-root'
。对于/boot/grub/grub.cfg
自动生成的系统,也许最安全的选择是手动更新,如此脚本所示,然后重新启动,然后运行update-grub
,然后再次重新启动。
/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
"
重命名后,您必须同时编辑/etc/fstab
和/boot/grub/grub.cfg
更新名称的使用,以引用您的根目录以及可能的交换位置。/etc/initramfs-tools/conf.d/resume
也需要。
因此,添加以下代码:
sed -i "s/${vg}/${newvg}/g" /etc/initramfs-tools/conf.d/resume
这是修订版,修复了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中删除“安静的飞溅”很有帮助。
我对脚本做了一些修改,以更改主机名。
#!/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
启动菜单还需要在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