O uso de um sistema de arquivos raiz somente leitura é uma boa ideia para a configuração incorporada?

13

Eu tenho a tarefa de executar o Linux como um sistema operacional em um dispositivo incorporado.

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

Eu consegui usar o buildroot para criar a imagem do kernel e ferramentas de compilação cruzada. Eu particionei o dispositivo CF em uma pequena partição FAT em que a imagem do kernel reside, bem como a configuração de inicialização syslinux e um sistema de arquivos ext3 onde eu descompactei o sistema de arquivos raiz gerado pelo buildroot para.

O sistema inicializa com êxito usando syslinux definindo o diretório raiz para a partição CF ext3 onde o sistema de arquivos do buildroot está localizado.

Minha pergunta está centrada na necessidade de robustez diante da perda de energia imediata (e frequente), pois é crucial que o dispositivo seja inicializado com sucesso após quedas de energia. Eu li que a montagem do sistema de arquivos raiz como somente leitura é uma maneira de garantir a integridade dos dados. É este um caminho sensato para eu prosseguir?

Eu também li sobre a possibilidade de carregar o sistema de arquivos raiz na RAM para obter a mesma coisa, mas ainda não sei como fazer isso.

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

    
por mathematician1975 10.01.2013 / 11:31

2 respostas

9

Nova resposta (2015-03-22)

( Nota: Esta resposta é mais simples que anterior, mas não mais segura. Minha primeira resposta é mais strong porque você pode manter os arquivos somente leitura por fs opções de montagem antes de sinalizadores de permissão. Portanto, forçar a gravar arquivos sem permissão para gravar não funcionará.

Sim, no Debian , há um pacote: fsprotect ( homepage ).

Ele usa aufs (por padrão, mas pode usar outra ferramenta unionfs ) para permitir alterações de sessão ao vivo mas na RAM por padrão, então tudo é esquecido na reinicialização.

Você pode instalá-los executando simplesmente:

apt-get install fsprotect

Uma vez concluído, a partir do documento on-line:

After that:

  • Edit /boot/grub/menu.lst or /etc/default/grub2 or /etc/lilo.conf and add "fsprotect=1G" to kernel parameters.
  • Modify 1G as needed.
  • Apply changes (i.e. run update-grub)
  • Edit /etc/default/fsprotect if you want to protect filesystems other than /.
  • reboot

You may also want to password protect the grub bootloader or forbid any changes to it.

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

chmod ugo-w myfile

se você usar o exemplo vi myfile e tentar escrever nele com o comando :w! , isso funcionará e o myfile será alterado. Você pode reinicializar para recuperar myfile não modificado.

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

Resposta antiga (primeira):

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

Tornando r / o utilizável

Você precisa montar alguns diretórios em rw , como /var , /etc e talvez /home . Isso pode ser feito usando aufs ou unionfs . Eu gosto disso de outra forma , usando /dev/shm e mount --bind :

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

Você pode, antes, mover todos os diretórios que não precisam ser alterados na operação normal em static-var , em vez de 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

Portanto, ao remontar em ro, copiar /var em /dev/shm não ocupará muito espaço, já que a maioria dos arquivos são movidos para /static-var e apenas links simbólicos devem ser copiados na memória RAM.

A melhor maneira de fazer isso é criar um ciclo de energia completo, um dia de trabalho completo e executar um comando como:

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

Assim, você verá quais arquivos precisam estar localizados na partição de leitura / gravação.

Registrando

Como neste host não existe memória estática gravável, a fim de armazenar histórico e outros logs, você tem que configurar um servidor syslog remoto.

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

Desta forma, se o seu sistema quebrar por qualquer motivo, tudo o que estiver antes é registrado.

Atualizando

Ao executar com mount --bind em uso, para fazer tal atualização enquanto o sistema estiver em uso (sem a necessidade de executar init 1 , para reduzir o tempo de inatividade), a maneira mais simples é reconstruir uma limpeza root , capaz de fazer a atualização:

Após remontar '/' no modo leitura-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
    
por 11.01.2013 / 22:04
3

Eu só tenho experiência em usar um buildroot mais recente (2014-02). Nessa versão você pode desabilitar 'remontar o sistema de arquivos raiz boot read-write duing' no arquivo de configuração com:

BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW não está definido

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

por 01.10.2014 / 12:30