Apenas curioso: por que eu iria querer fazer isso?
precisa saber é o seguinte
2
Meu caso de uso é que tenho um modelo VMWare que instalei com o nome do host "modelo". Depois de implantar esse modelo, prefiro que o vgname não seja "template-vg" para todas essas máquinas. Mantendo a idéia geral de que o vgname está relacionado ao nome do host, tenho meu script de configuração para o modelo renomear vg com o nome do host. Também me permite garantir com facilidade que estou trabalhando na vg correta e não na sessão ssh errada de alguma forma.
Flickerfly
Respostas:
25
NOTA: Sua distribuição pode desencorajar a edição de /boot/grub/grub.cfg. Se for esse o caso, esse script pode ser uma má ideia. Como alternativa, você pode executar o grub-mkconfig para corrigir isso. Eu não testei nessas distros, então verifique sua situação.
Primeiro, você precisa saber o nome do grupo de volumes. Nesse caso, qualquer uso do / dev / mapper / reference precisará ter dois traços. No 16.04, o padrão é ter um "-vg" anexado ao nome, portanto, isso deve ser assumido.
Segundo, você deve saber que estragar tudo isso pode fazer com que seu sistema não seja inicializado e resultar em uma inicialização a partir de um disco de recuperação e consertar coisas que causam tempo de inatividade. (aka: não faça isso na produção. )
Para fazer a renomeação real, use lvrename oldname newname.
Após renomear, você deve editar os dois /etc/fstabe /boot/grub/grub.cfgatualizar o uso do nome para qualquer referência à sua raiz e provavelmente também aos locais de troca.
Além disso, você precisa executar este comando para atualizar o initramfs para todos os kernels.
update-initramfs -c -k all
Eu uso o seguinte script para lidar com isso ao implantar um novo modelo. Novamente, não faça isso na produção, a menos que você tenha uma alta tolerância ao tempo de inatividade.
#!/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 você tiver alguma melhoria desse script, compartilhe. Estou sempre procurando maneiras de melhorar e dar conta de vários casos extremos.
Se você executar sed -isem um arquivo de entrada, ocorrerá um erro sed: no input files. Retire a -ibandeira.
Wjandrea
Ah ok. Isso faz sentido. Gostaria de saber se a minha versão do sed lidou com isso de maneira diferente. Além disso, parece que @Diego Souza conseguiu sem sed completamente em outro comentário.
flickerfly
2
Eu acredito que você quis dizer vgrenameisso lvrenamee, como /boot/grub/grub.cfgé gerado a partir das entradas /etc/grub.d, você precisará executar update-grubapós renomear em vez de editá-lo diretamente.
Eric Streeper
Não, eu quis dizer grupo de volumes. Além disso, talvez sua distribuição seja diferente da minha na configuração do grub.
Flickerfly
3
Parece que update-grubnão é possível executar corretamente antes da reinicialização - falha com um erro /usr/sbin/grub-probe: error: failed to get canonical path of '/dev/mapper/ubuntu--vg-root'para mim. Para sistemas em que /boot/grub/grub.cfgé gerado automaticamente, talvez a opção mais segura seja atualizar manualmente, como neste script, reiniciar, executar update-grube reiniciar novamente.
Michael Firth
1
O arquivo /boot/grub/grub.cfgnão deve ser editado manualmente.
Há o cabeçalho do arquivo abaixo:
"
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
"
Sim, minha resposta está ficando um pouco antiga e meu caso de uso para isso não é mais o suficiente. Recomendamos que você contribua com o que aprender para atualizá-lo. Em que distribuição e versão você está vendo isso?
Flickerfly
1
Isso me chamou a atenção no ubuntu 18.04.1 LTS - o vgrename e a inicialização falharam. Também observei que o desligamento foi interrompido porque umount de troca (referenciando o nome antigo da vg) falhou.
Renomeei o vg de volta para o que estava usando lvm no prompt initramfs. Ainda não refiz o nome do vgr "corretamente", conforme as instruções acima.
Após renomear, você deve editar os dois /etc/fstabe /boot/grub/grub.cfgatualizar o uso do nome para qualquer referência à sua raiz e provavelmente também aos locais de troca. /etc/initramfs-tools/conf.d/resumeé necessário também.
Então, adicione este código:
sed -i "s/${vg}/${newvg}/g" /etc/initramfs-tools/conf.d/resume
Eu não precisava fazer isso no Ubuntu. 'update-initramfs -c -k all' foi suficiente. Que distro você está usando que mostrou essa necessidade? Ele não possui a ferramenta update-initramfs? Eu faço uma reinicialização imediatamente após executar o script que inclui isso, para que também possa ser um fator nos meus diferentes resultados.
Flickerfly
0
Aqui está uma versão revisada, corrija a substituição de cadeias de caracteres de vg e também imprima arquivos atualizados.
#!/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
Ao usar esse script, a máquina pode não desligar corretamente, enquanto tenta "parar" os mapeamentos. Dependendo da sua configuração, isso pode até parecer que a máquina está em um estado de inicialização, enquanto na realidade nem sequer é desligada primeiro.
É útil remover "respingos silenciosos" de GRUB_CMDLINE_LINUX_DEFAULT enquanto você vê as mensagens.
Fiz uma pequena modificação no script para também mudar o nome do 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
O menu de inicialização também precisava ser editado no Ubuntu 18 (e provavelmente outros). Então - simplificado para alterar apenas um nome vg e preservar o uso de um traço no 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
Respostas:
NOTA: Sua distribuição pode desencorajar a edição de /boot/grub/grub.cfg. Se for esse o caso, esse script pode ser uma má ideia. Como alternativa, você pode executar o grub-mkconfig para corrigir isso. Eu não testei nessas distros, então verifique sua situação.
Primeiro, você precisa saber o nome do grupo de volumes. Nesse caso, qualquer uso do / dev / mapper / reference precisará ter dois traços. No 16.04, o padrão é ter um "-vg" anexado ao nome, portanto, isso deve ser assumido.
Segundo, você deve saber que estragar tudo isso pode fazer com que seu sistema não seja inicializado e resultar em uma inicialização a partir de um disco de recuperação e consertar coisas que causam tempo de inatividade. (aka: não faça isso na produção. )
Para fazer a renomeação real, use
lvrename oldname newname
.Após renomear, você deve editar os dois
/etc/fstab
e/boot/grub/grub.cfg
atualizar o uso do nome para qualquer referência à sua raiz e provavelmente também aos locais de troca.Além disso, você precisa executar este comando para atualizar o initramfs para todos os kernels.
Eu uso o seguinte script para lidar com isso ao implantar um novo modelo. Novamente, não faça isso na produção, a menos que você tenha uma alta tolerância ao tempo de inatividade.
Se você tiver alguma melhoria desse script, compartilhe. Estou sempre procurando maneiras de melhorar e dar conta de vários casos extremos.
fonte
sed -i
sem um arquivo de entrada, ocorrerá um errosed: no input files
. Retire a-i
bandeira.vgrename
issolvrename
e, como/boot/grub/grub.cfg
é gerado a partir das entradas/etc/grub.d
, você precisará executarupdate-grub
após renomear em vez de editá-lo diretamente.update-grub
não é possível executar corretamente antes da reinicialização - falha com um erro/usr/sbin/grub-probe: error: failed to get canonical path of '/dev/mapper/ubuntu--vg-root'
para mim. Para sistemas em que/boot/grub/grub.cfg
é gerado automaticamente, talvez a opção mais segura seja atualizar manualmente, como neste script, reiniciar, executarupdate-grub
e reiniciar novamente.O arquivo
/boot/grub/grub.cfg
não deve ser editado manualmente.Há o cabeçalho do arquivo abaixo:
fonte
Isso me chamou a atenção no ubuntu 18.04.1 LTS - o vgrename e a inicialização falharam. Também observei que o desligamento foi interrompido porque umount de troca (referenciando o nome antigo da vg) falhou.
Renomeei o vg de volta para o que estava usando lvm no prompt initramfs. Ainda não refiz o nome do vgr "corretamente", conforme as instruções acima.
fonte
Após renomear, você deve editar os dois
/etc/fstab
e/boot/grub/grub.cfg
atualizar o uso do nome para qualquer referência à sua raiz e provavelmente também aos locais de troca./etc/initramfs-tools/conf.d/resume
é necessário também.Então, adicione este código:
fonte
Aqui está uma versão revisada, corrija a substituição de cadeias de caracteres de vg e também imprima arquivos atualizados.
Ao usar esse script, a máquina pode não desligar corretamente, enquanto tenta "parar" os mapeamentos. Dependendo da sua configuração, isso pode até parecer que a máquina está em um estado de inicialização, enquanto na realidade nem sequer é desligada primeiro.
É útil remover "respingos silenciosos" de GRUB_CMDLINE_LINUX_DEFAULT enquanto você vê as mensagens.
fonte
Fiz uma pequena modificação no script para também mudar o nome do host.
fonte
O menu de inicialização também precisava ser editado no Ubuntu 18 (e provavelmente outros). Então - simplificado para alterar apenas um nome vg e preservar o uso de um traço no nome:
fonte