01 - Propósito (montagem da raiz, drivers iniciais)
video: https://youtu.be/... no frontmatter da nota.O processo de inicialização de um sistema operacional moderno baseia-se em uma transição gradual de estados de privilégio e de abstração de hardware. No contexto do kernel Linux, essa transição esbarra em um bloqueio arquitetural fundamental conhecido como o "Paradoxo do Ovo e da Galinha" do boot. O propósito singular e primário do initramfs (e de seu predecessor, o initrd) é atuar como uma ponte efêmera para solucionar este paradoxo, viabilizando o acesso ao sistema de arquivos raiz (/) definitivo e orquestrando o carregamento dos drivers essenciais que o kernel, por design, não possui embutidos em seu binário monolítico.
1. O Paradoxo de Inicialização (O Problema do Ovo e da Galinha)
Quando o bootloader (como o GRUB ou o systemd-boot) carrega a imagem do kernel (vmlinuz) para a memória RAM e transfere o controle de execução para ele, o kernel inicia operando de forma isolada. Ele inicializa a MMU (Memory Management Unit), os escalonadores de CPU e as estruturas fundamentais de interrupção. No entanto, o kernel é "cego" em relação ao armazenamento persistente.
A arquitetura do Linux dita que a imensa maioria dos drivers de dispositivos (device drivers) e sistemas de arquivos não seja compilada estaticamente para dentro do executável principal (vmlinux). Isso ocorre por três razões arquiteturais:
- Inchaço de Memória (Bloat): Compilar todos os drivers SCSI, NVMe, SATA, Fibre Channel, além de todos os sistemas de arquivos (ext4, xfs, btrfs, zfs) no kernel resultaria em um binário de dezenas ou centenas de megabytes, que ocuparia memória não-paginável de forma permanente.
- Modularidade e Manutenção: O kernel precisa ser genérico o suficiente para rodar em hardware que vai de smartphones a mainframes. A modularidade exige que os drivers existam como arquivos
.ko(Kernel Objects) carregáveis dinamicamente. - Orquestração de Espaço de Usuário: Muitas das topologias de armazenamento modernas não dependem apenas de um driver no Ring 0, mas de ferramentas de espaço de usuário (user-space) para montagem lógica (ex: ativação de LVM, leitura de chaves de criptografia, montagem de RAID via software).
O paradoxo surge neste ponto: Para ler o disco físico e montar o sistema de arquivos raiz, o kernel precisa carregar os módulos (.ko) que controlam aquele disco. Mas esses módulos estão armazenados em /lib/modules/... que se encontra dentro do próprio disco que o kernel ainda não consegue ler.
2. A Solução: Espaço de Usuário Precoce (Early User-Space)
O initramfs (Initial RAM Filesystem) é a solução elegante para este impasse. Ele é um ambiente de "Espaço de Usuário Precoce". O bootloader carrega não apenas o kernel para a RAM, mas também injeta um arquivo compactado (a imagem do initramfs) em um endereço de memória física adjacente, passando os ponteiros de memória para o kernel.
O propósito do initramfs é fornecer um sistema de arquivos microscópico, executado inteiramente na RAM (via tmpfs), que contém o estritamente necessário para transpor a barreira do armazenamento. O processo é o seguinte:
- O kernel descompacta a imagem na RAM e monta-a como sua raiz temporária.
- O kernel localiza e executa o binário estático ou script nomeado
/initdentro desse ambiente, concedendo-lhe o PID 1. - A partir deste momento, o kernel paralisa sua rotina interna de montagem de disco e delega a responsabilidade de encontrar e preparar o armazenamento persistente ao ambiente de espaço de usuário contido no
initramfs.
3. Fase 1: Injeção de Drivers Iniciais (Hardware e Barramentos)
A primeira grande responsabilidade do /init (frequentemente gerido por uma versão reduzida do systemd ou por scripts criados pelo dracut ou mkinitcpio) é popular o barramento de dispositivos.
O ambiente efêmero monta os pseudo-sistemas de arquivos vitais: /sys, /proc e /dev. Imediatamente, ele inicia um daemon gerenciador de eventos de hardware (como o systemd-udevd ou o mdev).
Quando o kernel detecta, através de varredura do barramento PCIe, que existe uma controladora NVMe conectada, ele gera um uevent contendo a assinatura do hardware (MODALIAS=pci:v0000144Dd0000A808...).
O gerenciador de dispositivos no initramfs intercepta este evento, consulta um arquivo modules.alias minimalista embutido nele mesmo, e descobre que necessita do módulo nvme.ko. Ele então executa o modprobe, que carrega o driver de dentro do /lib/modules/ do próprio initramfs para o Ring 0. De repente, o kernel passa a "enxergar" os dispositivos físicos de bloco, expondo-os como /dev/nvme0n1 ou /dev/sda.
4. Fase 2: Abstrações Lógicas e Quebra de Criptografia
A mera visibilidade do dispositivo físico raramente é suficiente em sistemas modernos (empresariais ou desktops seguros). O dado no disco geralmente não está puro; ele está encapsulado. A segunda responsabilidade arquitetural do initramfs é orquestrar as camadas lógicas através do Device Mapper.
Como o initramfs é um ambiente de espaço de usuário completo (embora minúsculo), ele pode executar binários complexos que o kernel não pode:
- MDRAID (Software RAID): Se o sistema raiz reside em um arranjo RAID 1, o
initramfsinvoca o utilitáriomdadmpara escanear os superblocos dos discos/dev/sdae/dev/sdb, unir as unidades e criar o dispositivo virtual/dev/md0. - LUKS / dm-crypt (Criptografia): Se o disco estiver encriptado, o kernel não pode montá-lo. O
initramfscarrega o módulodm-crypt, invoca o utilitáriocryptsetup, e apresenta um prompt na tela solicitando a senha ao usuário, ou consulta o chip TPM (Trusted Platform Module) via barramento i2c. Somente após a liberação da chave simétrica de volume mestre (VK), o dispositivo descriptografado é mapeado em/dev/mapper/root_crypt. - LVM (Logical Volume Manager): Quase invariavelmente operando sobre o dispositivo criptografado ou diretamente na partição raiz, o
initramfsinvocavgchange -aypara ativar os Grupos de Volumes (VG) e expor o Volume Lógico (LV) real, como/dev/mapper/vg0-root.
Nenhuma destas operações lógicas seria possível puramente de dentro do kernel monolítico sem violar gravemente a separação de privilégios e inchar o código-fonte do núcleo. O initramfs atua como o maestro destas ferramentas.
5. Fase 3: Montagem da Raiz (The Root Mount)
Uma vez que o dispositivo de bloco virtual final (com RAID, LVM e descriptografia aplicados) está exposto e funcional no /dev temporário, o initramfs entra em sua fase conclusiva.
Ele processa os parâmetros passados pelo bootloader na linha de comando do kernel (como root=/dev/mapper/vg0-root rootfstype=ext4 rootflags=ro).
Neste momento, ele invoca o modprobe final para carregar o driver do sistema de arquivos correspondente (ex: ext4.ko, xfs.ko ou btrfs.ko).
Com o driver carregado, o script /init executa a chamada de sistema mount(). Contudo, ele não monta a partição diretamente em / (já que o / atual é o próprio initramfs residente na memória RAM). A partição raiz física é montada em um ponto de ancoragem de transição, usualmente nomeado como /sysroot ou /mnt/root.
Por convenção e segurança, essa montagem é inicialmente feita em modo somente leitura (ro - read-only). O propósito disso é garantir que, caso o sistema de arquivos esteja marcado como "sujo" (por um desligamento abrupto anterior), a ferramenta fsck (também embutida no initramfs) possa ser executada contra o disco físico para reparar inodes e superblocos danificados, sem o risco de processos do sistema estarem simultaneamente escrevendo no disco.
6. O Desfecho: switch_root e a Passagem de Bastão
Uma vez que /sysroot contém a montagem bem-sucedida do disco físico real, o initramfs completou sua missão. No entanto, o sistema não pode continuar operando a partir do ambiente de memória RAM temporário; é necessário transferir o controle total, e o PID 1, para os binários reais no disco.
Isso é feito através de uma operação crítica chamada switch_root (ou historicamente pivot_root, embora as mecânicas divirjam). O utilitário switch_root realiza três ações destrutivas e simultâneas:
- Limpeza da RAM: Ele recursivamente apaga (via
unlink) todos os arquivos, diretórios e módulos armazenados no ambienteinitramfsatual, liberando os megabytes de memória RAM que ele ocupava de volta ao sistema. - Sobrescrita da Raiz: Ele instrui o kernel a mover a montagem que estava em
/sysrootpor cima do próprio diretório/do VFS (Virtual File System). O ponto de ancoragem do sistema de arquivos altera-se permanentemente; o que antes apontava para otmpfspassa a apontar para o disco NVMe/SATA físico. - Execução do novo PID 1: A última instrução executada pelo utilitário é uma chamada
exec()que invoca o gerenciador de serviços real do sistema operacional (usualmente/sbin/initou/usr/lib/systemd/systemd), passando os argumentos de boot. Como a famíliaexec()substitui a imagem do processo atual em vez de criar um subprocesso (não usafork), o novo programa assume a exata identificação de processo PID 1, herdando o controle do kernel.
A partir desse milissegundo, o ambiente do "Espaço de Usuário Precoce" deixa de existir, a memória é recuperada e o sistema operacional prossegue com sua rotina normal de inicialização, montando o restante do /etc/fstab (como /home e /var), acionando a rede e apresentando o prompt de login. Sem a orquestração minuciosa de detecção de abstrações de bloco provida pelo initramfs, um sistema Linux moderno seria permanentemente incapaz de acessar seu próprio disco rígido.