AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 418974
Accepted
Kevin Keane
Kevin Keane
Asked: 2018-01-23 16:24:46 +0800 CST2018-01-23 16:24:46 +0800 CST 2018-01-23 16:24:46 +0800 CST

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

  • 772

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.cfge modifiquei a configuração do grub e usei genisoimagepara 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 xorrisomostra que também é substancialmente diferente do original. isohybridajuda um pouco, mas não o suficiente para tornar a imagem inicializável.

A saída xorriso -reportdo 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 xorrisominha 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.

rhel uefi
  • 5 5 respostas
  • 6964 Views

5 respostas

  • Voted
  1. Thomas Schmitt
    2018-01-24T01:27:25+08:002018-01-24T01:27:25+08:00

    A vantagem decisiva do original sobre o remake de genisoimage está provavelmente na linha

    -boot_image isolinux partition_entry=gpt_basdat

    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

    isohybrid --uefi $THISDIR/$VOLLABEL.iso

    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:

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

    Haverá um endereço longo para a opção -isohybrid-mbr:

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

    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:

    dd if=rhel-server-7.4-x86_64-dvd.iso bs=432 count=1 of=mbr.bin
    • 2
  2. Kevin Keane
    2018-01-30T11:05:00+08:002018-01-30T11:05:00+08:00

    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 genisoimagepara criar o novo ISO com esse rótulo de volume, use isohybrid --uefipara torná-lo compatível com UEFI e use implantisomd5para 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 faz sentido publicá-lo.

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

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

    • Edite o isolinux.cfgarquivo, adicionando o argumento às duas primeiras linhas que começam com append: ks=hd:LABEL=$VOLUMELABEL:/ks.cfg.
    • Atualize o inst.stage2argumento onde quer que você o encontre (provavelmente quatro lugares) para ler: inst.stage2=hd:LABEL=$VOLUMELABEL.
    • Você também pode remover a menu defaultentrada para que sua imagem seja padronizada em Installvez de Test & Install.

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

    • Adicione o mesmo argumento às duas primeiras linhas que começam com linuxefi.
    • Atualize o inst.stage2argumento onde quer que você o encontre (provavelmente quatro lugares) para ler: inst.stage2=hd:LABEL=$VOLUMELABEL.
    • IMPORTANTE E FÁCIL DE IGNORAR: Edite também a linha que começa com searchem grub.cfg.

    Edite o efiboot.imgarquivo. Na verdade, isso será inicializado pelo EFI.

    • Monte sua cópia do efiboot.imgarquivo. Infelizmente, não encontrei uma maneira de fazer isso com o fusermount, então você precisa ser root para fazer isso.
    • Copie o modificado grub.cfgpara o efiboot.imgarquivo emEFI/BOOT
    • Desmonte sua cópia do efiboot.imgarquivo.

    Agora você pode gerar a imagem ISO.

    Os argumentos para genisoimagesão sensíveis à posição. Pontos-chave: Eu baseio a imagem no arquivo ISO montado original (montado como $TMPDIR), então uso -mpara 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.

    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
    

    Então use isohybrid --uefie implantisomd5:

    isohybrid --uefi $THISDIR/$VOLUMELABEL.iso
    implantisomd5 $THISDIR/$VOLUMELABEL.iso
    
    • 2
  3. gadamiak
    2019-01-22T06:37:39+08:002019-01-22T06:37:39+08:00

    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:

    • Use uma mídia de instalação RHEL 7 padrão
    • Implante um kickstart e scripts de configuração na imagem resultante
    • Selecione o kickstart automaticamente para instalação
    • Produza uma imagem compatível com inicialização UEFI
    • Faça o procedimento com script

    Testado com sucesso com RHEL 7.5 e 7.6.

    Procedimento passo a passo

    1. Ter xorrisoinstalado a partir de EPEL.
    2. Baixe o DVD de instalação do RHEL 7 em formato $ISO_SRC.
    3. Tenha seu kickstart ( ks.cfg) e scripts prontos em $SCRIPTS.
    4. Extraia os arquivos, que precisam ser personalizados, do ISO para $FILES:

      • isolinux/isolinux.cfg
      • EFI/BOOT/grub.cfg
      • images/efiboot.img
    5. Modifique os *.cfgarquivos 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 emisolinux.cfg

        '^\s*menu default\s*\n'→''

      • definir menu de inicialização padrão para inicialização UEFI emgrub.cfg

        'set default=.*'→'set default="0"'

    6. Modifique a imagem de inicialização UEFI images/efiboot.imgem $FILES:

      • monte-o em um diretório temporário
      • copie o menu de inicialização UEFI $FILES/EFI/BOOT/grub.cfgnele
      • desmontar
    7. Crie sua imagem personalizada:

      xorriso \
        -indev "$ISO_SRC" \
        -map "$SCRIPTS" /"$SCRIPTS" \
        -map "$FILES" / \
        -boot_image any replay \
        -outdev "$ISO_DST"
      

      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 genisoo método

    Tive dificuldade em seguir o genisométodo descrito por Kevin . Consegui produzir a imagem ISO de saída, porém, genisoestava reclamando de não conseguir modificar a isolinux.binimagem, 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:

    $ isohybrid --uefi rhel-custom.iso
    isohybrid: rhel-custom.iso: boot loader does not have an isolinux.bin hybrid 
    signature. Note that isolinux-debug .bin does not support hybrid booting
    

    função ansible

    Eu criei uma função Ansible, que executa a tarefa: build_boot_iso .

    • 2
  4. Fauxsys
    2019-12-13T23:32:06+08:002019-12-13T23:32:06+08:00

    Eu estava procurando uma maneira de usar nativamente xorrisosem outras dependências e a resposta de gadamiak está correta. A única discrepância é a Etapa 7, que deve refletir:

    xorriso \
      -indev "$ISO_SRC" \
      -boot_image any replay \
      -map "$SCRIPTS" /"$SCRIPTS" \
      -map "$FILES" / \
      -outdev "$ISO_DST"
    

    A ordem é importante, portanto, se -boot_image any replayfor 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.

    • 1
  5. Best Answer
    michel-slm
    2020-07-17T11:24:31+08:002020-07-17T11:24:31+08:00

    Agora existe uma abordagem mais simples que provavelmente funcionaria bem com os ISOs do RHEL/CentOS e do Fedora -- já que faz parte do loraxprojeto 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 of lorax is installed.

    Injecting a kickstart is now as simple as:

    sudo dnf install lorax
    wget -cN https://raw.githubusercontent.com/weldr/lorax/master/src/sbin/mkksiso
    chmod +x mkksiso
    sudo ./mkksiso -V MyNewVolumeID path/to/kickstart path/to/orig.iso path/to/
    

    see e.g. https://github.com/michel-slm/luks-kickstarts/blob/master/rebuild.sh

    • 1

relate perguntas

  • Por que o Linux estaria matando meu processo?

  • linux redhat 7 (ou centos 7) + firewalld mascarar o firewall

  • comando systemctl não funciona no RHEL 6

  • Como instalo o docker no RHEL 7 offline?

  • Desativar a maximização automática de janelas no Gnome3

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve