Pelo que entendi, o initramfs é responsável por carregar o sistema de arquivos raiz "real".
Agora, há dois locais onde definimos essa raiz. Primeiro colocamos uma entrada em /etc/fstab
. Segundo, colocamos o dispositivo nos comandos de inicialização do kernel, por exemplo root=/dev/sda1
.
Qual deles o initramfs usa para determinar onde está o sistema de arquivos raiz? Se ele usa o parâmetro root do kernel, por que temos uma entrada em /etc/fstab
? A segunda opção, (lê-se /etc/fstab
), é bastante ilógica porque o /etc/fstab
arquivo está no mesmo dispositivo raiz que o initramfs está tentando montar em primeiro lugar.
Coisas muito confusas.
Responder1
Como você afirmou, o objetivo do initramfs é montar o sistema de arquivos raiz "real" (ele também pode fazer outras coisas, mas essa é a tarefa comum).
Sem um initramfs, o kernel normalmente montará uma partição como somente leitura e então passará o controle para /sbin/init
. Um initramfs apenas assume esta tarefa do kernel, geralmente quando o sistema de arquivos raiz não é uma partição normal (mdraid, lvm, criptografado, etc).
Agora, além do histórico do initramfs, você /etc/fstab
reside no sistema de arquivos raiz. Assim, quando o initramfs é iniciado, esse sistema de arquivos raiz não está lá e, portanto, não pode chegar ao fstab (problema do ovo e da galinha).
Em vez disso, temos que passar um parâmetro nos argumentos de inicialização do kernel para o initramfs usar. Normalmente isso é algo como root=/dev/sdX
. No entanto, também pode fazer algo para descobrir automaticamente onde está o seu dispositivo raiz e, portanto, não há nenhum parâmetro. Como é apenas um software (geralmente um script), ele pode realmente fazer o que quiser para montar o dispositivo raiz.
Agora, como afirmado anteriormente, o kernel montará a raiz real como somente leitura. O initramfs deve fazer exatamente isso. Depois que o initramfs for concluído, o sistema continuará inicializando exatamente como se não houvesse nenhum initramfs e /sbin/init
será inicializado. Este init então inicia todos os seus scripts de inicialização normais, e é trabalho de um desses scripts ler /etc/fstab
, mudar root para leitura-gravação e montar todos os seus outros sistemas de arquivos.
Responder2
Pode ou não. Como o Initramfs pode ser construído de várias maneiras (o kernel apenas o carrega e executa, /init
fazendo o que quer que seja). No entanto, usar um parâmetro é mais comum, pois permite mais flexibilidade - ou seja, se algo mudar, você pode simplesmente editar a entrada de inicialização e tudo continuará funcionando. Com uma raiz codificada embutida, isso não seria necessariamente possível.
A entrada fstab ainda pode ser necessária de qualquer maneira, pois também determina outras coisas, como opções de montagem (algumas das quais podem ser alteradas em trânsito) e fsck
ordem. Além disso, mesmo que fosse totalmente supérfluo (e se o Initramfs lidar com isso, pode funcionar sem), eu ainda manteria a entrada lá simplesmente por uma questão de integridade.
Responder3
Você pode considerar /etc/fstab como montagem estática, é apenas uma maneira de realizar tal tarefa, mas não a única, na verdade, execute o comando mount e você verá muitos sistemas de arquivos que estão faltando no fstab. Serviços como udev e udisk gerenciam grande parte da "montagem automática", ignorando o arquivo /etc/fstab ...
Portanto, se algo é montado ou não com frequência, não tem nada a ver com /etc/fstab.
initramfs é apenas um rootfs temporário usado durante o processo de inicialização até que o rootfs "verdadeiro" seja montado, então por que o initramfs deveria estar em /etc/fstab ?