Atualizando o sistema de arquivos raiz remotamente no local

1

Digamos que um só tenha acesso remoto (SSH) a um dispositivo Linux embarcado e o objetivo seja atualizar o sistema operacional para uma nova versão. O dispositivo tem apenas uma partição, mas há facilmente mais de 50% de espaço não utilizado e o dispositivo tem cerca de 256 MB de RAM para trabalhar. Como alguém iria fazer isso? Eu estou pensando que a solução provavelmente envolveria tempfs e pivot_root.

Aqui está minha ideia vaga de como fazer isso:

  1. carregue a nova estrutura rootfs para um diretório no dispositivo
  2. monte um tempfs na RAM e copie os recursos do sistema necessários para manter o sistema em execução enquanto o rootfs estiver sendo trabalhado
  3. altere a raiz para os tempfs usando pivot_root, chroot ou ambos, não totalmente certo
  4. copie a estrutura rootfs do diretório enviado para substituir o antigo
  5. reinicialize a nova versão do sistema operacional

Agora, estou pensando que isso parece simples demais para funcionar. Você pode, por favor, fazer furos em meu plano e me dizer o que eu perdi ou, melhor ainda, me dar dicas de como fazer isso certo? Alguém tem experiência em fazer algo assim?

    
por Janne Oksanen 05.02.2018 / 15:37

1 resposta

0

O chroot só mudará o diretório raiz do processo atual, então mudar o resto da partição provavelmente deixará o sistema morrer (e com isso, seu processo atual também).

O mesmo é válido para pivot_root:

pivot_root moves the root file system of the current process to the directory put_old and makes new_root the new root file system.

Quando eu tive que atualizar o sistema de arquivos raiz de um pi de framboesa, eu anexei uma unidade USB para ele e inicializei a partir daí. O sistema de arquivos temporários funcionou bem e eu poderia mudar o sistema de arquivos raiz "real" sem precisar remover o cartão SD. (O raspberry pi era difícil de alcançar, mas eu consegui inserir um pendrive).

Não consigo pensar em uma maneira adequada de "inicializar" apenas em um disco RAM, pois a inicialização init inicial do sistema ainda é proveniente da mídia. Pense em todos os CDs ao vivo do Linux que precisam do CD todo o tempo, embora o mais do sistema já esteja na RAM.

Se você puder reparticionar seu sistema de arquivos, poderá instalar o "novo" sistema operacional na segunda partição e marcá-lo como ativo e inicializável.

  1. Sistema de arquivos de repartição para uma segunda partição (para o novo SO)
  2. Marque a nova partição como ativa e inicializável
  3. Formate a nova partição
  4. Instale o novo SO (ou um temporário) na segunda partição
  5. Atualize o gerenciador de inicialização (grub, LILO, ...) para inicializar a partir da nova (segunda) partição
  6. reinicializar
  7. Excluir conteúdo da primeira partição
  8. Instale um novo sistema operacional na primeira partição
  9. Atualize o gerenciador de inicialização (grub, LILO, ...) para inicializar a partir da primeira partição
  10. reinicializar
  11. Excluir conteúdo da segunda parição
  12. Remover segunda partição
  13. Redimensione a primeira partição para o tamanho total

O redimensionamento durante a corrida é difícil, mas este site afirma que isso pode ser possível. Ele alegou (em 2007!) Que precisava de 2 GB de RAM para essa operação ...

    
por 05.02.2018 / 15:47