Eu tenho um servidor Linux em uma VM que a reinicialização funciona como desligamento devido à configuração incorreta de um provedor de terceiros. Não tenho acesso à configuração da VM.
A pessoa que instalou o sistema fez uma bagunça com o armazenamento e montou irresponsavelmente um ponto para cada diretório ( /var
, /home
, /usr
, etc...) levando-os a serem facilmente famintos para alguns e vazios para outros.
Para consertar essa bagunça estou reorganizando os pontos de montagem, consegui gerenciar a maioria deles fazendo mount --bind / /mnt
seguido rsync
e depois relançando o processo que os usa depois umount
.
O problema é o /var
e /usr
que é usado pelo próprio processo de inicialização do systemd. Será systemd-remount-fs
que o truque? Como eu poderia permorr isso? Seria uma simples fstab
edição seguida de rsync
ser suficiente? Ele reiniciará todos os serviços?
Eu sei quais pontos realmente precisam de partições separadas para o meu caso, e não é o caso de /var
e de jeito /usr
nenhum.
A premissa é que não posso usar umount -l
, pois terei que destruir a partição depois de remontar a mesma, e gostaria de evitar kexec
por não saber se ela terá o mesmo efeito de bug nessa VM mal configurada de não conseguir trazê-la novamente .
Estou planejando ter uma btrfs
partição compactada para /var/log
e outra btrfs
ou xfs
para /var/lib/docker
, e juntar todas as outras com o mínimo de espaço necessário possível uma vez que elas ficarão quase estáticas. E no futuro eu posso colocá-los squashfs
junto com o root e montar um overlayfs
para facilitar a detecção de configurações incorretas. Eu gostaria de poder fazer tudo isso sem reiniciar, embora eu não saiba se poderei.
AVISO: essas operações são extremamente arriscadas, não dou garantia sobre isso, é recomendável que você entenda cada passo e aplique-o por sua conta e risco, caso contrário, provavelmente quebrará seu sistema e não sou responsável por quaisquer danos decorrentes de seu uso.
Eu clonei todos os discos do servidor em uma máquina virtual local na minha estação de trabalho para tentar os comandos sem afetar meu servidor original, se você não tiver certeza de que pode fazer o mesmo. Após uma extensa pesquisa e vários experimentos, finalmente encontrei uma solução.
Alguns sistemas usam o systemd no initrd , depois de montar a raiz de destino, ele alterna o ambiente systemd da mesma maneira que faria com o chroot, todos os serviços são desligados e reiniciados no novo ambiente.
Poderíamos aproveitar esse recurso para alterar a raiz novamente, fazendo isso em um ambiente clonado em outro disco liberará os bloqueios que o sistema mantém no ambiente mais antigo, para que você possa desmontar esses pontos com segurança - na verdade, na maioria das vezes nem será montado. Mas este ambiente clonado deve garantir a configuração correta para trazer a rede novamente e dar acesso ssh. Se isso não acontecer, considere-se condenado.
É importante que você tenha uma partição separada, uma vez que se você chroot para um diretório dentro de outra partição em vez de um dispositivo em si, o sistema ainda pode conter o dispositivo da partição pai, para este caso de uso devemos considerar que se destina a não bloquear nenhum .
Se você tiver espaço livre não alocado ou puder reduzir algumas partições para ter espaço para o ambiente clonado, é recomendado. No entanto, se você não tiver espaço de armazenamento livre, poderá criar um ponto de montagem de memória virtual se tiver memória suficiente. Uma partição de rede não é recomendada uma vez que a conexão pode ser perdida durante o procedimento.
Um ponto de montagem de memória virtual pode ser feito por
tmpfs
, mas fará com que você tenha essa memória bloqueada no ambiente mais antigo de forma que não seja possível liberá-la sem umreboot
oukexec
, uma abordagem melhor é usarzram
, além de criar um dispositivo de memória, ele comprime os dados, portanto, se você gravar5G
dados, na verdade usará muito menos do que a memória, mas ainda assim, você precisará de memória suficiente.Por exemplo, se
7G
for suficiente, você pode criá-lo da seguinte maneira:Depois de provisionar as partições necessárias para o ambiente clonado, veja como funcionará:
Recomenda-se fazer backup do seu
fstab
antes de realizar a troca:Se você pretende alterar a partição onde algum dispositivo é uma
swap
memória, é recomendável desativá-la primeiro:Então, para executar o chroot:
Observe que não é necessário vincular
proc
edev
, como você normalmente faz ao executar um chroot, o systemd fará isso por você. Você pode perder a conexão, se você esperar algum tempo e ainda não conseguir se conectar, você tem minhas condolências, você foi desperdiçado.No entanto, se você tiver sorte e conseguir se conectar agora, poderá realizar as alterações na tabela de partição desejadas.
É importante ajustar o caminho dos dispositivos e o uuid (
blkid
) para corresponder aos novos:Depois de ter feito suas alterações, você pode fazer a mesma estratégia para retornar o dispositivo raiz real, uma vez feito isso não se esqueça de instalar o bootloader para o novo ambiente, a fim de recuperá-lo em caso de desligamento:
Depois de voltar para seus dispositivos físicos, se você estiver usando
zram
, poderá liberar a memória da seguinte forma:Lembre-se, faça por sua conta e risco.