Acho que preciso reorganizar as partições de um sistema para mover dados anteriormente no sistema de arquivos raiz para pontos de montagem dedicados. Os volumes estão todos no LVM, então isso é relativamente fácil: crie novos volumes, mova dados para eles, reduza o sistema de arquivos raiz e monte os novos volumes nos pontos apropriados.
O problema é a etapa 3, diminuindo o sistema de arquivos raiz. Os sistemas de arquivos envolvidos são ext4, então o redimensionamento online é suportado; no entanto, enquanto montado, os sistemas de arquivos podem ser cultivados apenas. Para reduzir a partição, é necessário desmontá-la, o que obviamente não é possível para a partição raiz em operação normal.
As respostas na Web parecem girar em torno da inicialização de um LiveCD ou outra mídia de resgate, da operação de redução e, em seguida, da inicialização do sistema instalado. No entanto, o sistema em questão é remoto e eu tenho acesso apenas via SSH. Posso reiniciar, mas não é possível inicializar um disco de recuperação e executar operações no console.
Como desmontar o sistema de arquivos raiz, mantendo o acesso remoto ao shell?
pivot_root
para lá. Um exemplo aqui: dreamlayers.blogspot.co.uk/2012/10/running-linux-from-ram.html - é complicado, mas se você tiver uma caixa de teste para experimentá-lo, vale a pena considerar.Respostas:
Para resolver esse problema, as informações fornecidas em http://www.ivarch.com/blogs/oss/2007/01/resize-a-live-root-fs-a-howto.shtml foram essenciais. No entanto, esse guia é para uma versão muito antiga do RHEL, e várias informações estavam obsoletas.
As instruções abaixo foram criadas para funcionar com o CentOS 7, mas devem ser facilmente transferíveis para qualquer distribuição que execute o systemd. Todos os comandos são executados como raiz.
Verifique se o sistema está em um estado estável
Certifique-se de que ninguém mais está usando e nada mais importante está acontecendo. Provavelmente, é uma boa idéia interromper as unidades de fornecimento de serviços como httpd ou ftpd, apenas para garantir que as conexões externas não atrapalhem as coisas.
Desmonte todos os sistemas de arquivos não utilizados
Isso imprimirá vários avisos de 'O destino está ocupado', para o próprio volume raiz e para vários FSs temporários / do sistema. Estes podem ser ignorados no momento. O importante é que nenhum sistema de arquivos em disco permaneça montado, exceto o próprio sistema de arquivos raiz. Verifique isto:
Se você vir algum sistema de arquivos em disco ainda montado, algo ainda está em execução que não deveria estar. Verifique o que está usando
fuser
:Faça a raiz temporária
Isso cria um sistema raiz muito mínimo, que interrompe (entre outras coisas) a visualização da página de manual (não
/usr/share
), personalizações no nível do usuário (não/root
ou/home
) e assim por diante. Isso é intencional, uma vez que constitui um incentivo para não permanecer em um sistema radicular equipado com júri por mais tempo do que o necessário.Nesse ponto, você também deve garantir que todo o software necessário esteja instalado, pois também quebrará o gerenciador de pacotes. Veja todas as etapas e verifique se você tem os executáveis necessários.
Gire na raiz
systemd faz com que as montagens permitam o compartilhamento de subárvore por padrão (como em
mount --make-shared
), e isso causapivot_root
falha. Portanto, desativamos isso globalmente commount --make-rprivate /
. Os sistemas e sistemas de arquivos temporários são movidos por atacado para a nova raiz. Isso é necessário para fazê-lo funcionar; os soquetes para comunicação com o systemd, entre outras coisas, estão disponíveis/run
e, portanto, não há como fazer com que os processos em execução fiquem fechados.Garantir que o acesso remoto tenha sobrevivido à transição
Após reiniciar o sshd, assegure-se de poder entrar, abrindo outro terminal e conectando-o novamente à máquina via ssh. Se não conseguir, corrija o problema antes de prosseguir.
Depois de verificar, você pode se conectar novamente, saia do shell que está usando no momento e reconecte-se. Isso permite que o garfo restante
sshd
saia e garante que o novo não esteja segurando/oldroot
.Feche tudo ainda usando a raiz antiga
Isso imprimirá uma lista de processos ainda mantendo o diretório raiz antigo. No meu sistema, ficou assim:
Você precisa lidar com cada um desses processos antes de poder desmontar
/oldroot
. A abordagem da força bruta é simplesmentekill $PID
para cada um, mas isso pode quebrar as coisas. Para fazer isso mais suavemente:Isso cria uma lista de serviços em execução. Você deve poder correlacionar isso com a lista de processos em espera
/oldroot
e emitirsystemctl restart
para cada um deles. Alguns serviços se recusam a aparecer na raiz temporária e entrar em um estado com falha; estes realmente não importam no momento.Se a unidade raiz que você deseja redimensionar for uma unidade LVM, também será necessário reiniciar alguns outros serviços em execução, mesmo que eles não apareçam na lista criada por
fuser -vm /oldroot
. Se você não conseguir redimensionar uma unidade LVM na Etapa 7, tentesystemctl restart systemd-udevd
.Alguns processos não podem ser tratados de maneira simples
systemctl restart
. Para mim, estes incluídosauditd
(o que não gosta de ser morto viasystemctl
, e só queria umkill -15
). Estes podem ser tratados individualmente.O último processo que você encontrará, geralmente, é
systemd
ele próprio. Para isso, corrasystemctl daemon-reexec
.Quando terminar, a tabela deve ficar assim:
Desmonte a raiz antiga
Nesse ponto, você pode executar as manipulações necessárias. A pergunta original precisava de uma
resize2fs
chamada simples , mas você pode fazer o que quiser aqui; outro caso de uso é transferir o sistema de arquivos raiz de uma partição simples para LVM / RAID / qualquer que seja.Gire a raiz de volta
Essa é uma reversão direta da etapa 4.
Descarte a raiz temporária
Repita as etapas 5 e 6, exceto usando
/tmp/tmproot
no lugar de/oldroot
. Então:Como é um tmpfs, nesse ponto a raiz temporária se dissolve no éter, para nunca mais ser vista.
Coloque as coisas de volta em seus lugares
Monte os sistemas de arquivos novamente:
Nesse ponto, você também deve atualizar
/etc/fstab
egrub.cfg
de acordo com os ajustes feitos durante a etapa 7.Reinicie quaisquer serviços com falha:
Permitir subárvores compartilhadas novamente:
Inicie as unidades de serviço paradas - você pode usar este único comando:
E você terminou.
Muito obrigado a Andrew Wood, que trabalhou nessa evolução no RHEL4, e a Steve, que me forneceu o link para o primeiro.
fonte
umount /oldroot/boot
claro, no estágio 6). Estou vinculando sua resposta a outras perguntas de SE que não tiveram resposta ou resposta negativa.umount /oldroot/boot
antes de vocêumount /oldroot
mount --move
o tmpfs, mas isso não é suportado.telinit u
pode fazer o que você deseja./oldroot/tmp
, o que me impediu de desmontar/oldroot
, mas não aparecem emfuser
oulsof
saída. Tomou um pouco de ficar olhando para systemd de trabalho que um ...Se você tem certeza do que está fazendo - portanto, não está experimentando, pode se conectar ao initrd, que é a maneira mais interativa e rápida.
Em um sistema baseado no Debian, aqui está como.
Veja o código: https://github.com/szepeviktor/debian-server-tools/blob/master/debian-resizefs.sh
Há outro exemplo: https://github.com/szepeviktor/debian-server-tools/blob/master/debian-convert-ext3-ext4.sh
fonte