Come si rinomina il gruppo di volumi che contiene il volume principale in LVM?


20

Voglio rinominare il gruppo di volumi su cui è attivo il mio volume di root. Come posso fare questo?


Solo curioso: perché dovrei voler fare questo?
Guntbert,

2
Il mio caso d'uso è che ho un modello VMWare che ho installato con il nome host "modello". Una volta distribuito quel modello, preferirei che il vgname non fosse "template-vg" per tutte quelle macchine. Attenendosi all'idea generale che vgname sia correlato al nome host, ho il mio script di installazione per il modello che rinomina la vg con il nome host. Mi permette anche di assicurarmi facilmente che sto lavorando sulla vg corretta e non in qualche modo nella sessione ssh sbagliata.
flickerfly,

Risposte:


25

NOTA: la distro potrebbe scoraggiare la modifica di /boot/grub/grub.cfg. In tal caso, questo script potrebbe essere una cattiva idea. In alternativa, potresti essere in grado di eseguire grub-mkconfig per risolvere il problema. Non ho ancora testato su queste distro, quindi controlla la tua situazione.

Innanzitutto, è necessario sapere che il nome del gruppo di volumi potrebbe contenere un trattino. In tal caso, qualsiasi uso del riferimento / dev / mapper / dovrà avere due trattini. In 16.04, per impostazione predefinita viene aggiunto "-vg" al nome, quindi dovrebbe essere assunto.

In secondo luogo, dovresti sapere che rovinare tutto ciò può rendere il tuo sistema non avviabile e comportare l'avvio da un disco di ripristino e la correzione di cose che causano tempi di inattività. (aka: non farlo in produzione. )

Per fare l'attuale ridenominazione usare lvrename oldname newname.

Dopo aver rinominato è necessario modificare entrambi /etc/fstabe /boot/grub/grub.cfgper aggiornare l'uso del nome per qualsiasi riferimento alla propria radice e probabilmente anche alle posizioni di scambio.

Inoltre, è necessario eseguire questo comando per aggiornare initramfs per tutti i kernel.

update-initramfs -c -k all

Uso il seguente script per gestire questo quando si distribuisce un nuovo modello. Ancora una volta, non farlo in produzione a meno che non si abbia un'alta tolleranza per i tempi di fermo.

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

Se hai qualche miglioramento di questo script, ti preghiamo di condividere. Sono sempre alla ricerca di modi per migliorare e tenere conto di vari casi limite.


Se si esegue sed -isenza un file di input, si verificano errori sed: no input files. Rimuovi la -ibandiera.
wjandrea,

Ah ok. Ha senso. Mi chiedo se la mia versione di sed sia stata gestita in modo diverso. Inoltre, sembra che @Diego Souza l'abbia fatto senza sed completamente in un altro commento.
flickerfly,

2
Credo che intendevi vgrenamepiuttosto allora lvrename, e poiché /boot/grub/grub.cfgè generato dalle voci in /etc/grub.d, dovrai eseguire update-grubdopo la ridenominazione anziché modificarlo direttamente.
Eric Streeper,

No, intendevo gruppo di volumi. Inoltre, forse la tua distro differisce dalla mia nella configurazione di grub.
flickerfly,

3
Sembra che update-grubnon possa funzionare correttamente prima del riavvio - fallisce con un errore di /usr/sbin/grub-probe: error: failed to get canonical path of '/dev/mapper/ubuntu--vg-root'per me. Per i sistemi in cui /boot/grub/grub.cfgviene generato automaticamente, forse l'opzione più sicura è l'aggiornamento manuale, come in questo script, quindi riavviare, quindi eseguire update-grub, quindi riavviare nuovamente.
Michael Firth,

1

Il file /boot/grub/grub.cfgnon deve essere modificato manualmente.

Di seguito è riportata l'intestazione del file:

"
 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
"

Sì, la mia risposta sta diventando un po 'vecchia e il mio caso d'uso per questo non è più a posto. Ti incoraggio a contribuire con tutto ciò che impari per aggiornarlo. In quale distribuzione e versione stai vedendo questo?
flickerfly,

1

Questo mi ha sorpreso su Ubuntu 18.04.1 LTS - ha fatto il vgrename e l'avvio fallito. Ho anche notato che l'arresto si è arrestato perché lo scambio (riferendosi al vecchio nome vg) umount non è riuscito.

Ho rinominato il vg in quello che stava usando lvm al prompt di initramfs. Non ho ancora rifatto il vgrename ancora "correttamente" secondo le istruzioni sopra.


0

Dopo aver rinominato è necessario modificare entrambi /etc/fstabe /boot/grub/grub.cfgper aggiornare l'uso del nome per qualsiasi riferimento alla propria radice e probabilmente anche alle posizioni di scambio. /etc/initramfs-tools/conf.d/resumeè necessario anche.

Quindi, aggiungi questo codice:

sed -i "s/${vg}/${newvg}/g" /etc/initramfs-tools/conf.d/resume

Non avevo bisogno di farlo su Ubuntu. "update-initramfs -c -k all" era sufficiente. Quale distro stai usando per mostrare questo bisogno? Non ha lo strumento update-initramfs? Faccio un riavvio immediatamente dopo aver eseguito lo script che include questo in modo che possa anche essere un fattore nei miei diversi risultati.
flickerfly,

0

Ecco una versione rivista, correzione sulla sostituzione di stringhe di vg e stampa anche i file aggiornati.

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

Quando si utilizza questo script, la macchina potrebbe non arrestarsi correttamente nel tentativo di "arrestare" i mapping. A seconda della configurazione, ciò può anche sembrare che la macchina sia in uno stato di avvio mentre in realtà non è nemmeno prima lo spegnimento.

È utile rimuovere "splash silenzioso" da GRUB_CMDLINE_LINUX_DEFAULT mentre vedi i messaggi.


0

Ho fatto una piccola modifica sullo script per cambiare anche il nome host.

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

0

Il menu di avvio doveva anche essere modificato su Ubuntu 18 (e probabilmente altri). Quindi - semplificato per cambiare solo un nome vg e preservare l'uso di un trattino nel nome:

#!/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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.