Usar um sistema de arquivos raiz somente leitura é uma boa idéia para a instalação incorporada?

15

Fui encarregado de executar o Linux como um sistema operacional em um dispositivo incorporado.

O destino possui um processador x86 e um dispositivo CompactFlash de 8 GB para armazenamento.

Eu consegui usar o buildroot para criar a imagem do kernel e as ferramentas de compilação cruzada. Particionei o dispositivo CF em uma pequena partição FAT, na qual reside a imagem do kernel, bem como na syslinuxconfiguração de inicialização e em um ext3sistema de arquivos onde descompactei o sistema de arquivos raiz gerado pelo buildroot para.

O sistema inicializa com êxito usando a syslinuxconfiguração do diretório raiz para a partição CF ext3 em que meu sistema de arquivos buildroot está localizado.

Minha pergunta está centrada na necessidade de robustez diante da perda de energia imediata (e frequente), pois é crucial que o dispositivo inicialize com êxito após quedas de energia. Li que a montagem do sistema de arquivos raiz como somente leitura é uma maneira de garantir a integridade dos dados. Essa é uma maneira sensata para eu prosseguir?

Eu também li sobre a possibilidade de carregar o sistema de arquivos raiz na RAM para conseguir a mesma coisa, mas ainda não sei como fazê-lo.

Existe uma maneira preferida de atingir esse objetivo? Em caso afirmativo, qual é a melhor maneira de prosseguir?

mathematician1975
fonte

Respostas:

11

Nova resposta (22/03/2015)

( Nota: esta resposta é mais simples que a anterior, mas não mais segura. Minha primeira resposta é mais forte porque você pode manter os arquivos somente leitura pelas opções de montagem fs antes dos sinalizadores de permissão. Portanto, forçar a gravação de arquivos sem permissão para gravação não funcionará em absoluto.)

Sim, no Debian , existe um pacote: fsprotect ( página inicial ).

Ele usa aufs(por padrão, mas poderia usar outra unionfsferramenta) para permitir alterações de sessão ao vivo, mas na RAM, por padrão, para que tudo seja esquecido na reinicialização.

Você pode instalá-los executando simplesmente:

apt-get install fsprotect

Depois de concluído, no documento on-line:

Depois disso:

  • Edite /boot/grub/menu.lstou /etc/default/grub2ou /etc/lilo.confadicione " fsprotect=1G" aos parâmetros do kernel.
  • Modifique 1G conforme necessário.
  • Aplicar alterações (ou seja, executar update-grub)
  • Edite /etc/default/fsprotectse você deseja proteger outros sistemas de arquivos /.
  • reiniciar

Você também pode proteger com senha o gerenciador de inicialização grub ou proibir quaisquer alterações nele.

A partir daí, se algum arquivo estiver protegido contra alterações, por exemplo, por

chmod ugo-w myfile

se você usar a amostra vi myfilee tentar escrever nela com o comando :w!, isso funcionará e você será myfilealterado. Você pode reiniciar para recuperar não modificado myfile.

Isso nem é possível com a minha primeira solução a seguir:

Antiga (primeira) resposta:

Sim, é uma solução forte, mas poderosa!

Tornando r / o utilizável

Você tem que montar alguns diretórios em rw , como /var, /etce talvez /home. Isso pode ser feito usando aufs ou unionfs . Eu gosto disso de outra maneira , usando /dev/shme mount --bind:

cp -a /var /dev/shm/
mount --bind /dev/shm/var /var

Você poderia antes, mover todos os diretórios que não precisam alterar a operação normal em a static-var, do que criar links simbólicos em / var:

mkdir /static-var
mkdir /static-var/cache
mkdir /static-var/lib
mv /var/lib/dpkg /static-var/lib/dpkg
ln -s /static-var/lib/dpkg /var/lib/dpkg
mv /var/cache/apt /static-var/cache/apt
ln -s /static-var/cache/apt /var/cache/apt
... # an so on

Então, quando remontar em ro, copiando /varem /dev/shmnão tomar muito espaço, como a maioria dos arquivos são movidos para /static-vare apenas links simbólicos devem ser copiados na memória RAM.

A melhor maneira de fazer isso com precisão é fazer um ciclo de energia completo, um dia de trabalho completo e executar um comando como:

find / -type f -o -type f -mtime -1

Então você verá quais arquivos precisam estar localizados na partição de leitura e gravação.

Exploração madeireira

Como neste host não existe memória estática gravável, para armazenar o histórico e outros logs, você precisa configurar um syslogservidor remoto .

echo >/etc/syslog.conf '*.* @mySyslogServer.localdomain'

Dessa forma, se o seu sistema for interrompido por qualquer motivo, tudo será registrado antes.

Atualizando

Ao executar com alguns mount --bindem uso, para fazer essa atualização enquanto o sistema está em uso (sem a necessidade de executar init 1, para reduzir o tempo de inatividade), a maneira mais simples é recriar uma raiz limpa , capaz de fazer a atualização:

Após remontar '/' no modo de leitura e gravação :

mount -o remount,rw /

for mpnt in /{,proc,sys,dev{,/pts}};do
    mount --bind $mnpt /$mnt$mpnt;
    done

chroot /mnt

apt-get update && apt-get dist-upgrade

exit

umount /mnt/{dev{/pts,},proc,sys,}

sync
mount -o remount,ro /

E agora:

shutdown -r now
F. Hauri
fonte
Obrigado pela sua resposta. Não o entendo completamente, pois minhas habilidades com o Linux não são excelentes no momento. Ainda é muito útil e me dá mais algumas áreas para pesquisa.
mathematician1975
Resposta editada! Nova solução e diferenças explicadas!
F. Hauri 22/03
Isso não responde à pergunta, é uma ótima resposta para um sistema baseado no debian, mas o Buildroot não é baseado no debian.
LovesTha
@LovesTha Dê uma olhada na resposta antiga (primeira) ! Isso é menos baseado no Debian e você pode entender o princípio e implementar o mesmo mecanismo para qualquer tipo de distribuição / instalação. (mesmo se Atualizando seção mostram comandos Debian, U poderia fazer mesmo para a atualização manual ou qualquer outra atualização com base distrib.)
F. Hauri
Sua resposta antiga seria uma ótima resposta para uma pergunta genérica sobre como configurar sistemas Linux somente leitura. Depois de terminar minha exploração de fazer nossas buildroot somente leitura, espero voltar e dar uma ótima resposta detalhada sobre a pergunta específica aqui. O Buildroot já possui os bits temporários de / var vinculados a / tmp, que é um tempfs. / etc não deve ser usado como espaço de rascunho para programas, portanto, não deve ser tratado especialmente.
LovesTha
3

Eu só tenho experiência usando uma buildroot mais recente (2014-02). Nessa versão, você pode desativar 'remontar o sistema de arquivos raiz para leitura e gravação durante a inicialização' no arquivo de configuração com:

BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW não está definido

Consegui criar uma imagem que apenas usa sua partição ext4 / como somente leitura, para desconectar o poder do sistema. Funciona muito bem, portanto, se você não precisa escrever no seu sistema de arquivos, talvez seja uma solução muito mais simples do que a mencionada acima (que parece mais ou menos aplicável ao sistema Debian no que se refere ao apt-get).

stacksake
fonte
Obrigado pela resposta - no entanto, no final, optei por uma instalação do initramfs com a montagem de apenas alguns diretórios com a opção sync no drive CF para persistência dos dados. Isso me serviu muito bem por enquanto.
mathematician1975
Para adicionar isso: usando versões mais antigas da buildroot, verifique /etc/inittabse a remontagem /ocorre lá. Nesse caso, altere-o de acordo com as suas necessidades.
evnu
Esta resposta é uma parte importante da "maneira de construir" para fazer isso. Muitos dos conselhos na resposta aceita serão necessários para fazer com que sistemas mais complexos funcionem. É provável que tudo o que precise ser feito seja configurar alguns links simbólicos extras para / tmp (tempfs) e tudo funcione.
LovesTha