Red Hat 7.4:如何将 kickstart 文件注入 USB 介质以用于仅 UEFI 系统?

Red Hat 7.4:如何将 kickstart 文件注入 USB 介质以用于仅 UEFI 系统?

我正在尝试使用自定义的 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。

  • 将 USB 记忆棒格式化为标准的三分区硬盘驱动器。不过,我不知道如何使其可启动。

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

我的要求:

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

镜像文件不需要支持CD/DVD启动。

答案1

我现在已经完成了这个过程,感谢@托马斯·施密特的宝贵提示。

这是完整的过程。

概述

您必须修改原始 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文件,将参数添加到以append:开头的前两行ks=hd:LABEL=$VOLUMELABEL:/ks.cfg
  • inst.stage2在您找到的任何地方(可能是四个地方)更新该参数以供阅读: inst.stage2=hd:LABEL=$VOLUMELABEL
  • 您可能还想删除该menu default条目,以便您的图像默认InstallTest & 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.cfgefiboot.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 --uefiimplantisomd5

isohybrid --uefi $THISDIR/$VOLUMELABEL.iso
implantisomd5 $THISDIR/$VOLUMELABEL.iso

答案2

原创相对于 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 克隆中的版本。

其他发行版使用 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

答案3

我正在寻找一种xorriso无需其他依赖项即可本地使用的方法加达米亚克的答案是正确的。唯一的差异是步骤 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 文件注入到仅 UEFI 系统的 USB 介质中。

答案4

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

我在测试时发现了一个错误;如果源 ISO 可在 UEFI 和 Mac 上启动,则新 ISO 只能在 Mac 和旧版 BIOS 系统上启动。固定于这个公关但它尚未发布,但它是一个简单的 Python 脚本,如果安装了mkksiso其余部分,您可以单独下载。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

相关内容