AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 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:如何将 kickstart 文件注入仅 UEFI 系统的 USB 介质?

  • 772

我正在尝试使用自定义的 kickstart 文件为 Red Hat Linux 7.4 构建安装映像(要传输到 USB 介质),并将相应的ks=参数添加到 grub,但不知道该怎么做。

以下是我尝试过的方法:

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

这构建了一个可启动的 USB 记忆棒,但当然没有 kickstart 文件。

接下来,我将 ISO 的内容复制到一个临时文件中,添加我的ks.cfg并修改了 grub 配置,然后用于genisoimage重建一个新的镜像。

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 \

这是基于 Red Hat 自己对 RHEL 6 的说明——当然,我使用的是 RHEL 7。这适用于 BIOS 引导,但是当我在 UEFI 系统上尝试时,生成的映像被拒绝为“不兼容”。

生成的图像也明显大于原始 RHEL ISO。

检查它xorriso表明它也与原版有很大不同。isohybrid帮助一些,但不足以使图像可启动。

xorriso -reportRed Hat ISO 上的输出:

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

xorriso我的图像上的输出:

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

比较这两者,Red Hat 有一些我的图像缺少的与 GPT 相关的条目。

我看过的其他方法,但我什至不确定我是否会朝着错误的方向前进。

  • 使用 lorax/livemedia-creator。我发现说明很混乱。它似乎用于构建实时图像,但我不知道如何调用 Anaconda。

  • 将 U 盘格式化为标准的三分区硬盘。不过,我不知道如何使这个可启动。

实现我想要的最好/最简单的方法是什么?

我的要求:

  • 必须是 Linux 命令行;我想编写这个过程的脚本。
  • 应该生成一个图像文件,如果可以避免的话,我不想直接写入我的 USB 脚本。
  • 应该能够以非root用户身份运行。

映像文件不需要支持 CD/DVD 引导。

rhel uefi
  • 5 5 个回答
  • 6964 Views

5 个回答

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

    原版相对于 genisoimage 翻拍的决定性优势可能就在眼前

    -boot_image isolinux partition_entry=gpt_basdat

    genisoimage 无法为 EFI 创建分区表。(通过“/sbin/fdisk -l”检查两个 ISO 以查看差异。)您实际上需要 0xef 类型的 MBR 分区。但传统是添加一个无效且因此无用的 GPT。

    获取分区表的一种方法是在 genisoimage 之后运行

    isohybrid --uefi $THISDIR/$VOLLABEL.iso

    该程序源于 SYSLINUX 源。应该使用来自“isolinux.bin”的相同源版本或 git clone 的版本。

    其他发行版使用 xorriso 的 mkisofs 仿真和此 xorriso 命令告诉的引导选项:

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

    选项 -isohybrid-mbr 将有一个冗长的地址:

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

    它告诉 xorriso 使用原始 ISO 的前 32 KiB 作为 MBR 模板和进一步的系统区域。通常是 SYSLINUX 文件“isohdpfx.bin”,只有 432 字节。您可以在自己复制前 432 个字节后将其替换为“mbr.bin”:

    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

    感谢@Thomas Schmitt的宝贵提示,我现在已经完成了这个过程。

    这是完整的过程。

    概述

    您必须修改原始 Red Hat DVD 上的三个文件:

    • isolinux/isolinux.cfg
    • EFI/BOOT/grub.cfg
    • images/efiboot.img

    确定要使用的卷标。卷标应少于 14 个字符。

    然后使用genisoimage该卷标构建新的 ISO,isohybrid --uefi使其与 UEFI 兼容,并用于implantisomd5更新正确的校验和

    一步步

    我已经编写了这个脚本,但是脚本非常适合我们的情况,所以发布它没有意义。

    • 使用 . 挂载原始 Red Hat DVD fuseiso。
    • 将环境变量设置VOLUMELABEL为您选择的卷标。
    • 将需要修改的三个文件复制到另一个位置。

    编辑isolinux.cfg文件。该文件将用于 BIOS 引导。

    • 编辑文件,将参数添加到以:isolinux.cfg开头的前两行。appendks=hd:LABEL=$VOLUMELABEL:/ks.cfg
    • inst.stage2将您找到的任何地方(可能是四个地方)的参数更新为: inst.stage2=hd:LABEL=$VOLUMELABEL.
    • 您可能还想删除该menu default条目,以便您的图像默认为Install而不是Test & Install.

    编辑grub.cfg文件。该文件将用于 EFI 引导。请注意,此文件(以及 中的所有内容EFI/BOOT)将存在两次:一次在普通 DVD 映像上,一次在efiboot.img文件内。

    • 将相同的参数添加到以 开头的前两行linuxefi。
    • inst.stage2将您找到的任何地方(可能是四个地方)的参数更新为: inst.stage2=hd:LABEL=$VOLUMELABEL.
    • search重要且容易忽略:还要编辑以in开头的行grub.cfg。

    编辑efiboot.img文件。这实际上将由 EFI 引导。

    • 挂载您的文件副本efiboot.img。不幸的是,我还没有找到一种方法来做到这一点fusermount,所以你必须是 root 才能做到这一点。
    • 将修改后的复制grub.cfg到efiboot.img文件下EFI/BOOT
    • 卸载文件的副本efiboot.img。

    现在您可以生成 ISO 映像了。

    的参数genisoimage是位置敏感的。要点:我把镜像建立在原来挂载的ISO文件(挂载为$TMPDIR)上,然后用-m排除三个修改过的文件,用嫁接点将修改后的文件和kickstart文件插入到镜像中。在我的图像中,我还删除了目录插件。

    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
    

    然后使用isohybrid --uefi和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

    根据Thomas和Kevin的回答,我设法获得了一个基于xorrisoEPEL 的工作程序。我的目标与凯文的类似:

    • 使用库存 RHEL 7 安装介质
    • 将 kickstart 和配置脚本植入到生成的图像中
    • 自动选择kickstart进行安装
    • 生成与 UEFI 引导兼容的映像
    • 使过程脚本化

    使用 RHEL 7.5 和 7.6 成功测试。

    一步一步的过程

    1. xorriso已从 EPEL 安装。
    2. 将 RHEL 7 安装 DVD 下载到$ISO_SRC.
    3. 准备好您的 kickstart( ks.cfg) 和脚本$SCRIPTS。
    4. 将需要自定义的文件从 ISO 提取到$FILES:

      • isolinux/isolinux.cfg
      • EFI/BOOT/grub.cfg
      • images/efiboot.img
    5. 修改*.cfg启动配置文件$FILES:

      注意:我不是故意修改光盘标签(或卷 ID)。它对空间敏感(可能是任何特殊字符),我发现重用它而不是替换它更容易。

      • 将 kickstart 参数添加到引导命令

        '(.*)(hd:LABEL=\S+)(.*)'→'\1\2 inst.ks=\2:/$SCRIPTS/ks.cfg\3'

      • 为传统启动设置默认启动菜单isolinux.cfg

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

      • 为 UEFI 启动设置默认启动菜单grub.cfg

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

    6. 修改 UEFI 启动images/efiboot.img映像$FILES:

      • 将其挂载在临时目录中
      • 将 UEFI 启动菜单复制$FILES/EFI/BOOT/grub.cfg到其中
      • 卸载
    7. 构建您的自定义图像:

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

      该命令复制源 ISO 映像$ISO_SRC的内容,合并本地目录的内容并将所有引导设置从源重播到目标映像$ISO_DST。不需要进一步的步骤。

    geniso方法说明

    我很难遵循Kevingeniso描述的方法。我设法生成了输出 ISO 映像,但是抱怨无法修改映像,因此我也必须将其提取出来。程序中没有提到这一点。genisoisolinux.bin

    我在启用 UEFI 启动时遇到了困难isohybrid。它返回了一个错误,我没有找到解决方法:

    $ 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
    

    Ansible 角色

    我确实创建了一个 Ansible 角色,它执行以下任务:build_boot_iso。

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

    我正在寻找一种在xorriso没有其他依赖项的情况下本地使用的方法,而gadamiak 的答案是正确的。唯一的差异是第 7 步,它应该反映:

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

    顺序很重要,因此如果-boot_image any replay在 之后指定-map,则映射目录将被默认 ISO 内容覆盖。

    这是一个指向我的 GitHub 存储库的链接,其中包含一个 bash 脚本,该脚本将一个 kickstart 文件注入到 USB 媒体中,用于仅 UEFI 的系统。

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

    现在有一种更简单的方法可能适用于 RHEL/CentOS 和 Fedora ISO——因为它lorax是 RHEL 和 Fedora 首先用来构建其 ISO 的项目mkksiso的一部分。我只在 Fedora 32 上测试过。

    我在测试时发现了一个错误;如果源 ISO 在 UEFI 和 Mac 上均可启动,则新 ISO 仅可在 Mac 和旧版 BIOS 系统上启动。此 PR中已修复但尚未发布,但它mkksiso是一个简单的 Python 脚本,如果安装了其余部分,您可以单独下载lorax。

    注入 kickstart 现在很简单:

    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/
    

    参见例如https://github.com/michel-slm/luks-kickstarts/blob/master/rebuild.sh

    • 1

相关问题

  • 为什么 Linux 会杀死我的进程?

  • linux redhat 7 ( 或 centos 7 ) + firewalld 屏蔽防火墙

  • systemctl 命令在 RHEL 6 中不起作用

  • 如何在 RHEL 7 上离线安装 docker?

  • 在 Gnome3 中禁用窗口的自动最大化

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve