Quiero cambiar el nombre del grupo de volúmenes en el que está mi volumen raíz. ¿Cómo puedo hacer esto?
Quiero cambiar el nombre del grupo de volúmenes en el que está mi volumen raíz. ¿Cómo puedo hacer esto?
Respuestas:
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/fstab
y /boot/grub/grub.cfg
actualizar 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.
sed -i
sin un archivo de entrada, se produce un error sed: no input files
. Quitar la -i
bandera.
vgrename
eso lvrename
, y dado que /boot/grub/grub.cfg
se genera a partir de las entradas /etc/grub.d
, deberás ejecutarlo update-grub
después de cambiarle el nombre en lugar de editarlo directamente.
update-grub
no 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.cfg
se genera automáticamente, quizás la opción más segura es actualizar manualmente, como en este script, luego reiniciar, luego ejecutar update-grub
y luego reiniciar nuevamente.
El archivo /boot/grub/grub.cfg
no 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
"
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.
Después de cambiar el nombre, debe editar ambos /etc/fstab
y /boot/grub/grub.cfg
actualizar 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/resume
es necesario también
Entonces, agregue este código:
sed -i "s/${vg}/${newvg}/g" /etc/initramfs-tools/conf.d/resume
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.
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
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