live dd sobre uma partição raiz somente leitura montada

1

Estou tentando conceber um mecanismo de atualização de firmware para um sistema embarcado baseado em Linux sem um initrd / initramfs / whatever adicional. De dentro do sistema em execução, que tem uma raiz montada somente leitura, eu uso dd para copiar a nova imagem raiz (que reside em uma partição de dados secundária).

O problema é que metade das vezes acabo com um sistema de arquivos raiz corrompido. Eu não entendo porque isso está acontecendo, sabendo que a partição é somente leitura e que eu faço uma sincronização antes de reiniciar (eu reinicio escrevendo 'b' para / proc / sysrq-trigger). Alguém por favor me ilumine.

    
por ccrisan 26.05.2014 / 20:14

2 respostas

1

Você está sobrescrevendo um sistema de arquivos montado. Assim que o driver do sistema de arquivos tentar ler qualquer coisa, você acabará com problemas.

Você precisa se certificar de que, assim que estiver gravando o novo firmware, nada mais deverá ler ou gravar essa partição.

O que as pessoas geralmente parecem estar fazendo para contornar esse problema é usar o gerenciador de inicialização para fazer um novo firmware. Ele geralmente reside completamente na RAM e, portanto, não precisa acessar suas partições.

EDIT : Outra maneira seria instalar outro sistema mínimo em sua segunda partição cujo único propósito é fazer com que um arquivo de imagem seja exibido na primeira partição. Quando uma atualização é devida, você só precisa copiar a imagem para o local correto, atualizar o bootloader (para inicializar a partir da segunda partição) e reiniciar. Quando a imagem estiver escrita, reinicie o carregador de inicialização e reinicie novamente.

    
por 26.05.2014 / 20:53
0

Você não pode sobrescrever o sistema de arquivos raiz enquanto ele estiver montado, mesmo que seja somente leitura.

O que você pode fazer é montar um tmpfs contendo todos os arquivos do sistema de arquivos raiz, então chamar pivot_root para mudar para o tmpfs e desmontar a raiz antiga.

Isso é provavelmente impossível para um sistema que já tenha sido inicializado, pois a desmontagem do antigo sistema de arquivos raiz significa que todos os programas executados a partir dele devem sair ou executar um programa.

A maneira mais viável de usar essa abordagem provavelmente seria ter um programa / sbin / tmpfs-init que fizesse tudo isso e, em seguida, exec fosse o novo init. Até isso é bastante difícil de fazer.

    
por 27.05.2014 / 02:06