Estou tentando escrever um script que irá descompactar e reempacotar um ISO do FreeBSD para que eu possa fazer uma instalação com ele. O objetivo é uma instalação autônoma.
Eu tenho o seguinte script escrito, mas não funciona. Enquanto o ISO original inicializará no VirtualBox no modo UEFI, o ISO recém-criado não.
#!/bin/sh
inst_cfg="$1"
src_iso="$2"
dst_iso="$3"
iso_mnt=$(mktemp -d /tmp/freebsd-mnt-XXXXXX)
iso_wrk=$(mktemp -d /tmp/freebsd-wrk-XXXXXX)
vol_id=$(isoinfo -d -i "${src_iso}" | sed -n -e 's/^Volume id: \(.*\)$/\1/p')
md_name=$(mdconfig -a -t vnode -f "${src_iso}")
mount -t cd9660 "/dev/${md_name}" "${iso_mnt}"
cp -a -v "${iso_mnt}/" "${iso_wrk}"
cp "${inst_cfg}" "${iso_wrk}/etc/installerconfig"
mkisofs -J -R -no-emul-boot -V "${vol_id}" -b boot/cdboot -o "${dst_iso}" "${iso_wrk}"
umount "${iso_mnt}" # cd9660
mdconfig -d -u "${md_name}"
rm -rf "${iso_mnt}"
rm -rf "${iso_wrk}"
O sistema de arquivos criado parece bom. Eu diferenciei os arquivos dos ISOs originais e personalizados e as únicas diferenças são o installerconfig
arquivo adicionado e boot.catalog
(o que eu entendo mkisofs
acrescenta, mas por quê? Poderia ser esse o problema?)
Eu tentei várias combinações de opções para mkisofs
, incluindo -R -U
, -L -D -R
, -J -R
, mas nada faz diferença.
Além disso, o Manual do FreeBSD curiosamente tem o seguinte comentário:
Portanto, se /tmp/myboot contém um sistema FreeBSD inicializável com a imagem de inicialização em /tmp/myboot/boot/cdboot, este comando produziria /tmp/bootable.iso:
mkisofs -R -no-emul-boot -b boot/cdboot -o /tmp/bootable.iso /tmp/myboot
Isso não produz um ISO que inicializa no VirtualBox no modo UEFI.
Alguém tem ideia do que está errado?
Em vez de descompactar e compactar a iso, é muito mais fácil adicionar os arquivos extras criando outra sessão cd9660 em cima da imagem padrão:
Isso deve "herdar" a imagem de inicialização da sessão anterior, e novos arquivos com o mesmo caminho substituirão os que já estão no disco (mas apenas se forem mais recentes, ao usar o padrão
mkisofs
/genisoimage
).Observe que, a menos que o Volume Id da nova sessão seja igual ao anterior (como acima), o instalador do FreeBSD não montará o cd automaticamente, mas solicitará uma especificação fs com
mountroot>
.Eu testei o acima no qemu usando o firmware OVMF UEFI daqui , usando a seguinte linha de comando:
Se você realmente precisa criar um cd inicializável UEFI do zero, então você pode encontrar mais informações no wiki do FreeBSD (em "CD/DVD Boot under UEFI") e aqui .
Os growisofs quebrados do FreeBSD
Por causa de um bug,
growisofs
irá travar no FreeBSD quando usado com um arquivo normal ao invés de um dispositivo; para evitar isso, você deve aplicar este diff agrowisofs.c
(aplicar compatch -l
):O problema não está no conteúdo do sistema de arquivos, mas nos registros e partições de inicialização:
Tanto a imagem de inicialização do BIOS quanto a partição do sistema EFI não são arquivos no ISO, mas sim áreas de bloco sem nome.
Se você não seguir o caminho de anexar uma sessão por crescimento fixo ou por
então você precisa extrair essas áreas
(El Torito fornece LBAs em blocos de 2048, mas tamanhos em blocos de 512. 4 * 420 = 1680. O tamanho da imagem do BIOS de 1204 blocos de 2048 bytes é estimado pelo menor LBA de objeto do sistema de arquivos que está acima de 420. Possivelmente, é menor, mas qualquer tamanho grande não deve prejudicar.)
Depois, há o código MBR para inicialização do BIOS a partir do pendrive:
Se você não planeja inicializar pelo BIOS, bios_boot.img e mbr_code.img não são necessários.
Construindo um novo ISO a partir da árvore descompactada e mainpululada $HOME/files_for_iso e os arquivos de imagem extraídos
Isso não produzirá GPT, mas sim uma tabela de partição MBR com duas partições do tipo 0x83 para o sistema de arquivos ISO e 0xef para a partição do sistema EFI.
(Se o BIOS inicializa a partir do pendrive USB teria que ser testado. Muitos MBRs precisam de informações corrigidas para encontrar o próximo estágio dos programas de inicialização.)
O problema com muitos documentos sobre a criação de ISOs inicializáveis é que eles tendem a assumir inicialização não UEFI por padrão.
Aqui está uma boa referência que contém informações sobre a inicialização UEFI da mídia de CD/DVD: https://dev.lovelyhq.com/libburnia/libisofs/raw/master/doc/boot_sectors.txt
Portanto, parece que, se você quiser usar uma imagem de inicialização El Torito separada com UEFI (como costumava fazer com o BIOS), precisará garantir que a imagem de inicialização seja incorporada com um byte de ID de plataforma correto para UEFI. Para BIOS x86, o ID da plataforma era 0. Os PowerPCs usavam 1; o valor 2 foi designado para Macs; e UEFI especifica um valor de 0xef ou 239 em decimal.
Portanto, parece-me que você teria que ter alguma maneira de especificar o valor do ID da plataforma: diretamente ou usando alguma opção para especificar que a imagem de inicialização deve ser uma imagem de inicialização UEFI . Suponho que este documento do Fedora vinculado por mosvy faça isso usando a opção
-e
para especificar a localização emefiboot.img
vez de usar-b
como nas imagens de inicialização tradicionais do BIOS.Portanto, verifique se sua imagem de inicialização UEFI
boot/cdboot
é válida e tente usar na linha de comando em vez de .-e boot/cdboot
mkisofs
-b boot/cdboot
E aqui está uma descrição de como pode ser o conteúdo de uma imagem de inicialização UEFI:
Acontece que eu tenho uma imagem ISO do RHEL 8.0 beta 1 em mãos e acabei de confirmar que é de fato inicializável usando o VirtualBox no modo UEFI. A imagem de inicialização UEFI que ele usa está disponível no sistema de arquivos iso9660 principal das imagens como
images/efiboot.img
, e aparentemente contém apenas uma imagem do sistema de arquivos FAT, sem qualquer tipo de tabela de partição.Dentro do sistema de arquivos do
efiboot.img
, existe apenas um diretório\EFI\BOOT
com os bootloaders UEFI apropriados: neste caso, ambosBOOTX64.EFI
eBOOTIA32.EFI
, que parecem ser shims de inicialização segura, e versões correspondentes do GRUB comogrubx64.efi
egrubia32.efi
respectivamente, e quaisquer arquivos auxiliares exigidos por aqueles: o GRUB arquivo de configuração, o arquivo de fonte GRUB e o MOKManager para o shim Secure Boot.