AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 450873
Accepted
Tiago Pimenta
Tiago Pimenta
Asked: 2018-06-21 05:27:55 +0800 CST2018-06-21 05:27:55 +0800 CST 2018-06-21 05:27:55 +0800 CST

Como desmontar /var /usr com segurança no systemd sem reinicialização

  • 772

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 / /mntseguido rsynce depois relançando o processo que os usa depois umount.

O problema é o /vare /usrque é usado pelo próprio processo de inicialização do systemd. Será systemd-remount-fsque o truque? Como eu poderia permorr isso? Seria uma simples fstabedição seguida de rsyncser 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 /vare de jeito /usrnenhum.

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 kexecpor 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 btrfspartição compactada para /var/loge outra btrfsou xfspara /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 squashfsjunto com o root e montar um overlayfspara facilitar a detecção de configurações incorretas. Eu gostaria de poder fazer tudo isso sem reiniciar, embora eu não saiba se poderei.

mount systemd
  • 1 1 respostas
  • 6803 Views

1 respostas

  • Voted
  1. Best Answer
    Tiago Pimenta
    2018-07-21T07:48:52+08:002018-07-21T07:48:52+08:00

    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 um rebootou kexec, uma abordagem melhor é usar zram, além de criar um dispositivo de memória, ele comprime os dados, portanto, se você gravar 5Gdados, na verdade usará muito menos do que a memória, mas ainda assim, você precisará de memória suficiente.

    Por exemplo, se 7Gfor suficiente, você pode criá-lo da seguinte maneira:

    sudo modprobe zram num_devices=4
    echo 7G | sudo tee /sys/block/zram0/disksize
    sudo mkfs.ext4 -m0 /dev/zram0
    

    Depois de provisionar as partições necessárias para o ambiente clonado, veja como funcionará:

    mkdir /tmp/sys
    sudo mount /dev/zram0 /tmp/sys # or the target device in place of zram0
    # mount other separate partitions if required
    sudo tar -cpSf - \
        --acls --xattrs --selinux \
        --exclude '/dev/*' \
        --exclude '/run/*' \
        --exclude '/sys/*' \
        --exclude '/proc/*' \
        --exclude '/tmp/*' \
        --exclude '/var/tmp/*' \
        --exclude '/var/run/*' \
        / |
        sudo tar -xvf - \
            --acls --xattrs --selinux \
            -C /tmp/sys
    

    Recomenda-se fazer backup do seu fstabantes de realizar a troca:

    sudo cp -a /tmp/sys/etc/fstab /tmp/sys/etc/fstab-
    sudo truncate -s0 /tmp/sys/etc/fstab
    

    Se você pretende alterar a partição onde algum dispositivo é uma swapmemória, é recomendável desativá-la primeiro:

    sudo swapoff -a
    

    Então, para executar o chroot:

    sudo mkdir /sysroot
    sudo mount --rbind /tmp/sys /sysroot
    sudo touch /etc/initrd-release
    sudo systemctl --no-block isolate initrd-switch-root
    # it will stop all other services (isolate) and call systemctl switch-root /sysroot
    

    Observe que não é necessário vincular proce dev, 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:

    sudo mv /etc/fstab- /etc/fstab
    sudo vi /etc/fstab
    sudo vi /etc/default/grub
    

    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:

    sudo grub2-install /dev/sda # or the intended bootable disk
    sudo grub2-mkconfig -o /etc/grub2.cfg
    

    Depois de voltar para seus dispositivos físicos, se você estiver usando zram, poderá liberar a memória da seguinte forma:

    echo 1 | sudo tee /sys/block/zram0/reset
    sudo modprobe -r zram
    

    Lembre-se, faça por sua conta e risco.

    • 2

relate perguntas

  • Como montar partições de unidade zfs no solaris 11.3

  • Use o suporte de watchdog do systemd para reiniciar o aplicativo

  • Bloqueando montagem syscall

  • montar lan hdd no linux fedora

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve