Sobrescrever o Linux enquanto estiver em uso

1

Para encurtar a história, eu gostaria de conectar um pendrive USB ao meu sistema Debian (que está instalado na memória NAND em uma placa ARM) e sobrescrever o NAND com a imagem que está no pendrive USB enquanto o sistema está rodando. Isso é possível? Infelizmente eu não consigo arrancar a partir de USB, então de alguma forma eu tenho que fazer isso como uma "cirurgia de coração aberto"

Obrigado

Editar: algumas informações adicionais

Talvez seja útil adicionar algumas informações adicionais: tenho de atualizar mais de 200 painéis. O procedimento atual é:

  1. desligue o quadro
  2. abre o caso
  3. insira um microSD (com uma instalação Debian) no slot da placa e um pendrive USB (com a nova imagem NAND da placa) na porta USB da placa
  4. poder no quadro
  5. a placa inicializará a instalação da Debian no microSD, que copia automaticamente a imagem que está no pendrive USB para a placa NAND com um simples comando dd: gunzip -c /mnt/pendrive/hda.img.gz | dd of=/dev/nand e quando terminar, a placa será desligada
  6. quando a placa é desligada, desconecte o microSD e o pendrive USB
  7. remontar o caso
  8. energia na placa com a instalação da Debian atualizada

Este procedimento é necessário porque o slot microSD não é acessível de fora. Faça isso uma vez ... sem problema. Faça isso mais de 200 vezes? Nossa!

Eu gostaria de acelerar este processo e torná-lo super simples, assim também um usuário normal poderia atualizar o fórum. Se algo der errado, não há problema, não preciso de backups, não tenho dados no quadro, apenas o software que estou distribuindo.

Meu objetivo é ter um novo procedimento que faça algo assim:

  1. A placa está ligada e o Debian está rodando
  2. eu conecto o pendrive
  3. Um script no pendrive é lançado. O script faz um gunzip -c /mnt/pendrive/hda.img.gz | dd of=/dev/nand e, quando terminado, desliga o quadro
  4. Na próxima inicialização, o Debian atualizado irá inicializar a partir do NAND

Esse procedimento mais simples permitiria que eu distribuísse alguns pendrives USB para que os usuários pudessem atualizar as placas sem a necessidade de trazer para mim todas as mais de 200 placas. Se este processo falhar e a instalação da Debian for corrompida, o usuário apenas traz para mim aquela placa, e eu seguirei o procedimento atual.

Observe que a diretoria não tem acesso à Internet, por isso não consigo fazer login nem iniciar atualizações remotamente.

    
por user1527576 12.11.2015 / 14:40

3 respostas

3

Você pode fazer isso se colocar todo o necessário para sobrescrever programas em tmpfs e executá-los a partir daí. Arriscado, e você deve ter backup útil se algo funcionasse errado.

    
por 12.11.2015 / 14:48
0

Nunca fiz isso, parece muito arriscado, mas pode funcionar.

Primeiro, interrompa todos os serviços e todos os programas em execução no momento e depois disso faça o rsync.

Outra coisa que pode ajudar, é chroot para o sistema operacional usb primeiro, a fim de ter acesso às bibliotecas corretas durante o seu trabalho.

    
por 12.11.2015 / 14:50
0

Como seus requisitos mudaram, eu respondo novamente.

No seu caso, eu construiria um busybox especial vinculado estaticamente a essas ferramentas: ash, (utilitários principais como ls mv cp rm), dd, vi e gzip / gunzip. Escreva um script que será executado a partir do USB (o drive USB será formatado em qualquer sistema de arquivos ext *, certo?) Que usará apenas o binário do busybox do flash durante a execução dos comandos, por exemplo com o comando update. : /mnt/pendrive/busybox gunzip -c /mnt/pendrive/hda.img.gz | /mnt/pendrive/busybox dd of=/dev/nand .

Antes de executar uma atualização, eu executaria um shell (se no modo interativo) do busybox antes da atualização com exec /mnt/pendrive/busybox ash -l , sobrescrevendo qualquer shell usado na memória, porque ele ficará indisponível após a sobrescrita. Alternativamente, se você planeja executá-lo no modo batch, você não deve usar #!/bin/sh line, mas deve especificar o caminho completo para o shell busybox como #!/mnt/pendrive/busybox sh ou, ao executá-lo como /bin/sh /mnt/pendrive/script.sh , você deve executá-lo com binário do busybox: /mnt/pendrive/busybox sh /mnt/pendrive/script.sh .

Lembre-se de que, antes da atualização, você deve analisar e interromper qualquer atividade do sistema que possa gravar algo na NAND durante a atualização, portanto, se você tiver alguns serviços em execução (mesmo syslog), deverá desligá-los. Use ferramentas corretas para isso, talvez você tenha um supervisor de processo em execução, que irá reaparecer.

E, provavelmente, o desligamento deve ser instantâneo, sem desmontagens ou scripts que nunca serão executados pelos serviços de desligamento. Você pode conseguir isso com echo o >/proc/sysrq-trigger ou o comando shutdown apropriado, que apenas chamará o syscall de reinicialização () apropriado imediatamente.

Você pode encontrar mais informações sobre o busybox: link . Para segurança de execução (sem necessidade de libs compartilhadas mesmo em binário vinculado estaticamente), eu criaria o busybox com musl libc ( link ).

    
por 13.11.2015 / 04:09