Troca de raiz no tempo de execução

2

Estou desenvolvendo um sistema Linux embarcado. O sistema é geralmente instalado através da criação de um arquivo ISO que é gravado em um pendrive que a placa pode inicializar.

Para tornar a instalação possível automaticamente (por exemplo, durante a noite), eu gostaria de poder fazer a instalação na placa enquanto o sistema antigo está sendo executado.

Minha instalação tem duas partes: um arquivo initrd que contém scripts busybox e install, e um arquivo .tar.gz que possui o restante do sistema de arquivos raiz para instalar.

  1. O bootloader carrega o kernel e aponta para o initrd e inicializa o kernel.
  2. Os scripts de instalação do initrd montam a unidade de destino / dev / sda, formatam-na, instalam o carregador de inicialização e, finalmente, copiam o sistema de arquivos raiz de .tar.gz e initrd.

Agora, em vez disso, quero

  1. Copie install.iso do computador host para o dispositivo de destino. (Não tem problema)
  2. Execute as etapas de instalação conforme acima.

Meu problema é que eu não sei como devo substituir o sistema atualmente em execução pelo meu novo. Eu suponho que a raiz atualmente montada (/) teria que ser desmontada e substituída pelo initrd. Mas não consigo descobrir como!

    
por kigurai 11.02.2011 / 10:50

2 respostas

1

Eu posso pensar em maneiras diferentes de fazer o que você quer. Todos os quais carregam um nível de risco e dificuldade. O principal risco é que, se a instalação der errado / quebrar, você acabará com um sistema não inicializável que precisa ser instalado manualmente.

Meu pensamento principal (que depende do seu gerenciador de inicialização e similar) seria usar exatamente o procedimento que você tem agora. Basicamente, copie a nova imagem de instalação para o seu pendrive, que fica permanentemente na máquina. Então apenas reinicie e deixe-o inicializar e instalar normalmente.

Ele conta com o seguinte

  1. Instalação sem intervenção. Eu estou supondo que você tem que, caso contrário, uma reinstalação durante a noite não seria um problema.
  2. Seu gerenciador de partida pode escolher entre USB ou sistema de arquivos local inicializar automaticamente (ou por meio de um comando em nível de aplicativo antes de reinicializar)
  3. No final, você precisa configurar seu gerenciador de inicialização para inicializar a partir da placa local, em vez do dispositivo USB, ou apenas apagar o conteúdo do dispositivo USB / torná-lo não inicializável para que o carregador de inicialização caia

Uma alternativa para isso seria ter duas partições de inicialização / raiz na sua placa e apenas instalar na que você não está usando e, ao final da reinicialização, forçar o seu bootloader a inicializar na outra. Você poderia usar um ambiente chroot para forçar seu instalador a pensar que ele estava inicializando do zero. Essa é provavelmente uma grande mudança em seu ambiente e não seria uma vitória rápida.

    
por 11.02.2011 / 12:03
1

Já tentou montar o initrd e depois o pivot_root? Parece o que você quer fazer.

    
por 11.02.2011 / 13:27