Як перейменувати групу томів, яка містить кореневий об'єм у LVM?


20

Я хочу перейменувати групу томів, на якій знаходиться мій кореневий том. Як я можу це зробити?


Просто цікаво: навіщо я хотів би це зробити?
guntbert

2
Мій випадок використання полягає в тому, що у мене є шаблон VMWare, який я встановив з ім'ям хоста "шаблон". Після розгортання цього шаблону я вважаю за краще, щоб vgname не був "template-vg" для всіх цих машин. Дотримуючись загальної думки, що vgname пов'язане з ім'ям хоста, у мене є сценарій настройки шаблону, який перейменовує vg в ім'я хоста. Це також дозволяє мені легко запевнити, що я працюю над правильним vg, а не в неправильному сеансі ssh.
мерехтіння

Відповіді:


25

ПРИМІТКА. Ваш дистрибутив може перешкодити редагуванню /boot/grub/grub.cfg. Якщо це так, цей сценарій може бути поганою ідеєю. Крім того, ви можете просто запустити grub-mkconfig, щоб виправити це. Я не тестував на цих дистрибутивах, тому перевірте свою ситуацію.

По-перше, вам потрібно знати, що ім'я групи томів може мати тире в ньому. Якщо це так, будь-яке використання / dev / mapper / reference має мати дві тире. У 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 зняв його без sed повністю в іншому коментарі.
мерехтіння

2
Я вважаю, що ви мали на увазі vgrenameскоріше lvrename, і оскільки /boot/grub/grub.cfgвін створений на основі записів /etc/grub.d, вам потрібно буде запустити update-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
"

Так, моя відповідь старіє, і моє використання для цього вже не вдається. Я б закликав вас внести все, що ви навчитесь, щоб оновити його. На якому дистрибутиві та версії ви бачите це?
мерехтіння

1

Це застало мене на ubuntu 18.04.1 LTS - не вдалося вгреме і завантаження. Я також зазначив, що вимкнення зупинилося через те, що не вдалося змінити своп (посилання на старе ім'я vg).

Я перейменував vg назад на те, що він використовує lvm, у запит initramfs. Ще не зробили повторно 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 все' було достатньо. Який дистрибутив ви використовуєте, що показав цю потребу? У нього немає інструменту update-initramfs? Я перезавантажуюсь відразу після запуску сценарію, який включає це, так що також може бути фактором моїх різних результатів.
мерехтіння

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.