Red Hat 7.4: Como injetar o arquivo kickstart na mídia USB para o sistema somente UEFI?

2

Estou tentando construir uma imagem de instalação (para ser transferida para mídia USB) para o Red Hat Linux 7.4 com um arquivo de kickstart personalizado, e o argumento ks= correspondente adicionado ao grub, mas não consigo descobrir como faça isso.

Aqui estão as abordagens que tentei:

dd if=rhel-server-7.4-x86_64-dvd.iso of=/dev/sdb

Isso constrói o stick USB inicializável, mas é claro, sem o arquivo kickstart.

Em seguida, copiei o conteúdo do ISO para um arquivo temporário, adicionei 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 \

Isto é baseado nas próprias instruções da Red Hat para o RHEL 6 - eu estou, é claro, usando o RHEL 7. Isso funciona para a inicialização do BIOS, mas quando eu tento no sistema UEFI, a imagem resultante é rejeitada como "não compatível ".

A imagem resultante também é visivelmente maior que o ISO RHEL original.

O exame com xorriso mostra que também é substancialmente diferente do original. isohybrid ajuda alguns, mas não o suficiente para tornar a imagem inicializável.

A saída de xorriso -report no 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 de xorriso na 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 à GPT que minha imagem está faltando.

Outras abordagens que eu olhei, mas não tenho certeza se estou indo na direção errada com elas.

  • Usando o lorax / livemedia-creator. Eu acho as instruções bastante confusas. Parece ser usado para construir uma imagem ao vivo, mas não consigo descobrir como invocar o Anaconda.

  • Formate o dispositivo USB como um disco rígido padrão com três partições. Eu não consigo descobrir como tornar isso inicializável.

Qual é a maneira melhor / mais fácil de realizar o que eu quero?

Meus requisitos:

  • Deve ser a linha de comando do Linux; Eu quero roteirizar esse processo.
  • Se você quiser gerar um arquivo de imagem, não quero escrever diretamente no meu script USB se puder evitá-lo.
  • Deve ser capaz de ser executado como usuário não raiz.

O arquivo de imagem não precisa suportar a inicialização de CD / DVD.

    
por Kevin Keane 23.01.2018 / 01:24

2 respostas

2

A vantagem decisiva do remake original sobre genisoimage é provavelmente na linha

-boot_image isolinux partition_entry=gpt_basdat

genisoimage não pode criar tabelas de partição para o 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 é adicione também um GPT inválido e, portanto, inútil.

Uma forma de obter as tabelas de partições seria executar após genisoimage

isohybrid --uefi $THISDIR/$VOLLABEL.iso

O programa vem da fonte SYSLINUX. Deve-se usar a versão de o mesmo release de origem ou clone git do qual "isolinux.bin" se origina.

Outras distros usam a emulação mkisofs do xorriso com as opções de inicialização que este comando xorriso diz:

xorriso -indev rhel-server-7.4-x86_64-dvd.iso -report_el_torito as_mkisofs

Haverá um longo período de tempo na opção -isohybrid-mbr:

--interval:imported_iso:0s-15s:zero_mbrpt,zero_gpt:'rhel-server-7.4-x86_64-boot.iso

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 tem apenas 432 bytes. Você pode substituí-lo por "mbr.bin" depois de copiar o primeiro 432 bytes você mesmo:

dd if=rhel-server-7.4-x86_64-dvd.iso bs=432 count=1 of=mbr.bin
    
por 23.01.2018 / 10:27
1

Agora concluí o processo, graças à dica valiosa do @ 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 em um rótulo de volume que você 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, use isohybrid --uefi para torná-lo compatível com UEFI e use implantisomd5 para atualizar a soma de verificação correta

Passo a passo

Eu escrevi isso, mas o script é muito específico para a nossa situação, então não adianta postar isso.

  • Monte o DVD original da Red Hat usando fuseiso .
  • Defina uma variável de ambiente VOLUMELABEL para o rótulo de volume escolhido.
  • Copie os três arquivos que você precisa modificar para outro local.

Edite o arquivo isolinux.cfg . Este arquivo será usado para inicialização do BIOS.

  • Edite o arquivo isolinux.cfg , adicionando o argumento às duas primeiras linhas que começam com append : ks=hd:LABEL=$VOLUMELABEL:/ks.cfg .
  • Atualize o argumento inst.stage2 em todos os lugares que você encontrar (provavelmente quatro lugares) para ler: inst.stage2=hd:LABEL=$VOLUMELABEL .
  • Você também pode querer remover a entrada menu default para que a sua imagem seja padronizada como Install em vez de Test & Install .

Edite o arquivo grub.cfg . Este arquivo será usado para inicialização via EFI. Observe que esse arquivo (e tudo em EFI/BOOT ) existirá duas vezes: uma vez na imagem normal do DVD e também dentro do arquivo efiboot.img .

  • Adicione o mesmo argumento às duas primeiras linhas que começam com linuxefi .
  • Atualize o argumento inst.stage2 em todos os lugares que você encontrar (provavelmente quatro lugares) para ler: inst.stage2=hd:LABEL=$VOLUMELABEL .
  • IMPORTANTE E FÁCIL DE EXIBIR: também edite a linha que começa com search em grub.cfg .

Edite o arquivo efiboot.img . Isso realmente será inicializado pelo EFI.

  • Monte sua cópia do arquivo efiboot.img . Infelizmente, eu não encontrei uma maneira de fazer isso com fusermount , então você tem que ser root para fazer isso.
  • Copie o grub.cfg modificado no arquivo efiboot.img em EFI/BOOT
  • Montar sua cópia do arquivo efiboot.img .

Agora você pode gerar a imagem ISO.

Os argumentos para genisoimage são sensíveis à posição. Pontos principais: Baseio a imagem no arquivo ISO montado original (montado como $TMPDIR ), depois uso -m para excluir os três arquivos modificados e uso pontos de enxerto para inserir as modificações, bem como o arquivo de kickstart, em a imagem. Na minha imagem, eu também removi os addons do diretório.

genisoimage \
  -untranslated-filenames \
  -graft-points \
  -rational-rock \
  -v \
  -translation-table \
  -input-charset "default" \
  -J \
  -joliet-long \
  -V $VOLLABEL -A $VOLLABEL -volset $VOLLABEL \
  -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 \
  -quiet \
  -o $THISDIR/$VOLLABEL.iso \
  -m $TMPDIR/EFI/BOOT/grub.cfg \
  -m $TMPDIR/isolinux/isolinux.cfg \
  -m $TMPDIR/images/efiboot.img \
  -m addons \
  $TMPDIR \
  EFI/BOOT/grub.cfg=$TMPGRAFT/grub.cfg \
  isolinux/isolinux.cfg=$TMPGRAFT/isolinux.cfg \
  images/efiboot.img=$TMPGRAFT/efiboot.img \
  $KICKSTARTFILE=$KICKSTARTDIR/$KICKSTARTFILE

Em seguida, use isohybrid --uefi e implantisomd5 :

isohybrid --uefi $THISDIR/$VOLUMELABEL.iso
implantisomd5 $THISDIR/$VOLUMELABEL.iso
    
por 29.01.2018 / 20:05