Inicializando um sistema de arquivos compactado a partir de ISO

Inicializando um sistema de arquivos compactado a partir de ISO

Estou tentando criar um CD ISO inicializável UEFI com um sistema de arquivos compactado a partir de uma máquina virtual, que forneci com o que preciso.

Explicar:

  1. Eu uso o packer e um arquivo kickstart para instalar o CentOS 7
  2. Eu uso um script de provisionamento de packer para compilar algumas coisas binárias que preciso na imagem
  3. Eu segui as instruções deaquipara criar uma imagem compactada do sistema de arquivos depois que tudo que preciso estiver no sistema operacional:
mkdir -p /mnt/squashfs /squashfs
mount -o bind / /mnt/squashfs

mksquashfs /mnt/squashfs /squashfs/filesystem.squashfs -comp gzip -no-exports -xattrs -noappend -no-recovery -e /mnt/squashfs/squashfs/filesystem.squashfs
find /boot -name 'vmlinuz-*' -type f -exec cp {} /squashfs/vmlinuz \;
find /boot -name 'init*' -type f -exec cp {} /squashfs/initrd.img \;
  1. Depois disso peguei alguns scripts deaquipara construir uma ISO:
yum -y install xorriso dosfstools grub2-efi-modules mtools

mkdir -p /iso /iso_src/ /iso_src/live
find /boot -name 'vmlinuz-*' -type f -exec cp {} /iso_src/vmlinuz \;
find /boot -name 'init*' -type f -exec cp {} /iso_src/initrd.img \;
cp /squashfs/filesystem.squashfs /iso_src/live/
touch /iso_src/LINUX_CUSTOM

cat <<'EOF' >grub.cfg

search --set=root --file /LINUX_CUSTOM

insmod all_video

set default="0"
set timeout=30

menuentry "Custom Linux" {
    linux /vmlinuz boot=live toram=filesystem.squashfs quiet nomodeset
    initrd /initrd.img
}
EOF

grub2-mkstandalone \
    --format=x86_64-efi \
    --output=bootx64.efi \
    --locales="" \
    --fonts="" \
    "boot/grub/grub.cfg=grub.cfg"

 (dd if=/dev/zero of=efiboot.img bs=1M count=10 && \
    mkfs.vfat efiboot.img && \
    mmd -i efiboot.img efi efi/boot && \
    mcopy -i efiboot.img ./bootx64.efi ::efi/boot/
)

xorriso \
    -as mkisofs \
    -iso-level 3 \
    -full-iso9660-filenames \
    -volid "LINUX_CUSTOM" \
    -eltorito-alt-boot \
        -e EFI/efiboot.img \
        -no-emul-boot \
    -append_partition 2 0xef efiboot.img \
    -output "/iso/image.iso" \
    -graft-points \
        "/iso_src" \
        /EFI/efiboot.img=efiboot.img

Agora estou tentando inicializar esse ISO no VirtualBox com UEFI habilitado, mas falha com

Failed to switch root: Specified switch root path '/sysroot' does not seem to be an OS tree

Pelo que entendi, meu squashfs não foi montado? Eu sou meio novo nisso, então tenho uma compreensão parcial de todas as etapas, e parece que estou faltando alguma coisa, já que a única coisa que diz ao grub que em vez da máquina da qual eu fiz a imagem (onde havia um dispositivo de bloco real) agora preciso que meu sistema de arquivos venha de um arquivo squashfs toram.

Alguém pode fornecer dicas/exemplos sobre como resolver isso e fazer o sistema inicializar? Li muito sobre dracutmas não consegui entender como usá-lo nesse cenário? Ou isso é simplesmente um problema no arquivo de configuração do grub?

Atualizar

Depois de pesquisar no Google, mudei para o dracut, agora em meu script de provisionamento eu uso o dracut para gerar o initrd assim:

dracut -a dmsquash-live -N -m "kernel-modules base" --filesystems "squashfs" /dracut/initrd.dracut.img

e use a seguinte entrada de inicialização do grub (o initrd.img aqui é o initrd.dracut.img criado anteriormente):

menuentry "Custom Linux" {
    linux /vmlinuz root=live:/dev/sr0 rd.live.debug=1
    initrd /initrd.img
}

isso parece ir mais longe, mas falha comWarning: /dev/mapper/live-rw does not exist

Atualização 2

Parece que o CentOS 7 vem com um dracut mais antigo que suporta apenas o modo Live CD (veja The filesystem structure is traditionally expected to be:abaixo Booting live images, com o qual minha estrutura não estava em conformidade). Então recomecei com o CentOS 8, um dracut mais recente, que aguenta a estrutura que tenho e agora meu único problema na hora de inicializar é ter o /etc/fstabda máquina original, o que espero que o Google me ajude a resolver:D

Atualização 3

Simplesmente ignorar /etc/fstabalong /deve /proc` ao fazer o squashfs resolveu o problema - o ISO final inicializa com sucesso no modo UEFI.

informação relacionada