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.
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 é:
gunzip -c /mnt/pendrive/hda.img.gz | dd of=/dev/nand
e quando terminar, a placa será desligada 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:
gunzip -c /mnt/pendrive/hda.img.gz | dd of=/dev/nand
e, quando terminado, desliga o quadro 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.
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.
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.
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 ).