Mój przypadek użycia polega na tym, że mam szablon VMWare, który zainstalowałem z nazwą hosta „szablon”. Po wdrożeniu tego szablonu wolałbym, aby vgname nie był „szablon-vg” dla wszystkich tych maszyn. Trzymając się ogólnej idei, że vgname jest związana z nazwą hosta, mam swój skrypt instalacyjny dla szablonu zmieniający nazwę vg na nazwę hosta. Pozwala mi to również z łatwością upewnić się, że pracuję nad poprawnym vg, a nie w jakiś sposób w złej sesji ssh.
flickerfly
Odpowiedzi:
25
UWAGA: Twoja dystrybucja może zniechęcać do edycji /boot/grub/grub.cfg. W takim przypadku ten skrypt może być złym pomysłem. Alternatywnie możesz po prostu uruchomić grub-mkconfig, aby to naprawić. Nie testowałem tych dystrybucji, więc sprawdź swoją sytuację.
Po pierwsze, musisz wiedzieć, że nazwa grupy woluminów może zawierać myślnik. Jeśli tak, to każde użycie / dev / mapper / reference będzie wymagało dwóch myślników. W 16.04 domyślnie do nazwy dołączone jest „-vg”, więc należy to założyć.
Po drugie, powinieneś wiedzieć, że zepsucie się tego może spowodować, że twój system nie będzie się uruchamiał i spowoduje konieczność uruchomienia z dysku ratunkowego i naprawienia rzeczy powodujących przestoje. (aka: Nie rób tego podczas produkcji. )
Aby dokonać rzeczywistej zmiany nazwy, użyj lvrename oldname newname.
Po zmianie nazwy musisz dokonać edycji zarówno, jak /etc/fstabi /boot/grub/grub.cfgzaktualizować użycie nazwy w odniesieniu do dowolnego katalogu głównego i prawdopodobnie także lokalizacji wymiany.
Dodatkowo musisz uruchomić to polecenie, aby zaktualizować initramfs dla wszystkich jąder.
update-initramfs -c -k all
Używam następującego skryptu, aby obsłużyć to podczas wdrażania nowego szablonu. Ponownie, nie rób tego w produkcji, chyba że masz wysoką tolerancję na przestoje.
#!/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
Jeśli masz jakieś ulepszenia tego skryptu, udostępnij. Zawsze szukam sposobów na ulepszenie i uwzględnienie różnych przypadków krawędzi.
Jeśli uruchomisz sed -ibez pliku wejściowego, błąd sed: no input files. Usuń -iflagę.
wjandrea,
Ah, dobrze. To ma sens. Zastanawiam się, czy moja wersja sed radziła sobie z tym inaczej. Wygląda też na to, że @Diego Souza ściągnął go bez sed całkowicie w innym komentarzu.
flickerfly
2
Uważam, że miałeś na myśli vgrenameraczej to lvrename, a ponieważ /boot/grub/grub.cfgjest generowany z wpisów w /etc/grub.d, będziesz musiał uruchomić update-grubpo zmianie nazwy, a nie bezpośrednio edytować.
Eric Streeper
Nie, miałem na myśli grupę woluminów. Być może twoja dystrybucja różni się od mojej w konfiguracji grub.
flickerfly
3
Wygląda na to, że update-grubnie może działać poprawnie przed ponownym uruchomieniem - kończy się niepowodzeniem z błędem /usr/sbin/grub-probe: error: failed to get canonical path of '/dev/mapper/ubuntu--vg-root'dla mnie. W przypadku systemów, w których /boot/grub/grub.cfgjest generowany automatycznie, być może najbezpieczniejszą opcją jest ręczna aktualizacja, tak jak w tym skrypcie, a następnie ponowne uruchomienie, uruchomienie update-grub, a następnie ponowne uruchomienie.
Michael Firth
1
Plik /boot/grub/grub.cfgnie powinien być edytowany ręcznie.
Poniżej znajduje się nagłówek pliku:
"
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
"
Tak, moja odpowiedź jest już trochę stara i mój przypadek użycia nie jest już taki. Zachęcam do przekazywania wszystkiego, czego nauczysz się, aby aktualizować. W jakiej dystrybucji i wersji to widzisz?
flickerfly
1
To mnie przyłapało na Ubuntu 18.04.1 LTS - czy vgrename i boot nie powiodły się. Zauważyłem również, że zamknięcie zostało zablokowane, ponieważ nie powiodło się zamiana (odwołując się do starej nazwy vg).
Zmieniłem nazwę vg z powrotem na to, czego używał lvm, na monit initramfs. Nie wykonałem jeszcze vgrename „poprawnie” zgodnie z powyższymi instrukcjami.
Po zmianie nazwy musisz dokonać edycji zarówno, jak /etc/fstabi /boot/grub/grub.cfgzaktualizować użycie nazwy w odniesieniu do dowolnego katalogu głównego i prawdopodobnie także lokalizacji wymiany. /etc/initramfs-tools/conf.d/resumejest również potrzebny.
Dodaj ten kod:
sed -i "s/${vg}/${newvg}/g" /etc/initramfs-tools/conf.d/resume
Nie musiałem tego robić na Ubuntu. „update-initramfs -c -k all” było wystarczające. Jakiej dystrybucji używasz, która pokazuje tę potrzebę? Czy nie ma narzędzia update-initramfs? Ponownie uruchamiam ponownie po uruchomieniu skryptu, który to zawiera, więc może to mieć również wpływ na moje różne wyniki.
flickerfly
0
Oto poprawiona wersja, poprawiono zamianę ciągów znaków vg, a także wydrukowano zaktualizowane pliki.
#!/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
Podczas korzystania z tego skryptu maszyna może nie zostać poprawnie zamknięta, ponieważ próbuje „zatrzymać” odwzorowania. W zależności od konfiguracji może się to wydawać nawet, gdy maszyna jest w stanie rozruchu, podczas gdy w rzeczywistości nie jest nawet najpierw zamykana.
Pomocne jest usunięcie „cichego powitania” z GRUB_CMDLINE_LINUX_DEFAULT, gdy zobaczysz wiadomości.
Zrobiłem małą modyfikację skryptu, aby zmienić także nazwę hosta.
#!/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
Menu rozruchu wymagało również edycji na Ubuntu 18 (i prawdopodobnie innych). Tak więc - uproszczony do zmiany tylko nazwy vg i zachowania użycia myślnika w nazwie:
#!/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
Odpowiedzi:
UWAGA: Twoja dystrybucja może zniechęcać do edycji /boot/grub/grub.cfg. W takim przypadku ten skrypt może być złym pomysłem. Alternatywnie możesz po prostu uruchomić grub-mkconfig, aby to naprawić. Nie testowałem tych dystrybucji, więc sprawdź swoją sytuację.
Po pierwsze, musisz wiedzieć, że nazwa grupy woluminów może zawierać myślnik. Jeśli tak, to każde użycie / dev / mapper / reference będzie wymagało dwóch myślników. W 16.04 domyślnie do nazwy dołączone jest „-vg”, więc należy to założyć.
Po drugie, powinieneś wiedzieć, że zepsucie się tego może spowodować, że twój system nie będzie się uruchamiał i spowoduje konieczność uruchomienia z dysku ratunkowego i naprawienia rzeczy powodujących przestoje. (aka: Nie rób tego podczas produkcji. )
Aby dokonać rzeczywistej zmiany nazwy, użyj
lvrename oldname newname
.Po zmianie nazwy musisz dokonać edycji zarówno, jak
/etc/fstab
i/boot/grub/grub.cfg
zaktualizować użycie nazwy w odniesieniu do dowolnego katalogu głównego i prawdopodobnie także lokalizacji wymiany.Dodatkowo musisz uruchomić to polecenie, aby zaktualizować initramfs dla wszystkich jąder.
Używam następującego skryptu, aby obsłużyć to podczas wdrażania nowego szablonu. Ponownie, nie rób tego w produkcji, chyba że masz wysoką tolerancję na przestoje.
Jeśli masz jakieś ulepszenia tego skryptu, udostępnij. Zawsze szukam sposobów na ulepszenie i uwzględnienie różnych przypadków krawędzi.
źródło
sed -i
bez pliku wejściowego, błądsed: no input files
. Usuń-i
flagę.vgrename
raczej tolvrename
, a ponieważ/boot/grub/grub.cfg
jest generowany z wpisów w/etc/grub.d
, będziesz musiał uruchomićupdate-grub
po zmianie nazwy, a nie bezpośrednio edytować.update-grub
nie może działać poprawnie przed ponownym uruchomieniem - kończy się niepowodzeniem z błędem/usr/sbin/grub-probe: error: failed to get canonical path of '/dev/mapper/ubuntu--vg-root'
dla mnie. W przypadku systemów, w których/boot/grub/grub.cfg
jest generowany automatycznie, być może najbezpieczniejszą opcją jest ręczna aktualizacja, tak jak w tym skrypcie, a następnie ponowne uruchomienie, uruchomienieupdate-grub
, a następnie ponowne uruchomienie.Plik
/boot/grub/grub.cfg
nie powinien być edytowany ręcznie.Poniżej znajduje się nagłówek pliku:
źródło
To mnie przyłapało na Ubuntu 18.04.1 LTS - czy vgrename i boot nie powiodły się. Zauważyłem również, że zamknięcie zostało zablokowane, ponieważ nie powiodło się zamiana (odwołując się do starej nazwy vg).
Zmieniłem nazwę vg z powrotem na to, czego używał lvm, na monit initramfs. Nie wykonałem jeszcze vgrename „poprawnie” zgodnie z powyższymi instrukcjami.
źródło
Po zmianie nazwy musisz dokonać edycji zarówno, jak
/etc/fstab
i/boot/grub/grub.cfg
zaktualizować użycie nazwy w odniesieniu do dowolnego katalogu głównego i prawdopodobnie także lokalizacji wymiany./etc/initramfs-tools/conf.d/resume
jest również potrzebny.Dodaj ten kod:
źródło
Oto poprawiona wersja, poprawiono zamianę ciągów znaków vg, a także wydrukowano zaktualizowane pliki.
Podczas korzystania z tego skryptu maszyna może nie zostać poprawnie zamknięta, ponieważ próbuje „zatrzymać” odwzorowania. W zależności od konfiguracji może się to wydawać nawet, gdy maszyna jest w stanie rozruchu, podczas gdy w rzeczywistości nie jest nawet najpierw zamykana.
Pomocne jest usunięcie „cichego powitania” z GRUB_CMDLINE_LINUX_DEFAULT, gdy zobaczysz wiadomości.
źródło
Zrobiłem małą modyfikację skryptu, aby zmienić także nazwę hosta.
źródło
Menu rozruchu wymagało również edycji na Ubuntu 18 (i prawdopodobnie innych). Tak więc - uproszczony do zmiany tylko nazwy vg i zachowania użycia myślnika w nazwie:
źródło