Estou tentando construir uma imagem de instalação (para ser transferida para a mídia USB) para o Red Hat Linux 7.4 com um arquivo de kickstart personalizado e o ks=
argumento correspondente adicionado ao grub, mas não consigo descobrir como fazer isso.
Aqui estão as abordagens que tentei:
dd if=rhel-server-7.4-x86_64-dvd.iso of=/dev/sdb
Isso cria um stick USB inicializável, mas é claro sem o arquivo kickstart.
Em seguida, copiei o conteúdo do ISO para um arquivo temporário, adicionei o meu ks.cfg
e modifiquei a configuração do grub e usei genisoimage
para reconstruir uma nova imagem.
genisoimage \
-untranslated-filenames \
-rational-rock \
-v \
-translation-table \
-input-charset "default" \
-J \
-joliet-long \
$VOLLABELARGS
-b isolinux/isolinux.bin \
-c isolinux/boot.cat \
-no-emul-boot \
-boot-load-size 4 \
-boot-info-table \
-eltorito-alt-boot \
-efi-boot images/efiboot.img \
-no-emul-boot \
-o $THISDIR/$VOLLABEL.iso \
Isso é baseado nas próprias instruções da Red Hat para RHEL 6 - estou, é claro, usando RHEL 7. Isso funciona para inicialização do BIOS, mas quando tento no sistema UEFI, a imagem resultante é rejeitada como "não compatível".
A imagem resultante também é visivelmente maior que o RHEL ISO original.
Examiná-lo xorriso
mostra que também é substancialmente diferente do original. isohybrid
ajuda um pouco, mas não o suficiente para tornar a imagem inicializável.
A saída xorriso -report
do ISO da Red Hat:
xorriso -indev rhel-server-7.4-x86_64-dvd.iso -report_el_torito cmd
-volid 'RHEL-7.4 Server.x86_64'
-volume_date uuid '2017071101014600'
-boot_image isolinux system_area=--interval:imported_iso:0s-15s:zero_mbrpt,zero_gpt:'rhel-server-7.4-x86_64-boot.iso'
-boot_image any partition_cyl_align=on
-boot_image any partition_offset=0
-boot_image any partition_hd_cyl=64
-boot_image any partition_sec_hd=32
-boot_image any iso_mbr_part_type=0x00
-boot_image any cat_path='/isolinux/boot.cat'
-boot_image isolinux bin_path='/isolinux/isolinux.bin'
-boot_image any platform_id=0x00
-boot_image any emul_type=no_emulation
-boot_image any load_size=2048
-boot_image any boot_info_table=on
-boot_image any next
-boot_image any efi_path='/images/efiboot.img'
-boot_image any platform_id=0xef
-boot_image any emul_type=no_emulation
-boot_image any load_size=9211904
-boot_image isolinux partition_entry=gpt_basdat
E a saída da xorriso
minha imagem:
xorriso -indev myimage.iso -report_el_torito cmd
-volid '"MYIMAGE"'
-volume_date uuid '2018011923504500'
-boot_image isolinux system_area=--interval:imported_iso:0s-15s:zero_mbrpt:'MYIMAGE.iso'
-boot_image any partition_cyl_align=on
-boot_image any partition_offset=0
-boot_image any partition_hd_cyl=64
-boot_image any partition_sec_hd=32
-boot_image any iso_mbr_part_type=0x17
-boot_image any cat_path='/isolinux/boot.cat'
-boot_image isolinux bin_path='/isolinux/isolinux.bin'
-boot_image any platform_id=0x00
-boot_image any emul_type=no_emulation
-boot_image any load_size=2048
-boot_image any boot_info_table=on
-boot_image any next
-boot_image any efi_path='/images/efiboot.img'
-boot_image any platform_id=0xef
-boot_image any emul_type=no_emulation
-boot_image any load_size=9211904
Comparando esses dois, a Red Hat tem algumas entradas relacionadas ao GPT que estão faltando na minha imagem.
Eu examinei outras abordagens, mas nem tenho certeza se estou indo na direção errada com elas.
Usando lorax/livemedia-creator. Acho as instruções bastante confusas. Parece ser usado para criar uma imagem ao vivo, mas não consigo descobrir como invocar o Anaconda.
Formate o stick USB como um disco rígido padrão de três partições. Não consigo descobrir como tornar isso inicializável, no entanto.
Qual é a melhor/mais fácil maneira de realizar o que eu quero?
Meus requisitos:
- Deve ser a linha de comando do Linux; Eu quero fazer um script desse processo.
- Deve gerar um arquivo de imagem, não quero gravar diretamente no meu script USB se puder evitá-lo.
- Deve ser capaz de executar como usuário não root.
O arquivo de imagem não precisa suportar inicialização de CD/DVD.
A vantagem decisiva do original sobre o remake de genisoimage está provavelmente na linha
genisoimage não pode criar tabelas de partições para EFI. (Inspecione ambos os ISOs por "/sbin/fdisk -l" para ver a diferença.) Você realmente precisa da partição MBR do tipo 0xef. Mas a tradição é também adicionar um GPT inválido e, portanto, inútil.
Uma maneira de obter as tabelas de partição seria executar após o genisoimage
O programa deriva da fonte SYSLINUX. Deve-se usar a versão do mesmo release de origem ou git clone do qual deriva "isolinux.bin".
Outras distribuições usam a emulação mkisofs do xorriso com as opções de inicialização que este comando xorriso informa:
Haverá um endereço longo para a opção -isohybrid-mbr:
Ele diz ao xorriso para usar os primeiros 32 KiB do ISO original como modelo MBR e mais área do sistema. Normalmente é o arquivo SYSLINUX "isohdpfx.bin", que possui apenas 432 bytes. Você pode substituí-lo por "mbr.bin" depois de copiar os primeiros 432 bytes:
Agora concluí o processo, graças à dica inestimável de @ Thomas Schmitt .
Aqui está o processo completo.
Visão geral
Você deve modificar três arquivos no DVD original da Red Hat:
isolinux/isolinux.cfg
EFI/BOOT/grub.cfg
images/efiboot.img
Decida o rótulo de volume que deseja usar. O rótulo do volume deve ter menos de 14 caracteres.
Em seguida, use
genisoimage
para criar o novo ISO com esse rótulo de volume, useisohybrid --uefi
para torná-lo compatível com UEFI e useimplantisomd5
para atualizar a soma de verificação corretaPasso a passo
Eu escrevi isso, mas o script é muito específico para a nossa situação, então não faz sentido publicá-lo.
fuseiso
.VOLUMELABEL
para o rótulo de volume escolhido.Edite o
isolinux.cfg
arquivo. Este arquivo será usado para inicialização do BIOS.isolinux.cfg
arquivo, adicionando o argumento às duas primeiras linhas que começam comappend
:ks=hd:LABEL=$VOLUMELABEL:/ks.cfg
.inst.stage2
argumento onde quer que você o encontre (provavelmente quatro lugares) para ler:inst.stage2=hd:LABEL=$VOLUMELABEL
.menu default
entrada para que sua imagem seja padronizada emInstall
vez deTest & Install
.Edite o
grub.cfg
arquivo. Este arquivo será usado para inicialização EFI. Observe que este arquivo (e tudo emEFI/BOOT
) existirá duas vezes: uma vez na imagem normal do DVD e também dentro doefiboot.img
arquivo.linuxefi
.inst.stage2
argumento onde quer que você o encontre (provavelmente quatro lugares) para ler:inst.stage2=hd:LABEL=$VOLUMELABEL
.search
emgrub.cfg
.Edite o
efiboot.img
arquivo. Na verdade, isso será inicializado pelo EFI.efiboot.img
arquivo. Infelizmente, não encontrei uma maneira de fazer isso com ofusermount
, então você precisa ser root para fazer isso.grub.cfg
para oefiboot.img
arquivo emEFI/BOOT
efiboot.img
arquivo.Agora você pode gerar a imagem ISO.
Os argumentos para
genisoimage
são sensíveis à posição. Pontos-chave: Eu baseio a imagem no arquivo ISO montado original (montado como$TMPDIR
), então uso-m
para excluir os três arquivos modificados e uso pontos de enxerto para inserir as modificações, bem como o arquivo kickstart, na imagem. Na minha imagem, também removi os complementos do diretório.Então use
isohybrid --uefi
eimplantisomd5
:Com base nas respostas de Thomas e Kevin , consegui obter um procedimento de trabalho baseado em
xorriso
, que está disponível na EPEL. Meus objetivos eram semelhantes aos de Kevin:Testado com sucesso com RHEL 7.5 e 7.6.
Procedimento passo a passo
xorriso
instalado a partir de EPEL.$ISO_SRC
.ks.cfg
) e scripts prontos em$SCRIPTS
.Extraia os arquivos, que precisam ser personalizados, do ISO para
$FILES
:isolinux/isolinux.cfg
EFI/BOOT/grub.cfg
images/efiboot.img
Modifique os
*.cfg
arquivos de configuração de inicialização em$FILES
:Observação: não modifico o rótulo do disco (ou o ID do volume) intencionalmente. É sensível ao espaço (potencialmente qualquer caractere especial) e achei mais fácil reutilizá-lo em vez de substituí-lo.
adicione o parâmetro kickstart ao comando de inicialização
'(.*)(hd:LABEL=\S+)(.*)'
→'\1\2 inst.ks=\2:/$SCRIPTS/ks.cfg\3'
definir menu de inicialização padrão para inicialização herdada em
isolinux.cfg
'^\s*menu default\s*\n'
→''
definir menu de inicialização padrão para inicialização UEFI em
grub.cfg
'set default=.*'
→'set default="0"'
Modifique a imagem de inicialização UEFI
images/efiboot.img
em$FILES
:$FILES/EFI/BOOT/grub.cfg
neleCrie sua imagem personalizada:
O comando copia o conteúdo da imagem ISO de origem
$ISO_SRC
, mescla o conteúdo dos diretórios locais e repete todas as configurações de inicialização da origem para a imagem de destino$ISO_DST
. Nenhuma outra etapa é necessária.Nota sobre
geniso
o métodoTive dificuldade em seguir o
geniso
método descrito por Kevin . Consegui produzir a imagem ISO de saída, porém,geniso
estava reclamando de não conseguir modificar aisolinux.bin
imagem, daí tive que extraí-la também. Isso não é mencionado no procedimento.Enfrentei a parede ao habilitar a inicialização UEFI com
isohybrid
. Ele retornou um erro para o qual não encontrei uma solução alternativa:função ansible
Eu criei uma função Ansible, que executa a tarefa: build_boot_iso .
Eu estava procurando uma maneira de usar nativamente
xorriso
sem outras dependências e a resposta de gadamiak está correta. A única discrepância é a Etapa 7, que deve refletir:A ordem é importante, portanto, se
-boot_image any replay
for especificado após-map
, os diretórios mapeados serão substituídos pelo conteúdo ISO padrão.Aqui está um link para o meu repositório GitHub que contém um script bash que injeta um arquivo kickstart na mídia USB para o sistema somente UEFI.
Agora existe uma abordagem mais simples que provavelmente funcionaria bem com os ISOs do RHEL/CentOS e do Fedora -- já que faz parte do
lorax
projeto que o RHEL e o Fedora usam para criar seus ISOs em primeiro lugar, mkksiso . Eu só testei no Fedora 32 embora.There's a bug I discovered when testing it; if the source ISO is bootable on both UEFI and Macs, the new ISO is only bootable on Macs and on legacy BIOS systems. Fixed in this PR but it's not released yet, but
mkksiso
is a simple Python script that you can just download separately if the rest oflorax
is installed.Injecting a kickstart is now as simple as:
see e.g. https://github.com/michel-slm/luks-kickstarts/blob/master/rebuild.sh