Я хочу переименовать группу томов, в которой находится мой корневой том. Как я могу это сделать?
Я хочу переименовать группу томов, в которой находится мой корневой том. Как я могу это сделать?
Ответы:
ПРИМЕЧАНИЕ. Ваш дистрибутив может не рекомендовать редактировать файл /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
"
Это поймало меня на Ubuntu 18.04.1 LTS - произошел сбой vgrename и загрузки. Я также отметил, что завершение работы остановилось из-за сбоя команды swap (ссылающейся на старое имя vg).
Я переименовал vg обратно в то, что он использовал lvm в приглашение initramfs. Вы еще не сделали vgrename "правильно", как описано выше.
После переименования вы должны отредактировать оба /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