Por que o Linux usa um disco de RAM inicial na inicialização?

2

Eu queria saber:

Qual é o objetivo de usar initrd na primeira parte do processo de inicialização e usar pivot_root para colocar a raiz no disco real? Por que não usar apenas o que há no disco?

    
por Bahaïka 03.03.2015 / 14:58

4 respostas

3

Why not only use what's on the disk ?

Você pode. Você não precisa usar um initrd (ou um initramfs, a versão mais nova e mais difundida desde o kernel 2.6.13).

A razão pela qual eles são usados é que os kernels de distribuição são genéricos e devem suportar uma ampla gama de equipamentos prontos para o uso. Alguns dos drivers para hardware diferente, cruciais para a montagem de um sistema de arquivos raiz, são possivelmente mútuos exclusivos (não tenho certeza), mas em qualquer caso, construir todas as possibilidades - que é o que você teria que fazer - faria para um kernel muito grande.

Assim, em vez de serem construídos no kernel, os drivers estão em módulos binários separados. Esta é a carga principal do initramdfs / initrd; ele permite que o kernel carregue os drivers apropriados para o hardware, para que o sistema de arquivos raiz possa ser montado corretamente.

    
por 03.03.2015 / 16:02
2

Antes havia algo como initrd, você tinha que passar o nome do dispositivo da partição que você queria usar como root fs na linha de comando do kernel. O kernel tinha um código especial para analisar esse nome e reconhecer um punhado de strings comuns, e traduzi-las para o seu bem conhecido dev_t number. Ou seja, internamente, o kernel conhece os dispositivos simplesmente como um índice numérico em uma matriz e, para montar um, você precisa saber seu número.

Nos dias anteriores ao plug and play e hot plug, quando os sistemas tinham apenas um ou dois discos que estavam sempre presentes, isso funcionava bem. Se o seu sistema de arquivos raiz era /dev/hda1 , então sempre foi assim. O advento do plug and play explodiu isso fora da água embora. Nos dias de hoje, você pode ter uma dúzia de unidades de disco internas, usb, iscsi ou o que quiser, e no interesse de diminuir os tempos de inicialização, elas são testadas em paralelo, portanto o nome do dispositivo pode mudar dependendo de qual em qualquer inicialização, ou na ordem em que você os conectou. Isso significa que o nome do dispositivo especificado da linha de comando do kernel pode facilmente ficar incorreto e você não inicializa.

Para contornar isso, o UUID foi introduzido. Especificando dispositivos pelo UUID, não importa se é sda ou sde, a unidade certa pode sempre ser encontrada. Isso, no entanto, requer realmente olhar para as unidades e é um pouco mais complexo que o nome simples e estático - > dev_t mapeamento que o código de inicialização do kernel pode fazer. Foi decidido que o kernel não é lugar para tal complexidade e assim o initrd nasceu. Ele pode ter os utilitários necessários para identificar o dispositivo raiz correto e montá-lo. Ele também pode fazer coisas arbitrariamente complexas, como abrir a rede e obter uma concessão de DHCP para acessar uma raiz nfs ou iscsi. Outras coisas que você precisa de um initrd incluem a configuração de raid e lvm ou crypto para acesso ao disco.

    
por 03.03.2015 / 22:18
1

A tarefa do initrd é disponibilizar o verdadeiro dispositivo raiz e alternar para ele. O dispositivo raiz real pode ser (por exemplo) uma partição em um disco rígido, um compartilhamento nfs na rede, um sistema de arquivos em um pendrive, um pseudo sistema de arquivos ou qualquer outra coisa.

Quase todo initrd tem uma rotina chamada mountroot . Essa é a função que procura o sistema de arquivos raiz correto e o monta (normalmente para /root no próprio initrd (não confunda com o diretório base do root)).

O gerenciador de inicialização precisa apontar para o local correto no disco (ou onde quer que esteja) onde o kernel e o initrd estão. O kernel é executado e o initrd é descompactado diretamente nos sistemas RAM. Normalmente, há um script em / do initrd chamado init . Essa é a parte que monta os pseudo sistemas de arquivos (sysfs, procfs, dev, ...). Além disso, há variáveis de ambiente que estão acessíveis (acima de /proc/cmdline ), como debug , break , ...

Após o sistema de arquivos raiz ter sido montado, o script é limpo e alterna para a nova raiz. Então o processo em /sbin/init ultrapassa o pid número 1, que era anteriormente o init-scripts pid. A partir daí, existem diferentes mecanismos que fazem o resto do processo de inicialização (upstart, SysVinit, systemd).

    
por 03.03.2015 / 15:12
1
O

caos resumiu-o perfeitamente. Gostaria apenas de acrescentar que um ramdisk inicial (ou initrd ) é opcional . Há certas circunstâncias em que é necessário, por exemplo, quando /usr está em um sistema de arquivos separado, que costumava ser anunciado como uma boa prática.

Além disso, systemd , que é encontrado em muitas distribuições Linux, requer que /usr esteja disponível na inicialização . Caso contrário, você deve fornecer um initrd que prepare o sistema de arquivos raiz com /usr corretamente montado antes de mudar para a raiz real.

Ter uma tela de inicialização limpa também requer um initrd . Todas as principais distribuições modernas fornecem uma tela de bootplash em vez do fluxo infame de mensagens de log na inicialização.

    
por 03.03.2015 / 16:00

Tags