Eu li este popular documento da IBM (eu o vejo frequentemente referido na Web) explicando a função do disco RAM inicial.
Eu bati em uma parede ao conceituar como isso funciona.
No documento diz
O carregador de inicialização, como o GRUB, identifica o kernel a ser carregado e copia esta imagem do kernel e qualquer initrd associado na memória
Eu já estou confuso: copia o kernel inteiro na memória ou apenas parte dele? Se o kernel inteiro está na memória, por que precisamos do disco RAM inicial?
Eu pensei que o objetivo do initrd era ser capaz de ter uma pequena imagem generalizada do kernel e o initrd instalará os módulos corretos nele antes que a imagem do kernel seja carregada. Mas se o kernel inteiro já está na memória, por que precisamos do initrd?
Isso também traz outra coisa que me confunde - onde estão localizados os módulos que são carregados no kernel? Todos os módulos do kernel estão armazenados no initrd?
udev
normalmente e automaticamente.Respostas:
Todo o kernel é carregado na memória durante a inicialização, normalmente junto com um
initramfs
hoje em dia. (Ainda é possível configurar um sistema para inicializar sem um,initramfs
mas isso é incomum em desktops e servidores.)A
initramfs
função do é fornecer a funcionalidade necessária para montar os sistemas de arquivos "reais" e continuar inicializando o sistema. Isso envolve módulos do kernel e também vários binários: você precisa de pelo menosudev
, talvez alguma rede, ekmod
que carrega módulos.Os módulos podem ser carregados no kernel mais tarde do que apenas inicializar, então não há nenhuma preparação especial do kernel pelo
initramfs
. Eles podem ser armazenados em qualquer lugar: oinitramfs
,/lib/modules
no sistema de arquivos real, em uma árvore de desenvolvimento, se você estiver desenvolvendo um módulo ... Oinitramfs
único precisa conter os módulos necessários para montar o sistema de arquivos raiz (que contém o restante).fonte
O kernel inteiro (mas não seus módulos) será carregado na memória. Se houver módulos que o kernel precisará antes que qualquer sistema de arquivos esteja disponível (isso geralmente significa os drivers dos sistemas de arquivos e de seus dispositivos), esses módulos estarão no initramfs (na memória) e o kernel os carregará a partir daí. Outros módulos podem ser carregados posteriormente no sistema de arquivos.
fonte
O kernel nas configurações modernas do Linux é fortemente baseado em módulos, ou seja, o próprio kernel (carregado na inicialização na RAM) inclui apenas a funcionalidade mínima, todo o resto é compilado como módulos (carregável em tempo de execução). Para fazer isso funcionar mesmo quando, por exemplo, os dispositivos ou sistemas de arquivos necessários para a inicialização são módulos, um
initramfs
é carregado com o kernel (como o nome indica, esta é uma área de RAM com um sistema de arquivos simples, montado na inicialização). Este sistema de arquivos temporário está montado/
e contém programas de inicialização e os módulos necessários. Depois que a inicializaçãoinitramfs
é feita, o Linux executa apivot_root(8)
, movendo o real/
e jogando oinitramfs
conteúdo.O ponto dessa complexidade é que, por exemplo, uma distribuição pode compilar um kernel (mínimo de kernel e conjunto completo de módulos) e, na instalação do kernel, criar um
initramfs
customizado para o hardware e a configuração da máquina de destino. Tudo isso é necessário devido à grande variedade de dispositivos e configurações de "Computadores pessoais".fonte
pivot_root
.