O kernel inteiro está carregado na memória na inicialização?

14

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?

user1028270
fonte
Sim. O kernel inteiro. E seus primeiros rootfs. Mas os kernel linux não usam o initrd há muitos anos.
precisa saber é
Certo, eu estava lendo isso. Foi amplamente substituído por initramfs, certo? E ainda é um processo semelhante com o initramfs correto?
precisa saber é o seguinte
1
foi completamente substituído por todos os kernels desde a série 2.6. Mas o processo é um pouco semelhante, exceto que o initramfs nunca é desmontado - está sempre lá e sempre está na raiz também. Você precisa montar o seu root root sobre ele, na verdade. Também existem os benefícios de não precisar emular um bloco separado dev e similar.
precisa saber é
Legal, vou ler o artigo ao qual você vinculou. Então os módulos do kernel são armazenados nos rootfs initramfs?
precisa saber é o seguinte
1
@edwardtorvalds - tudo isso é tratado udevnormalmente e automaticamente.
precisa saber é

Respostas:

17

Todo o kernel é carregado na memória durante a inicialização, normalmente junto com um initramfshoje em dia. (Ainda é possível configurar um sistema para inicializar sem um, initramfsmas isso é incomum em desktops e servidores.)

A initramfsfunçã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 menos udev, talvez alguma rede, e kmodque 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: o initramfs, /lib/modulesno sistema de arquivos real, em uma árvore de desenvolvimento, se você estiver desenvolvendo um módulo ... O initramfsúnico precisa conter os módulos necessários para montar o sistema de arquivos raiz (que contém o restante).

Stephen Kitt
fonte
OK, isso faz sentido para mim. Eu acho que estava confundindo a imagem do kernel e o sistema de arquivos que ele usa, que obviamente são totalmente separados.
precisa saber é o seguinte
5

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.

Toby Speight
fonte
3

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ção initramfsé feita, o Linux executa a pivot_root(8), movendo o real /e jogando o initramfsconteú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 initramfscustomizado 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".

vonbrand
fonte
Isso não acontece pivot_root.
mikeserv