sábado, 16 de fevereiro de 2013

Sem initramfs?

Sem LVM/RAID por software, um initramfs não tem muito propósito. Podemos pulá-lo e dizer para o kernel montar diretamente o sistema de arquivos de uma partição e executar /sbin/init. Daí para frente, o systemd assume o comando.

Para isso, alguns requerimentos:

- O kernel precisa ter o suporte ao controlador de disco e ao sistema de arquivos usado na partição compilados como bulit-in, ou seja, não podem ser módulos.
- O sistema de arquivos raiz não pode ter o diretório /usr separado.
- O bootloader não deve carregar o initramfs.

Infelizmente o kernel do Arch não tem o primeiro item nem pretende ter. No Fedora, sim; contudo, apenas o driver ext4 (que serve para EXT2/3 também) e os drivers ahci e ata_piix são built-in.

Para pular o initramfs, remova a linha "initrd" do bootloader e passe para o kernel as opções:

root=/dev/sdxy rootfstype=xyz

O sistema de arquivos precisa ser especificado (usar o mesmo nome do módulo), pois, lembre, o kernel está sozinho. Não tem nenhuma libblkid para ajudá-lo a detectar o que existe dentro da partição.

Você logo perguntará: mas indicar /dev/sdxy não é problemático quando temos mais de um HD na máquina? Sim, é. Com o particionamento GPT, cada partição tem um identificador único que podemos usar:

root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

Muitos de nós, entretanto, ainda estamos presos nos BIOS e no particionamento MBR. Felizmente, a partir do kernel 3.8, é suportada uma construção que emula um UUID no particionamento MBR.

Desde o Windows NT, no primeiro setor do disco, antes da tabela de partições (Wikipedia), as ferramentas de particionamento criam uma "Windows NT disk signature", um número randômico de 32-bit. O PARTUUID para partições MBR é formado assim:

root=PARTUUID=SSSSSSSS-PP

Onde "SSSSSSSS" corresponde ao número de 32-bit no formato hexadecimal e "PP" ao número da partição equivalente ao "y" de /dev/sdxy, também em hex. Como dificilmente alguém passará de /dev/sdx9, não precisará converter. Acima de 9, leia sobre a base hexadecimal.

Para obter a assinatura:

# fdisk -l

Disk /dev/sda: 160.0 GB, 160041885696 bytes, 312581808 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000301dc

Dispositivo Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048   312580095   156289024   83  Linux

("Disk identifier")

Automatizando:

# fdisk -l /dev/sda | grep 'Disk identifier' | awk '{print $3}' | cut -c 3-
000301dc

Ficaria então para a partição 1 do disco com assinatura 000301dc:

quiet systemd.show_status=1 plymouth.enable=0 root=PARTUUID=000301dc-01 rootfstype=ext4

As duas primeiras opções são para deixar o boot bonitinho. O Plymouth deve ser desativado sem initramfs.

As opções podem ser tornadas permanentes seguindo este post. Não consegui um meio para dizer ao grubby não colocar a entrada "initrd" no grub.cfg a cada atualização do kernel. Por enquanto, tenho editado diretamente o arquivo.

Nenhum comentário:

Postar um comentário