So if I want my rootfs to be in RAM, I need to set CONFIG_INITRAMFS_SOURCE to point to my rootfs (in cpio format presumably).
Essa uma forma de fazê-lo, sim, mas não é apenas .
Se você tem um gerenciador de inicialização que pode ser configurado para carregar o kernel e o initramfs como arquivos separados, você não precisa usar CONFIG_INITRAMFS_SOURCE
enquanto constrói o kernel. É suficiente ter CONFIG_BLK_DEV_INITRD
definido na configuração do kernel. (Antes do initramfs havia uma versão antiga da técnica chamada initrd
, e o nome antigo ainda aparece em alguns lugares.) O gerenciador de inicialização carregará o arquivo initramfs e, em seguida, preencherá algumas informações sobre seu local e tamanho de memória em um dado. estrutura em um local específico da imagem do kernel já carregada. O kernel tem rotinas internas que usarão essas informações para encontrar o initramfs na RAM do sistema e descompactá-lo.
Ter o initramfs como um arquivo separado permitirá que você modifique o arquivo initramfs mais facilmente, e se o seu gerenciador de inicialização puder aceitar entrada do usuário, talvez especifique outro arquivo initramfs a ser carregado em vez do regular no momento da inicialização. (Isso é muito útil se você tentar criar um initramfs personalizado e conseguir algumas coisas erradas. Esteja lá, faça isso.)
Para um sistema x86 tradicional baseado em BIOS, você encontrará informações sobre esses detalhes em (fonte do kernel ) / Documentação / x86 / boot.txt . Os sistemas baseados em UEFI fazem isso de maneira um pouco diferente (também descrita no mesmo arquivo), e outras arquiteturas como o ARM possuem seus próprios conjuntos de detalhes sobre a passagem de informações do carregador de inicialização para o kernel.
Furthermore, what if I want my rootfs to be on physical storage (like eMMC, flash drive, etc.) and not in RAM?
Em sistemas regulares não incorporados, os initramfs geralmente contêm apenas funcionalidades suficientes para ativar os subsistemas essenciais. Em um PC normal, esses geralmente seriam os drivers para o teclado, monitor e driver para o controlador de armazenamento do sistema de arquivos raiz, além de módulos do kernel e ferramentas necessárias para ativar subsistemas como LVM, criptografia de disco e / ou software RAID. se você usar esses recursos.
Quando os subsistemas essenciais estiverem ativos e o sistema de arquivos raiz estiver acessível, o initramfs normalmente executará uma operação pivot_root(8)
para alternar do initramfs para o sistema de arquivos raiz real. Mas um sistema embarcado, ou um utilitário especializado como DBAN , pode empacotar tudo o que precisa no initramfs e nunca fazer a operação pivot_root
.
Normalmente, os scripts e / ou ferramentas dentro do initramfs obterão as informações necessárias para localizar o sistema de arquivos raiz real a partir das opções na linha de comando do kernel. Mas você não tem para fazer isso: com um initramfs personalizado, você poderia fazer algo como alternar para um sistema de arquivos raiz diferente se uma tecla específica ou botão do mouse for pressionado em um momento específico na inicialização sequência.
Com uma configuração de armazenamento complexa (por exemplo, LVM criptografado em um RAID de software, em um sistema que usa armazenamento SAN multipathed redundante), todas as informações necessárias para ativar o sistema de arquivos raiz podem não se encaixar na linha de comando do kernel. poderia incluir as peças maiores no initramfs.
As distribuições modernas geralmente usam um gerador initramfs para construir um initramfs personalizado para cada kernel instalado. Diferentes distribuições costumavam ter seus próprios geradores initramfs: RedHat usava mkinitrd
enquanto o Debian tinha update-initramfs
. Mas depois da introdução de systemd
, parece que muitas distribuições estão padronizando em dracut
como um initramfs gerador.
Um arquivo initramfs moderno pode ser uma concatenação de vários .cpio
archives e cada parte pode ou não ser compactada. Um arquivo initramfs típico em um sistema x86_64 moderno pode ter um arquivo de "atualização de microcódigo inicial" como um primeiro componente (geralmente apenas um único arquivo em um arquivo cpio descompactado, pois o arquivo de microcódigo é tipicamente criptografado e não muito compactável. o conteúdo normal do initramfs, como um arquivo .cpio
compactado.
Para obter uma compreensão mais profunda do seu sistema, sugiro que você extraia um arquivo initramfs para um diretório temporário e examine seu conteúdo. No Debian, existe uma ferramenta unmkinitramfs(8)
que pode ser usada para extrair um arquivo initramfs de uma maneira direta. No RedHat 7, talvez seja necessário usar /usr/lib/dracut/skipcpio <initramfs file>
para ignorar o arquivo de atualização de microcódigo e, em seguida, canalizar a saída resultante para gzcat
e para cpio -i -d
para extrair o conteúdo initramfs para o diretório de trabalho atual. O Ubuntu pode usar lzcat
no lugar de gzcat
.