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:
- Eu uso o packer e um arquivo kickstart para instalar o CentOS 7
- Eu uso um script de provisionamento de packer para compilar algumas coisas binárias que preciso na imagem
- 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 \;
- 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 dracut
mas 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/fstab
da máquina original, o que espero que o Google me ajude a resolver:D
Atualização 3
Simplesmente ignorar /etc/fstab
along /dev
e /proc` ao fazer o squashfs resolveu o problema - o ISO final inicializa com sucesso no modo UEFI.