Como mover a partição raiz para outro PV no LVM via SSH sem um sistema Live

Como mover a partição raiz para outro PV no LVM via SSH sem um sistema Live

Como posso alterar a partição raiz do Debian 10 para inicializar?

Eu gostaria de diminuir o tamanho do meu sistema de arquivos raiz que fica em um volume lógico LVM remotamente, ou seja, apenas por SSH e sem inicializar em um Live CD.

Como não podemos reduzir o rootfs enquanto ele está montado, pensei em clonar os rootfs existentes, inicializar nele e redimensionar a partir daí, depois inicializar no rootfs original e excluir o temporário.

Eu tentei em uma VM usando o Ubuntu Server 18.04, já que o AFAIK usa a mesma "cadeia de inicialização" do Debain 10. No entanto, não consegui definir com segurança a partição clonada como root. Após a reinicialização, verifiquei mounte a raiz original ainda é usada, embora

  • /etc/fstabTem sido atualizado
  • /boot/grub/grub.cfgTem sido atualizado
  • initramfsTem sido atualizado

Configuração atual

  • RAID1 de 1 TBmd0
  • RAID1 de 4 TBmd1
  • PV ativadomd0
  • PV ativadomd1p1
  • VG vg0com ambos os PVs
  • LV rootcomo raiz original fs (UUID xxx)
  • LV newrootcomo raiz temporária fs (UUID yyy)
  • ext4 ativado vg0-root(UUID aaa)
  • ext4 ativado vg0-newroot(UUID bbb)

/etc/fstabfoi alterado de acordo (caminho do mapeador de dispositivo substituído).

Até agora, sincronizei novamente toda a raiz antiga aaacom newroot bbb, substituí todas as ocorrências de UUIDs aaae xxxpor bbbe yyyin /boot/grub/grub.cfg(Nota: não estou usando grub2inicialização UEFI).

initramfsfoi atualizado usando update-initramfs -u(após correção /etc/initramfs-tools/conf.d/resume).

Naquela ordem. Mas meus testes em uma VM foram inicializados diretamente na raiz antiga ou me jogaram em um shell de resgate do GRUB.

update-grubreconheci o newrootvolume e adicionei entradas correspondentes grub.cfg, selecionando-as manualmente na inicialização em minha VM de teste (não é possível via SSH...) e também inicializei a raiz antiga.

Também vi que existe uma ROOTopção para /etc/initramfs-tools/initramfs.confcodificar a partição raiz:

Permite codificação opcional do root bootarg, quando nenhum root bootarg pode ser passado. Um bootarg root substitui essa configuração especial.

Mas como existe um bootarg para root em minha grub.cfgconfiguração, essa configuração não deve entrar em vigor.

O que mais há para configurar para usar outro UUID como root na próxima inicialização?

Responder1

Acontece que esqueci de substituir root= bootarg em /boot/grub/grub.cfg...

Para completar:

Como mover a partição raiz para outro PV no LVM via SSH sem um sistema Live

Nota: Sempre faça backup de dados importantes! Este método é um hack e não deve ser usado em sistemas de produção. Em qualquer caso, os dados gravados no tempo entre a clonagem do LV e a inicialização a partir da nova partição raiz sempre serão perdidos.

Crie um novo LVM em outro disco

fdisk /dev/sdb #Create new partition for PV (sdb1)
pvcreate /dev/sdb1
vgcreate vg1 /dev/sdb1
lvcreate -n newroot -L10G vg1 #Size has to be larger than effective usage on current root
mkfs.ext4 -L newroot /dev/mapper/vg1-newroot

Colete informações sobre o novo LVM

lvdisplay
vgdisplay
pvdisplay
blkid

Os comandos a seguir se referirão às informações apresentadas aqui como:

  • $pv0uuid = UUID do PV antigo
  • $pv1uuid = UUID do novo PV
  • $vg{0,1}uuid = UUID de {antigo,novo} VG
  • $lv{0,1}UUID = UUID de {antigo, novo} LV
  • $root{0,1}UUID = UUID do sistema de arquivos raiz {antigo, novo}
  • $vg{0,1} = Nome do VG {antigo,novo}
  • $lv{0,1} = Nome do LV {antigo, novo}

E /etc/grub/grub.cfgserá apresentado como $grubcfg. Para sistemas UEFI, isso é mais provável /boot/grub2/grub.cfg.

Eu recomendo defini-los como variáveis ​​em bashuso pv0uuid=xxxxxx-xxxx...para que os comandos abaixo possam ser copiados e colados.

Definir nova raiz na configuração do GRUB

Estes comandos substituirão o texto na configuração do GRUB:

sed -i "s/$pv0uuid/$pv1uuid/g" $grubcfg
sed -i "s/$vg0uuid/$vg1uuid/g" $grubcfg
sed -i "s/$lv0uuid/$lv1uuid/g" $grubcfg
sed -i "s/$root0uuid/$root1uuid/g" $grubcfg
sed -i "s/$vg0/$vg1/g" $grubcfg #BEWARE COMMON NAMES
sed -i "s/$lv0/$lv1/g" $grubcfg #BEWARE COMMON NAMES
sed -i "s/\/dev\/mapper\/$vg0-$lv0/\/dev\/mapper\/$vg1-$lv1/g" /etc/fstab #BEWARE COMMON NAMES

CUIDADO COM NOMES COMUNS: sedIrá substituirtodoocorrência de texto correspondente, portanto, é recomendado fazer essas alterações manualmente, pois a substituição de palavras como as rootusadas em outro lugar na configuração do GRUB ou do fstab irá torná-las inválidas!

Recomendo usar nanoe pesquisar ( CTRL+W) pelos nomes VG e LV e substituí-los manualmente. Pesquisar o nome do dispositivo fotovoltaico também é recomendado, apenas para garantir...

Clonar o volume raiz

mount /dev/mapper/$vg1-$lv1 /mnt
rsync -rAa --one-file-system / /mnt/
umount /mnt

Reinício

Reinicie (e ore). Valide o novo LV que está sendo montado /.

Excluir LVM antigo

lvremove /dev/$vg0/*
vgremove $vg0
pvremove /dev/sda2 #Path to $pv0uuid

Limpar

Opcional, mas recomendado

  • Por fim, exclua o VG antigo /etc/lvm/archiveou ele será procurado durante cada inicialização e causará atrasos
  • update-grub
  • update-initramfs -u

Notas

Testadas no Ubuntu 18.04, outras distribuições podem lidar com a configuração do GRUB de maneira diferente (em relação a UUIDs versus caminhos de dispositivos e comandos de atualização).

Obviamente, interrompa todos os serviços desnecessários com antecedência para minimizar a perda de dados.

Pode haver uma maneira de evitar (a maioria) a perda de dados usando alvos systemd, scripts personalizados e instantâneos LVM. Seria necessário sincronizar os dados $lv0novamente $lv1no último momento possível antes da reinicialização. Fora do escopo deste post...

Se /bootnão for uma partição separada, verifique novamente $grubcfga nova raiz antes de reiniciar novamente.

Responder2

Não tenho certeza se isso vai ajudá-lo, mas aqui está o que tentei reduzir com sucesso a partição raiz que está no LV:

  1. Crie um instantâneo da partição raiz. Certifique-se de que haja algum espaço alocado, pois você o alterará.
  2. fsck o instantâneo.
  3. Redimensione o instantâneo (diminua-o) e certifique-se de ter algum buffer entre a parte superior do sistema de arquivos e o limite do tamanho alvo do LV - apenas para garantir a segurança.
  4. Mescle o instantâneo de volta ao seu LV rootfs.
  5. Reinício. A mesclagem é realmente feita neste ponto (provavelmente durante a inicialização).
  6. Após uma reinicialização - reduza o volume do rootfs e possivelmente redimensione o rootfs novamente - para que ele preencha qualquer espaço no topo do LV.

Há uma desvantagem: você perderá alguns dados entre as etapas 1 e 5 e PODERÁ ter algumas inconsistências (dependendo do FS em uso) na etapa 1 - ao criar um instantâneo no sistema de arquivos ativo.

Funcionou para mim surpreendentemente bem.

No mundo ideal, a etapa 1 seria executada durante a inicialização, antes de remontar o rootfs rw, para que o instantâneo esteja limpo. Ainda não descobri como fazer isso no dracut - as ferramentas que tentei usar não funcionaram para mim.

informação relacionada