Je veux renommer le groupe de volumes sur lequel se trouve mon volume racine. Comment puis-je faire ceci?
Je veux renommer le groupe de volumes sur lequel se trouve mon volume racine. Comment puis-je faire ceci?
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.
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.
sed -i
sans fichier d'entrée, il génère des erreurs sed: no input files
. Retirez le -i
drapeau.
vgrename
plutôt lvrename
, et comme il /boot/grub/grub.cfg
est généré à partir d'entrées /etc/grub.d
, vous devrez exécuter update-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écuter update-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:
"
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
"
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/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:
sed -i "s/${vg}/${newvg}/g" /etc/initramfs-tools/conf.d/resume
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