我正在尝试使用自定义的 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 -report
Red 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 引导。
原版相对于 genisoimage 翻拍的决定性优势可能就在眼前
genisoimage 无法为 EFI 创建分区表。(通过“/sbin/fdisk -l”检查两个 ISO 以查看差异。)您实际上需要 0xef 类型的 MBR 分区。但传统是添加一个无效且因此无用的 GPT。
获取分区表的一种方法是在 genisoimage 之后运行
该程序源于 SYSLINUX 源。应该使用来自“isolinux.bin”的相同源版本或 git clone 的版本。
其他发行版使用 xorriso 的 mkisofs 仿真和此 xorriso 命令告诉的引导选项:
选项 -isohybrid-mbr 将有一个冗长的地址:
它告诉 xorriso 使用原始 ISO 的前 32 KiB 作为 MBR 模板和进一步的系统区域。通常是 SYSLINUX 文件“isohdpfx.bin”,只有 432 字节。您可以在自己复制前 432 个字节后将其替换为“mbr.bin”:
感谢@Thomas Schmitt的宝贵提示,我现在已经完成了这个过程。
这是完整的过程。
概述
您必须修改原始 Red Hat DVD 上的三个文件:
isolinux/isolinux.cfg
EFI/BOOT/grub.cfg
images/efiboot.img
确定要使用的卷标。卷标应少于 14 个字符。
然后使用
genisoimage
该卷标构建新的 ISO,isohybrid --uefi
使其与 UEFI 兼容,并用于implantisomd5
更新正确的校验和一步步
我已经编写了这个脚本,但是脚本非常适合我们的情况,所以发布它没有意义。
fuseiso
。VOLUMELABEL
为您选择的卷标。编辑
isolinux.cfg
文件。该文件将用于 BIOS 引导。isolinux.cfg
开头的前两行。append
ks=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文件插入到镜像中。在我的图像中,我还删除了目录插件。然后使用
isohybrid --uefi
和implantisomd5
:根据Thomas和Kevin的回答,我设法获得了一个基于
xorriso
EPEL 的工作程序。我的目标与凯文的类似:使用 RHEL 7.5 和 7.6 成功测试。
一步一步的过程
xorriso
已从 EPEL 安装。$ISO_SRC
.ks.cfg
) 和脚本$SCRIPTS
。将需要自定义的文件从 ISO 提取到
$FILES
:isolinux/isolinux.cfg
EFI/BOOT/grub.cfg
images/efiboot.img
修改
*.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"'
修改 UEFI 启动
images/efiboot.img
映像$FILES
:$FILES/EFI/BOOT/grub.cfg
到其中构建您的自定义图像:
该命令复制源 ISO 映像
$ISO_SRC
的内容,合并本地目录的内容并将所有引导设置从源重播到目标映像$ISO_DST
。不需要进一步的步骤。geniso
方法说明我很难遵循Kevin
geniso
描述的方法。我设法生成了输出 ISO 映像,但是抱怨无法修改映像,因此我也必须将其提取出来。程序中没有提到这一点。geniso
isolinux.bin
我在启用 UEFI 启动时遇到了困难
isohybrid
。它返回了一个错误,我没有找到解决方法:Ansible 角色
我确实创建了一个 Ansible 角色,它执行以下任务:build_boot_iso。
我正在寻找一种在
xorriso
没有其他依赖项的情况下本地使用的方法,而gadamiak 的答案是正确的。唯一的差异是第 7 步,它应该反映:顺序很重要,因此如果
-boot_image any replay
在 之后指定-map
,则映射目录将被默认 ISO 内容覆盖。这是一个指向我的 GitHub 存储库的链接,其中包含一个 bash 脚本,该脚本将一个 kickstart 文件注入到 USB 媒体中,用于仅 UEFI 的系统。
现在有一种更简单的方法可能适用于 RHEL/CentOS 和 Fedora ISO——因为它
lorax
是 RHEL 和 Fedora 首先用来构建其 ISO 的项目mkksiso的一部分。我只在 Fedora 32 上测试过。我在测试时发现了一个错误;如果源 ISO 在 UEFI 和 Mac 上均可启动,则新 ISO 仅可在 Mac 和旧版 BIOS 系统上启动。此 PR中已修复但尚未发布,但它
mkksiso
是一个简单的 Python 脚本,如果安装了其余部分,您可以单独下载lorax
。注入 kickstart 现在很简单:
参见例如https://github.com/michel-slm/luks-kickstarts/blob/master/rebuild.sh