TL; DR : Como posso inicializar uma partição squashfs do initramfs com um nome de partição previsível? /dev/sda2
não funciona porque os nomes dos dispositivos são reordenados aleatoriamente e, às vezes, são inicializados da partição errada.
Nós usamos uma instalação personalizada do Gentoo que se parece com isso:
/dev/sda1: /boot ext4 (unencrypted)
/dev/sda2: / squashfs (unencrypted)
/dev/sda3: /home ext4 (dm-crypt)
/dev/sda4: - swap
Criamos um script initramfs personalizado que monta a partição raiz e um tmpfs sobre ela como um sistema de arquivos de sobreposição. Usamos este guia e é assim:
#!/bin/busybox sh
mount -t proc none /proc
mount -t sysfs none /sys
# Mount the root filesystem.
mount -t squashfs -o ro /dev/sda2 /mnt/overlay
# (some stuff to set up the overlay with tmpfs is done here)
# Clean up.
umount /proc
umount /sys
# Boot the real thing.
exec switch_root /mnt/overlay /sbin/init
Ele inicializa normalmente e tudo funciona desde que este seja o único disco no sistema, já que /dev/sda2
é sempre a partição raiz em um sistema com apenas um disco.
Estamos trabalhando em um sistema de atualização automática, pois essa instalação personalizada será enviada para outras cidades e, idealmente, nossos clientes devem poder atualizar o sistema simplesmente inserindo um dispositivo USB e aguardando a atualização. Atualizações pela Internet não são uma opção. Manter os nossos dados seguros é uma prioridade e acreditamos que o esquema de partição que escolhemos é suficientemente seguro para as nossas necessidades, embora estejamos abertos a novas ideias, se isso significar a resolução do nosso problema:
O sistema de atualização do pendrive é uma cópia da instalação original do Gentoo e usa exatamente o mesmo esquema de partição. No entanto, o script initramfs no pendrive USB fica confuso e geralmente escolhe a raiz da instalação original, não a raiz do atualizador USB. Obviamente, o programa de atualização (que está na raiz do pen drive) nunca será executado assim.
Tentamos substituir /dev/sda2
no script initramfs do pendrive USB por
-
/dev/disk/by-id/usb*part2
, que já funciona no menu do GRUB2 mas não funciona no script initramfs porque /dev/disk
não existe neste ponto (a propósito, por que existe no GRUB?)
-
$(findfs PARTUUID="partid-of-usb-squashfs-root")
, não funcionou
-
$(findfs UUID="x")
, que funcionaria se as partições do squashf tivessem um UUID do sistema de arquivos (isso funciona com o ext4 e outros sistemas de arquivos)
O guia sugere o uso de devtmpfs ou mdev para preencher /dev
no momento do init, mas não sabemos como isso ajuda porque /dev/disk
parece ser o trabalho do udev e iniciar um devtmpfs
do script initramfs não parece ajudar.
Como podemos obter nomes de partição previsíveis / persistentes em um script initramfs quando a partição raiz não tem um UUID de sistema de arquivos?
É um pouco difícil mudar nosso esquema de particionamento e não queremos que nossa raiz squashfs ou nossa partição / home fique visível para um usuário casual do Windows, mas tentaremos fazer algo se houver algo que nos permita para inicializar de forma confiável a partir da mesma partição toda vez, como LVM ou algo que não tenhamos pensado.