我正在尝试使用自定义的 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。
将 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
条目,以便您的图像默认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
原创相对于 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,因为它是lorax
RHEL 和 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