Quando o Linux pode inicializar com um sistema de arquivos raiz somente leitura?

4

Estou trabalhando em um Linux embarcado com u-boot como bootloader e systemd init system. As ferramentas são limitadas ao busybox padrão.

Ao analisar alguns problemas, descobri que o sistema de arquivos raiz é somente de leitura, o que causa o problema. A razão é que alguns dos serviços e programas dependem de uma raiz gravável, causando mau funcionamento.

Depois de pesquisar por um tempo, descobri que o sistema de arquivos raiz é somente leitura quando ocorre uma falha de energia. (A unidade principal aciona uma reciclagem de energia quando algum erro é encontrado.) Eu suspeito que quando o root fs tenta gravar em algum arquivo crítico ou atualizando algum serviço / processo, em caso de falha de energia, um sinalizador de erro é definido no sistema de arquivos. Na próxima inicialização o fsck lê o sinalizador e monta / remonta a raiz como somente leitura, ou fsck força para entrar em algum modo de recuperação (não sei se existe algum modo de recuperação).

Minha hipótese está correta? Em caso afirmativo, então o que é um sinalizador fs que é definido no FS em erro e como evitar que a raiz inicialize como RO?

Nota:

  1. O sistema de arquivos raiz é montado com 'errors = continue'. Então, se fsck ler o superblock para a opção remount, ele deve ignorar o erro e ser remontado como RW.

  2. Eu tentei reproduzir o caso, desligando a energia durante a execução de um comando dd, mas nunca consegui reproduzir.

Pergunta adicional: Qual magia udev / systemd monta a raiz fs?

    
por dDebug 24.04.2018 / 09:55

1 resposta

1

Na inicialização, você deve verificar seus sistemas de arquivos para ver se o sistema foi desligado corretamente ou se ele travou e executar as ações de recuperação necessárias no último caso. Em sistemas de arquivos modernos, isso geralmente significa uma operação simples e rápida de recuperação de diário que pode ser feita automaticamente.

A verificação e montagem do sistema de arquivos raiz é normalmente feita pelo initramfs / initrd, mas em um sistema embarcado você pode ou não tê-lo.

Se você não estiver usando o initramfs, então a maneira tradicional seria que o kernel sempre montasse o sistema de arquivos raiz inicialmente como somente leitura (com opções de inicialização root=/dev/<whatever> ro e a inicialização primeiro, os scripts executariam fsck (assumindo que é necessário para o tipo de sistema de arquivos usado) e então remontaria o sistema de arquivos raiz para o modo leitura / gravação antes de fazer qualquer outra coisa.

Se o initramfs não verificou o sistema de arquivos raiz (talvez porque não está sendo usado), então o nome padrão do serviço systemd para executar uma verificação do sistema de arquivos no sistema de arquivos raiz é denominado systemd-fsck-root.service . Eu não consegui descobrir o nome do serviço responsável por remontar o sistema de arquivos raiz com o systemd depois que ele foi verificado.

Se uma checagem do sistema de arquivos raiz de boot precisar modificar o sistema de arquivos raiz, ele geralmente aciona outra reinicialização, porque a modificação pode ter afetado algo que o kernel já leu e está fazendo cache, e agora seria inconsistente após uma correção. feita no disco por fsck .

    
por 24.04.2018 / 14:27