Ich möchte die Volume-Gruppe umbenennen, auf der sich mein Root-Volume befindet. Wie kann ich das machen?
Ich möchte die Volume-Gruppe umbenennen, auf der sich mein Root-Volume befindet. Wie kann ich das machen?
Antworten:
HINWEIS: Ihre Distribution kann die Bearbeitung von /boot/grub/grub.cfg verhindern. In diesem Fall ist dieses Skript möglicherweise eine schlechte Idee. Alternativ können Sie möglicherweise auch grub-mkconfig ausführen, um das zu beheben. Ich habe diese Distributionen nicht getestet, also überprüfe deine Situation.
Zunächst müssen Sie wissen, dass der Name der Datenträgergruppe möglicherweise einen Bindestrich enthält. Wenn dies der Fall ist, muss jede Verwendung von / dev / mapper / reference zwei Bindestriche enthalten. In 16.04 wird standardmäßig ein "-vg" an den Namen angehängt, daher sollte dies angenommen werden.
Zweitens sollten Sie wissen, dass ein Durcheinander dieses Problems dazu führen kann, dass Ihr System nicht mehr gestartet werden kann und dass Sie von einer Rettungsdiskette booten und Probleme beheben müssen, die Ausfallzeiten verursachen. (aka: Mach das nicht in der Produktion. )
Verwenden Sie, um die eigentliche Umbenennung durchzuführen lvrename oldname newname
.
Nach dem Umbenennen müssen Sie beide bearbeiten /etc/fstab
und /boot/grub/grub.cfg
die Verwendung des Namens für alle Verweise auf Ihr Stammverzeichnis und möglicherweise auch Ihre Auslagerungsorte aktualisieren.
Darüber hinaus müssen Sie diesen Befehl ausführen, um die initramfs für alle Kernel zu aktualisieren.
update-initramfs -c -k all
Ich verwende das folgende Skript, um dies beim Bereitstellen einer neuen Vorlage zu handhaben. Wiederum sollten Sie dies nicht in der Produktion tun, es sei denn, Sie haben eine hohe Toleranz für Ausfallzeiten.
#!/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
Wenn Sie Verbesserungen an diesem Skript haben, teilen Sie diese bitte mit. Ich bin immer auf der Suche nach Möglichkeiten zur Verbesserung und Berücksichtigung verschiedener Randfälle.
sed -i
ohne Eingabedatei ausführen, tritt ein Fehler auf sed: no input files
. Entfernen Sie die -i
Flagge.
vgrename
eher so lvrename
und da /boot/grub/grub.cfg
es aus Einträgen in generiert /etc/grub.d
wird, müssen Sie es update-grub
nach dem Umbenennen ausführen, anstatt es direkt zu bearbeiten.
update-grub
vor dem Neustart nicht richtig ausgeführt werden kann - es schlägt fehl mit einem Fehler von /usr/sbin/grub-probe: error: failed to get canonical path of '/dev/mapper/ubuntu--vg-root'
für mich. Auf Systemen, auf denen /boot/grub/grub.cfg
automatisch generiert wird, ist es möglicherweise die sicherste Option, die Aktualisierung manuell durchzuführen, wie in diesem Skript beschrieben, und anschließend neu zu starten update-grub
, dann auszuführen und erneut zu starten .
Die Datei /boot/grub/grub.cfg
sollte nicht manuell bearbeitet werden.
Es gibt Dateikopfzeile unten:
"
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
"
Dies hat mich auf Ubuntu 18.04.1 LTS erwischt - der vgrename und der Boot sind fehlgeschlagen. Ich bemerkte auch, dass das Herunterfahren ins Stocken geriet, weil der Swap (der auf den alten vg-Namen verweist) umount fehlgeschlagen ist.
Ich benannte das vg zurück in das, was es mit lvm an der initramfs-Eingabeaufforderung benutzte. Der vname wurde noch nicht "richtig" gemäß den obigen Anweisungen geändert.
Nach dem Umbenennen müssen Sie beide bearbeiten /etc/fstab
und /boot/grub/grub.cfg
die Verwendung des Namens für alle Verweise auf Ihr Stammverzeichnis und möglicherweise auch Ihre Auslagerungsorte aktualisieren. /etc/initramfs-tools/conf.d/resume
wird auch gebraucht.
Also, füge diesen Code hinzu:
sed -i "s/${vg}/${newvg}/g" /etc/initramfs-tools/conf.d/resume
Hier ist eine überarbeitete Version, die das Ersetzen von Zeichenketten von vg behebt und auch aktualisierte Dateien druckt.
#!/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
Bei Verwendung dieses Skripts wird der Computer möglicherweise nicht ordnungsgemäß heruntergefahren, da er versucht, die Zuordnungen zu stoppen. Abhängig von Ihrer Konfiguration kann dies sogar so aussehen, als ob sich die Maschine in einem Boot-Zustand befindet, während sie in Wirklichkeit nicht einmal zuerst heruntergefahren wird.
Es ist hilfreich, "quiet splash" aus GRUB_CMDLINE_LINUX_DEFAULT zu entfernen, wenn Sie dann die Nachrichten sehen.
Ich habe das Skript ein wenig modifiziert, um auch den Hostnamen zu ändern.
#!/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
Das Boot-Menü musste auch auf Ubuntu 18 (und wahrscheinlich anderen) bearbeitet werden. So - vereinfacht, um nur einen vg-Namen zu ändern und die Verwendung eines Bindestrichs im Namen beizubehalten:
#!/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