Um carregador de boot desmonta o ramdisk ANTES de montar o sistema de arquivos raiz no disco rígido?

3

Em um curso on-line recente, um instrutor do RHEL / CentOS mencionou o seguinte:

The boot loader then executes the kernel. During the kernel stage, the kernel loads a ramdisk into memory. This ramdisk serves as a temporary root file system. This file system includes kernel modules, drivers, and possibly even kickstart files. Later, the kernel unmounts the ramdisk and mounts the root file system on the hard drive. And then, starts the initialization stage by executing the first process. In the initialization stage, the grandfather process runs. In older versions of Red Hat this was the Init process.

Isso parece para trás para mim. O kernel não precisaria de ALGUM sistema de arquivos disponível durante todo o processo? Essa linha destacada acima sugere que há um breve momento no tempo em que não há absolutamente nenhum sistema de arquivos em execução.

    
por Mike B 29.12.2017 / 01:49

2 respostas

2

Does a boot loader unmount the ramdisk […] ?

Não.

Later, the kernel unmounts the ramdisk and mounts the root file system on the hard drive. And then, starts the initialization stage by executing the first process.

Isso está errado.

O initramfs contém um programa chamado /init . Este programa é executado e é o primeiro (usuário) processo enquanto o initramfs ainda está lá . De fato, é esse programa que dispara qualquer desmontagem que ocorre.

Este é o programa /init usado no Debian 9 Linux . O Fedora tem um sistema similar chamado Dracut . Como você pode ver, o script carrega módulos, executa ganchos, monta o sistema de arquivos raiz final e, finalmente, sobrepõe-se ao programa run-init , que pode ser encontrado no pacote klibc-utils. (Versões anteriores usavam run-init ou switch_root de acordo com o que estava disponível.) O Dracut ainda usa switch_root . Dracut neste ponto gerou um todo systemd-udevd subsystem que executou dispositivos autodetectados e executou os daemons e montou volumes a partir desses dispositivos. Os daemons gerados por systemd-udevd para os DASDs continuam sendo executados em paralelo com switch_root .

O programa run-init em por sua vez, exclui o conteúdo do initramfs, chroot s para o novo sistema de arquivos raiz, abre seu /dev/console e se sobrepõe a qualquer que seja o programa init nesse sistema de arquivos , que ele sabe de uma variável chamada init na linha de comando do kernel ou um padrão para essa variável assumida por o primeiro programa /init . switch_root faz o mesmo, embora com algumas pequenas diferenças. Dracut passa o nome do programa init que ele obteve da mesma forma da linha de comando do kernel .

Como você pode ver, nenhum o kernel nem um gerenciador de partida aciona nada disso. O carregador de boot está bem fora de cena quando o programa /init é iniciado como processo # 1, e o kernel simplesmente faz o programa /init , os programas nos ganchos que ele gera e os dois mais adiante. programas que ele se sobrepõe, diga.

E não, não há nenhum ponto neste processo, a partir do momento em que o processo # 1 é iniciado com o programa /init do initramfs em diante, onde é possível não ter nenhum sistema de arquivos montado . Há sempre pelo menos um processo em execução, e esse processo deve ter um diretório de trabalho, um diretório raiz e um arquivo de imagem de programa, os quais devem referenciar vnodes de um volume montado em algum lugar .

Você observará que o initramfs original só pode desaparecer quando o último ponto de montagem é movido e o último processo a ser usado, como o diretório atual por processo, o diretório raiz por processo ou o arquivo de imagem do programa. vai embora - ou, como run-init e switch_root do, alterna o diretório de trabalho eo diretório raiz para algum outro volume e se sobrepõe a uma imagem de programa de um arquivo de algum outro volume. Note que as pessoas do systemd acomodam a possibilidade de que o initramfs de fato não desapareça, porque há programas rodando a partir de imagens daquele volume, e permanece presente por toda a vida do sistema.

Então, o que realmente acontece é que tanto o initramfs original quanto o sistema de arquivos raiz final estão ambos presentes em um ponto do processo, e de fato possivelmente a partir de então. Longe de existir um ponto em que existem sistemas de arquivos raiz zero , há um ponto em que há múltiplos sistemas de arquivos raiz e então (conforme as referências ao initramfs desaparecem) cai de volta para um novamente. (Observe que os sistemas de arquivos para /proc , /sys , /dev , /run , /dev/shm e /dev/pts estão presentes no momento de run-init / switch_root em execução, então o total contagem de sistemas de arquivos montados, root e outros, permanece bem acima de dois ao longo do processo de bootstrap.)

Leitura adicional

por 29.12.2017 / 10:17
1

Um kernel em execução não precisa de um sistema de arquivos montado mais do que precisa de uma interface de rede configurada - a menos, é claro, (ou algum código executado sob o kernel, como init process) está ativamente usando-os no momento, o que não é o caso ao mudar de um rootfs temporário para o rootfs real.

Lembre-se, o kernel não tem um sistema de arquivos montado desde o momento em que ele inicia até o momento em que monta o initrd (ou o rootfs real se não estiver usando um initrd). Isso acontece algum tempo após a análise inicial do hardware e a inicialização do dispositivo e do driver.

    
por 29.12.2017 / 01:57