
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 mount
e a raiz original ainda é usada, embora
/etc/fstab
Tem sido atualizado/boot/grub/grub.cfg
Tem sido atualizadoinitramfs
Tem sido atualizado
Configuração atual
- RAID1 de 1 TB
md0
- RAID1 de 4 TB
md1
- PV ativado
md0
- PV ativado
md1p1
- VG
vg0
com ambos os PVs - LV
root
como raiz original fs (UUIDxxx
) - LV
newroot
como raiz temporária fs (UUIDyyy
) - ext4 ativado
vg0-root
(UUIDaaa
) - ext4 ativado
vg0-newroot
(UUIDbbb
)
/etc/fstab
foi alterado de acordo (caminho do mapeador de dispositivo substituído).
Até agora, sincronizei novamente toda a raiz antiga aaa
com newroot bbb
, substituí todas as ocorrências de UUIDs aaa
e xxx
por bbb
e yyy
in /boot/grub/grub.cfg
(Nota: não estou usando grub2
inicialização UEFI).
initramfs
foi 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-grub
reconheci o newroot
volume 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 ROOT
opção para /etc/initramfs-tools/initramfs.conf
codificar 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.cfg
configuraçã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.cfg
será apresentado como $grubcfg
. Para sistemas UEFI, isso é mais provável /boot/grub2/grub.cfg
.
Eu recomendo defini-los como variáveis em bash
uso 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:
sed
Irá substituirtodoocorrência de texto correspondente, portanto, é recomendado fazer essas alterações manualmente, pois a substituição de palavras como asroot
usadas em outro lugar na configuração do GRUB ou do fstab irá torná-las inválidas!
Recomendo usar nano
e 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/archive
ou 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 $lv0
novamente $lv1
no último momento possível antes da reinicialização. Fora do escopo deste post...
Se /boot
não for uma partição separada, verifique novamente $grubcfg
a 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:
- Crie um instantâneo da partição raiz. Certifique-se de que haja algum espaço alocado, pois você o alterará.
- fsck o instantâneo.
- 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.
- Mescle o instantâneo de volta ao seu LV rootfs.
- Reinício. A mesclagem é realmente feita neste ponto (provavelmente durante a inicialização).
- 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.