Мой пример использования: у меня есть шаблон VMWare, который я установил с именем хоста «шаблон». Развернув этот шаблон, я предпочел бы, чтобы vgname не был "template-vg" для всех этих машин. Придерживаясь общей идеи, что vgname относится к имени хоста, у меня есть сценарий установки для шаблона, переименуйте vg с именем хоста. Это также позволяет мне легко убедиться, что я работаю над правильным vg, а не каким-то образом в неправильном сеансе ssh.
flickerfly
Ответы:
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флаг.
17
Ах хорошо. Это имеет смысл. Интересно, если моя версия Sed обрабатывает это по-другому. Кроме того, похоже, что @Diego Souza сделал это без единого комментария в другом комментарии.
flickerfly
2
Я полагаю, что вы имели в виду vgrenameскорее тогда lvrename, и так /boot/grub/grub.cfgкак генерируется из записей в /etc/grub.d, вам нужно будет запустить update-grubпосле переименования, а не редактировать его напрямую.
Эрик Стрипер
Нет, я имел в виду группу томов. Также, возможно, ваш дистрибутив отличается от моего по конфигурации grub.
мерцание
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, а затем перезагрузить снова.
Майкл Ферт,
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 и загрузки. Я также отметил, что завершение работы остановилось из-за сбоя команды 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
Мне не нужно было делать это на 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, когда вы затем увидите сообщения.
Я сделал небольшую модификацию скрипта, чтобы также изменить имя хоста.
#!/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
Ответы:
ПРИМЕЧАНИЕ. Ваш дистрибутив может не рекомендовать редактировать файл /boot/grub/grub.cfg. Если это так, этот сценарий может быть плохой идеей. С другой стороны, вы можете просто запустить grub-mkconfig, чтобы это исправить. Я не тестировал эти дистрибутивы, так что проверь свою ситуацию.
Во-первых, вам нужно знать, что имя группы томов может содержать тире. Если это так, то любое использование ссылки / dev / mapper / должно иметь две черты. В 16.04 по умолчанию к имени добавляется «-vg», так что это следует предположить.
Во-вторых, вы должны знать, что это может привести к тому, что ваша система не будет загружаться, что приведет к необходимости загрузки с загрузочного диска и исправлению неполадок. (иначе: не делай этого в производстве. )
Для фактического переименования используйте
lvrename oldname newname
.После переименования вы должны отредактировать оба
/etc/fstab
и/boot/grub/grub.cfg
обновить использование имени для любой ссылки на ваш корень и, возможно, также на ваши места подкачки.Кроме того, вам нужно запустить эту команду, чтобы обновить initramfs для всех ядер.
Я использую следующий скрипт для обработки этого при развертывании нового шаблона. Опять же, не делайте этого на производстве, если у вас нет высокой устойчивости к простоям.
Если у вас есть какие-либо улучшения этого скрипта, пожалуйста, поделитесь. Я всегда ищу способы улучшить и объяснить различные крайние случаи.
источник
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
не должен редактироваться вручную.Ниже приведен заголовок файла:
источник
Это поймало меня на Ubuntu 18.04.1 LTS - произошел сбой vgrename и загрузки. Я также отметил, что завершение работы остановилось из-за сбоя команды swap (ссылающейся на старое имя vg).
Я переименовал vg обратно в то, что он использовал lvm в приглашение initramfs. Вы еще не сделали vgrename "правильно", как описано выше.
источник
После переименования вы должны отредактировать оба
/etc/fstab
и/boot/grub/grub.cfg
обновить использование имени для любой ссылки на ваш корень и, возможно, также на ваши места подкачки./etc/initramfs-tools/conf.d/resume
тоже нужно.Итак, добавьте этот код:
источник
Вот исправленная версия, исправлена ошибка замены строки в vg, а также распечатаны обновленные файлы.
При использовании этого сценария компьютер может некорректно завершить работу, поскольку он пытается «остановить» сопоставления. В зависимости от вашей конфигурации это может даже показаться, когда машина находится в состоянии загрузки, хотя в действительности она даже не отключается первой.
Полезно удалить «тихий всплеск» из GRUB_CMDLINE_LINUX_DEFAULT, когда вы затем увидите сообщения.
источник
Я сделал небольшую модификацию скрипта, чтобы также изменить имя хоста.
источник
Меню загрузки также нуждалось в редактировании на Ubuntu 18 (и, вероятно, других). Итак - упрощено только изменение имени vg и сохранение тире в имени:
источник