Arrancar un sistema de archivos aplastado desde ISO

Arrancar un sistema de archivos aplastado desde ISO

Estoy intentando crear un CD ISO de arranque UEFI con un sistema de archivos aplastado desde una máquina virtual, que aprovisioné con lo que necesito.

Para explicar:

  1. Utilizo Packer y un archivo kickstart para instalar CentOS 7.
  2. Utilizo un script de provisión de empaquetador para compilar algunas cosas binarias que necesito en la imagen.
  3. Seguí las instrucciones deaquípara crear una imagen del sistema de archivos aplastada después de que todo lo que necesito esté en el sistema operativo:
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. Después de eso tomé algunos guiones deaquípara construir una 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

Ahora estoy intentando iniciar ese ISO en VirtualBox con UEFI habilitado, pero falla

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

Entonces, hasta donde tengo entendido, ¿mi squashfs no ha sido montado? Soy un poco nuevo en esto, así que tengo una comprensión parcial de todos los pasos, y siento que me falta algo, ya que lo único que le dice a grub que en lugar de la máquina desde la que hice la imagen (donde había un dispositivo de bloqueo real) ahora necesito que mi sistema de archivos provenga de un archivo squashfs toram.

¿Alguien puede proporcionar sugerencias/ejemplos sobre cómo resolver esto y hacer que este sistema arranque? Leí mucho sobre esto dracutpero no pude entender cómo usarlo en este escenario. ¿O se trata simplemente de un problema con el archivo de configuración de grub?

Actualizar

Después de buscar en Google, cambié a dracut, ahora en mi script de provisión uso dracut para generar initrd como este:

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

y use la siguiente entrada de arranque de grub (el initrd.img aquí es el initrd.dracut.img creado anteriormente):

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

esto parece ir más lejos pero falla conWarning: /dev/mapper/live-rw does not exist

Actualización 2

Parece que CentOS 7 viene con un dracut más antiguo que solo admite el modo Live CD (ver The filesystem structure is traditionally expected to be:más adelante Booting live images, al cual mi estructura no se ajustaba). Así que comencé de nuevo con CentOS 8, un dracut más nuevo, que puede manejar la estructura que tengo y ahora mi único problema al arrancar es tener /etc/fstabdesde la máquina original, que espero que Google me ayude a resolver:D

Actualización 3

Simplemente ignorar /etc/fstaby /dev/proc` al hacer squashfs funcionó: el ISO final arranca exitosamente en modo UEFI.

información relacionada