Comment renommer le groupe de volumes qui contient le volume racine dans LVM?

20

Je veux renommer le groupe de volumes sur lequel se trouve mon volume racine. Comment puis-je faire ceci?

flickerfly
la source
Juste curieux: pourquoi voudrais-je faire ça?
guntbert
2
Mon cas d'utilisation est que j'ai un modèle VMWare que j'ai installé avec le nom d'hôte "modèle". Une fois que j'ai déployé ce modèle, je préfère que le vgname ne soit pas "template-vg" pour toutes ces machines. S'en tenir à l'idée générale que le vgname est lié au nom d'hôte, j'ai mon script de configuration pour le modèle renommer le vg avec le nom d'hôte. Cela me permet également de garantir facilement que je travaille sur le bon vg et non sur la mauvaise session ssh.
flickerfly

Réponses:

25

REMARQUE: votre distribution peut décourager la modification de /boot/grub/grub.cfg. Si tel est le cas, ce script peut être une mauvaise idée. Alternativement, vous pouvez simplement exécuter grub-mkconfig pour résoudre ce problème. Je n'ai pas testé ces distributions, alors vérifiez votre situation.

Tout d'abord, vous devez savoir que le nom du groupe de volumes peut contenir un tiret. Si c'est le cas, toute utilisation de / dev / mapper / reference devra avoir deux tirets. En 16.04, par défaut, un "-vg" est ajouté au nom, donc cela devrait être supposé.

Deuxièmement, vous devez savoir que tout gâcher peut rendre votre système impossible à démarrer et entraîner le démarrage à partir d'un disque de secours et la correction de problèmes entraînant des temps d'arrêt. (aka: Ne faites pas cela en production. )

Pour faire le changement de nom réel, utilisez lvrename oldname newname.

Après avoir renommé, vous devez modifier les deux /etc/fstabet /boot/grub/grub.cfgmettre à jour l'utilisation du nom pour toute référence à votre racine et probablement aussi vos emplacements de swap.

De plus, vous devez exécuter cette commande pour mettre à jour les initramfs pour tous les noyaux.

update-initramfs -c -k all

J'utilise le script suivant pour gérer cela lors du déploiement d'un nouveau modèle. Encore une fois, ne le faites pas en production, sauf si vous avez une tolérance élevée aux temps d'arrêt.

#!/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 vous avez des améliorations de ce script, veuillez partager. Je suis toujours à la recherche de moyens d'améliorer et de prendre en compte divers cas de bord.

flickerfly
la source
Si vous exécutez sed -isans fichier d'entrée, il génère des erreurs sed: no input files. Retirez le -idrapeau.
wjandrea
Ah ok. Ça a du sens. Je me demande si ma version de sed a géré cela différemment. En outre, il semble que @Diego Souza ait réussi sans séduire dans un autre commentaire.
flickerfly
2
Je pense que vous vouliez vgrenameplutôt lvrename, et comme il /boot/grub/grub.cfgest généré à partir d'entrées /etc/grub.d, vous devrez exécuter update-grubaprès avoir renommé plutôt que de le modifier directement.
Eric Streeper
Non, je voulais dire groupe de volumes. De plus, votre distribution diffère peut-être de la mienne dans la configuration grub.
flickerfly le
3
Il semble que update-grubcela ne puisse pas fonctionner correctement avant le redémarrage - il échoue avec une erreur de /usr/sbin/grub-probe: error: failed to get canonical path of '/dev/mapper/ubuntu--vg-root'pour moi. Pour les systèmes où /boot/grub/grub.cfgest généré automatiquement, l'option la plus sûre est peut-être de mettre à jour manuellement, comme dans ce script, puis de redémarrer, puis d'exécuter update-grub, puis de redémarrer à nouveau.
Michael Firth
1

Le fichier /boot/grub/grub.cfgne doit pas être modifié manuellement.

Il y a un en-tête de fichier ci-dessous:

"
 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
la source
Oui, ma réponse vieillit un peu et mon cas d'utilisation n'est plus d'actualité. Je vous encourage à contribuer à tout ce que vous apprenez pour le mettre à jour. Sur quelle distribution et version voyez-vous cela?
flickerfly
1

Cela m'a rattrapé sur ubuntu 18.04.1 LTS - le nom de vgr et le démarrage ont-ils échoué. J'ai également noté que l'arrêt était bloqué car le swap (faisant référence à l'ancien nom de vg) umount avait échoué.

J'ai renommé le vg en ce qu'il utilisait lvm à l'invite initramfs. N'ont pas encore refait le vgrename "correctement" selon les instructions ci-dessus.

Neil
la source
0

Après avoir renommé, vous devez modifier les deux /etc/fstabet /boot/grub/grub.cfgmettre à jour l'utilisation du nom pour toute référence à votre racine et probablement aussi vos emplacements de swap. /etc/initramfs-tools/conf.d/resumeest également nécessaire.

Alors, ajoutez ce code:

sed -i "s/${vg}/${newvg}/g" /etc/initramfs-tools/conf.d/resume
MiX YuG
la source
Je n'avais pas besoin de faire ça sur Ubuntu. 'update-initramfs -c -k all' était suffisant. Quelle distribution utilisez-vous qui a montré ce besoin? N'a-t-il pas l'outil update-initramfs? Je fais un redémarrage immédiatement après avoir exécuté le script qui inclut cela, ce qui peut également être un facteur dans mes différents résultats.
flickerfly
0

Voici une version révisée, corrige le remplacement des chaînes de vg et imprime également les fichiers mis à jour.

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

Lors de l'utilisation de ce script, la machine peut ne pas s'arrêter correctement car elle tente «d'arrêter» les mappages. Selon votre configuration, cela peut même sembler car la machine est dans un état de démarrage alors qu'en réalité, elle n'est même pas arrêtée en premier.

Il est utile de supprimer les "éclaboussures silencieuses" de GRUB_CMDLINE_LINUX_DEFAULT lorsque vous voyez alors les messages.

Diego Souza
la source
0

J'ai fait une petite modification sur le script pour changer également le nom d'hôte.

#!/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.
la source
0

Le menu de démarrage devait également être modifié sur Ubuntu 18 (et probablement d'autres). Donc - simplifié pour ne changer qu'un nom de vg et conserver l'utilisation d'un tiret dans le nom:

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