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/cache
e 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 fsck
para verificar e possivelmente consertá-lo. Então, onde iria initrd
chegar 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 fsck
para a initrd
construçã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 initrd
copiando todos os fsck.foo
programas 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.