Por que o initramfs monta o sistema de arquivos raiz somente leitura

12

Qual é o motivo do sistema de arquivos raiz ser montado rono initramfs (e no initrd).

Por exemplo, o guia initramfs do Gentoo monta o sistema de arquivos raiz com:

mount -o ro /dev/sda1 /mnt/root

Por que não o seguinte?

mount -o rw /dev/sda1 /mnt/root

Percebo que provavelmente existe uma boa razão (e provavelmente envolve switchroot), mas isso não parece estar documentado em nenhum lugar.

Portablejim
fonte

Respostas:

19

O ramdisk inicial (initrd) é geralmente uma versão simplificada do sistema de arquivos raiz que contém apenas o necessário para montar o sistema de arquivos raiz real e iniciar a inicialização.

O initrd existe porque em sistemas modernos, o gerenciador de inicialização não pode ser inteligente o suficiente para encontrar o sistema de arquivos raiz de forma confiável. Existem muitas possibilidades para um programa tão pequeno como o carregador de inicialização. Considere raiz NFS, placas RAID fora do padrão etc. O carregador de inicialização deve fazer seu trabalho usando apenas o BIOS e qualquer código que possa ser inserido no setor de inicialização.

O initrd é armazenado em algum lugar que o carregador de inicialização pode encontrar, e é pequeno o suficiente para que o espaço extra necessário normalmente não incomode ninguém. (Em pequenos sistemas embarcados, geralmente não há raiz "real", apenas o initrd.)

O initrd é precioso: seu conteúdo deve ser preservado em todas as condições, porque se o initrd for interrompido, o sistema não poderá inicializar. Uma escolha de design feita por seus designers para garantir que isso faça o carregador de inicialização carregar o initrd somente leitura. Há outros princípios que o trabalho em direção a este, também, como a que, no caso de pequenos sistemas onde não há raiz "real", você ainda montagem separado /tmp, /var/cachee tal para armazenar coisas. Alterar o initrd é feito apenas raramente e, em seguida, deve ser feito com muito cuidado.

Voltando ao caso normal onde não é um sistema de arquivos raiz real, ele é inicialmente montado somente leitura porque initrd foi. Ele é mantido somente leitura pelo maior tempo possível, pelas mesmas razões. Qualquer gravação na raiz real que precise ser feita é adiada até que o sistema seja inicializado, de preferência, ou pelo menos até o final do processo de inicialização, quando essa preferência não puder ser atendida.

A coisa mais importante que acontece durante essa fase de somente leitura é que o sistema de arquivos raiz é verificado para verificar se foi desmontado corretamente. Isso é algo que o carregador de inicialização certamente poderia fazer em vez de deixá-lo no initrd, mas o que acontece se o sistema de arquivos raiz não foi desmontado corretamente? Então ele precisa ligar fsckpara verificar e possivelmente consertá-lo. Então, onde iria initrdchegar fsck, se fosse responsável por essa etapa, em vez de esperar até a transferência para a raiz "real"? Você poderia dizer que precisa copiar fsckpara a initrdconstrução, mas agora é maior. E ainda por cima, qual fsck você copiará? Os sistemas Linux usam regularmente uma dúzia de sistemas de arquivos diferentes. Você copia apenas o necessário para a raiz real no momento em que oinitrdé criado? Você aumenta o tamanho initrdcopiando todos os fsck.fooprogramas disponíveis para ele, caso o sistema de arquivos raiz seja posteriormente migrado para outro tipo de sistema de arquivos e alguém se esqueça de reconstruir o initrd?

Os arquitetos do sistema de inicialização do Linux sabiamente optaram por não sobrecarregar o initrd com esses problemas. Eles delegaram a verificação do sistema de arquivos raiz real ao sistema de arquivos raiz real, pois está em uma posição melhor para fazer isso do que o initrd.

Uma vez que o processo de inicialização tenha avançado o suficiente para que seja seguro fazê-lo, o initrd é trocado pela raiz real pivot_root(8)e o sistema de arquivos é remontado no modo de leitura e gravação.

Warren Young
fonte
4
O initramfs não é montado apenas para leitura; o kernel o descompacta em um tmpfs de leitura / gravação que é montado como /. Também pivot_root () é usado no initrd agora depreciado, mas não no initramfs, que a maioria dos sistemas usa atualmente (mesmo que o arquivo ainda seja nomeado initrd). Com o initrd, o pivot_root ocorreu antes da execução do / sbin / init, que passou ao fsck e remontou o r / w. Com um initramfs, ele simplesmente exclui todos os arquivos no initramfs e depois executa o chroots na raiz real e execs / sbin / init.
Psusi
0

Como durante a inicialização, o sistema de arquivos raiz é sempre montado inicialmente como somente leitura. Após a conclusão de vários autotestes, o sistema de arquivos raiz é remetido como leitura / gravação e começa a montar os outros sistemas de arquivos.

Shadur
fonte
0

Uma razão pela qual posso pensar é evitar algum tipo de corrupção. Por exemplo, você pode montar o sistema de arquivos ext4 como ext2 (ou vice-versa) e isso é seguro no modo ro, mas pode causar alterações de formato incompatíveis se montado rw a partir do initram.

Ah, e há outro motivo: o initramfs provavelmente não possui o fsck, mas pode ser necessário verificar o sistema de arquivos antes de montá-lo rw.

rvs
fonte