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.
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
"
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.
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
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.
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
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
Réponses:
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/fstab
et/boot/grub/grub.cfg
mettre à 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.
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.
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.
la source
sed -i
sans fichier d'entrée, il génère des erreurssed: no input files
. Retirez le-i
drapeau.vgrename
plutôtlvrename
, et comme il/boot/grub/grub.cfg
est généré à partir d'entrées/etc/grub.d
, vous devrez exécuterupdate-grub
après avoir renommé plutôt que de le modifier directement.update-grub
cela 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.cfg
est 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écuterupdate-grub
, puis de redémarrer à nouveau.Le fichier
/boot/grub/grub.cfg
ne doit pas être modifié manuellement.Il y a un en-tête de fichier ci-dessous:
la source
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.
la source
Après avoir renommé, vous devez modifier les deux
/etc/fstab
et/boot/grub/grub.cfg
mettre à jour l'utilisation du nom pour toute référence à votre racine et probablement aussi vos emplacements de swap./etc/initramfs-tools/conf.d/resume
est également nécessaire.Alors, ajoutez ce code:
la source
Voici une version révisée, corrige le remplacement des chaînes de vg et imprime également les fichiers mis à jour.
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.
la source
J'ai fait une petite modification sur le script pour changer également le nom d'hôte.
la source
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:
la source