¿Cómo se cambia el nombre del grupo de volúmenes que contiene el volumen raíz en LVM?

20

Quiero cambiar el nombre del grupo de volúmenes en el que está mi volumen raíz. ¿Cómo puedo hacer esto?

flickerfly
fuente
Solo curiosidad: ¿Por qué querría hacer esto?
guntbert
2
Mi caso de uso es que tengo una plantilla VMWare que instalé con el nombre de host "plantilla". Una vez que implemente esa plantilla, prefiero que el vgname no sea "template-vg" para todas esas máquinas. Siguiendo con la idea general de que el vgname está relacionado con el nombre de host, tengo mi script de configuración para la plantilla cambiar el nombre de vg con el nombre de host. También me permite asegurar fácilmente que estoy trabajando en el vg correcto y no en la sesión ssh incorrecta de alguna manera.
flickerfly

Respuestas:

25

NOTA: Su distribución puede desalentar la edición /boot/grub/grub.cfg. Si ese es el caso, este script puede ser una mala idea. Alternativamente, es posible que pueda ejecutar grub-mkconfig para solucionarlo. No he probado en esas distribuciones, así que verifica tu situación.

Primero, debe saber que el nombre del grupo de volúmenes puede tener un guión. Si lo hace, cualquier uso de / dev / mapper / reference deberá tener dos guiones. En 16.04, el valor predeterminado es tener un "-vg" agregado al nombre, por lo que esto debe suponerse.

En segundo lugar, debe saber que estropear esto puede hacer que su sistema no se pueda iniciar y provocar que tenga que arrancar desde un disco de rescate y arreglar cosas que causen tiempo de inactividad. (también conocido como: No hagas esto en producción ) .

Para hacer el cambio de nombre real use lvrename oldname newname.

Después de cambiar el nombre, debe editar ambos /etc/fstaby /boot/grub/grub.cfgactualizar el uso del nombre para cualquier referencia a su raíz y probablemente también a sus ubicaciones de intercambio.

Además, debe ejecutar este comando para actualizar initramfs para todos los núcleos.

update-initramfs -c -k all

Utilizo el siguiente script para manejar esto al implementar una nueva plantilla. Nuevamente, no haga esto en producción a menos que tenga una alta tolerancia al tiempo de inactividad.

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

Si tiene alguna mejora de este script, por favor comparta. Siempre estoy buscando formas de mejorar y dar cuenta de varios casos extremos.

flickerfly
fuente
Si ejecuta sed -isin un archivo de entrada, se produce un error sed: no input files. Quitar la -ibandera.
wjandrea
Ah bien. Eso tiene sentido. Me pregunto si mi versión de sed manejó eso de manera diferente. Además, parece que @Diego Souza lo logró sin sed completamente en otro comentario.
flickerfly
2
Creo que te referías a vgrenameeso lvrename, y dado que /boot/grub/grub.cfgse genera a partir de las entradas /etc/grub.d, deberás ejecutarlo update-grubdespués de cambiarle el nombre en lugar de editarlo directamente.
Eric Streeper
No, me refería al grupo de volumen. Además, quizás su distribución difiera de la mía en la configuración de grub.
flickerfly
3
Parece que update-grubno puede ejecutarse correctamente antes del reinicio, falla con un error de /usr/sbin/grub-probe: error: failed to get canonical path of '/dev/mapper/ubuntu--vg-root'para mí. Para los sistemas donde /boot/grub/grub.cfgse genera automáticamente, quizás la opción más segura es actualizar manualmente, como en este script, luego reiniciar, luego ejecutar update-gruby luego reiniciar nuevamente.
Michael Firth
1

El archivo /boot/grub/grub.cfgno debe editarse manualmente.

Hay un encabezado de archivo a continuación:

"
 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
"
Tomasz Dobrzycki
fuente
Sí, mi respuesta se está volviendo un poco vieja y mi caso de uso para esto ya no está en juego. Te animo a que contribuyas con todo lo que aprendas para actualizarlo. ¿En qué distribución y versión estás viendo esto?
flickerfly
1

Esto me sorprendió en ubuntu 18.04.1 LTS: ¿fallaron el vgrename y el arranque? También noté que el apagado se detuvo porque el intercambio (haciendo referencia al antiguo nombre vg) umount falló.

Cambié el nombre del vg a lo que estaba usando lvm en el indicador initramfs. No he vuelto a hacer el vgrename todavía "correctamente" según las instrucciones anteriores.

Neil
fuente
0

Después de cambiar el nombre, debe editar ambos /etc/fstaby /boot/grub/grub.cfgactualizar el uso del nombre para cualquier referencia a su raíz y probablemente también a sus ubicaciones de intercambio. /etc/initramfs-tools/conf.d/resumees necesario también

Entonces, agregue este código:

sed -i "s/${vg}/${newvg}/g" /etc/initramfs-tools/conf.d/resume
MiX YuG
fuente
No tuve que hacer esto en Ubuntu. 'update-initramfs -c -k all' fue suficiente. ¿Qué distribución estás usando que mostró esta necesidad? ¿No tiene la herramienta update-initramfs? Reinicio inmediatamente después de ejecutar el script que incluye esto, por lo que también puede ser un factor en mis diferentes resultados.
flickerfly
0

Aquí hay una versión revisada, corrige el reemplazo de cadenas de vg y también imprime archivos actualizados.

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

Al usar este script, la máquina puede no apagarse correctamente ya que intenta "detener" las asignaciones. Dependiendo de su configuración, esto puede parecer incluso que la máquina está en un estado de arranque, mientras que en realidad ni siquiera se apaga primero.

Es útil eliminar "splash silencioso" de GRUB_CMDLINE_LINUX_DEFAULT cuando vea los mensajes.

Diego Souza
fuente
0

Hice una pequeña modificación en el script para cambiar también el nombre de host.

#!/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
Pedro R. Sánchez A.
fuente
0

El menú de arranque también necesitaba edición en Ubuntu 18 (y probablemente en otros). Entonces, simplificado para cambiar solo un nombre vg y preservar el uso de un guión en el nombre:

#!/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
Larry R. Irwin
fuente