测试修改后的安装镜像和软件包
概述
修改作为无盘启动安装一部分的软件包(例如在安装介质上),或者可以被引导过程接受的参数,比修改单个软件包要复杂一些,特别是对于网络启动镜像。作者在处理 feat: answerfile kernel cmdline parameter (#26) · Issues · alpine / mkinitfs · GitLab 时发现了这一点,他打开了一个 issue,请求/提议开发一个改进无人值守安装的功能,通过提供一个指向新的 answerfile
内核命令行参数的 URL,自动应用 setup-alpine
'answerfile'。
简单部分
- 通过修改 mkinitfs 中的
initramfs-init.in
和更新mkinitfs-bootparam.7.in
中的man
页面,更新安装程序使用内核命令行接受的选项列表。 - 使用
mkinitfs
中的make install
将新的mkinitfs
安装到自己的构建环境中。 - 使用来自 aports 的
scripts/mkimage.sh
和适当的参数构建新的镜像。 - 现在您有了一个可以接受您的新参数的镜像。
挑战 #1
- 在
answerfile
的情况下,还需要对firstboot
initscript 进行额外的更改,它是openrc
软件包的一部分。 - 这意味着构建一个新的
openrc
软件包并将其放入生成的镜像中。 - 为此,必须将
scripts/mkimage.sh
指向构建修改后的openrc
软件包时创建的软件包仓库。 - 这对于引导和安装期间使用的所有软件包都存在于安装介质上的镜像来说是足够的。
挑战 #2 (网络启动)
- 但是,对于网络启动,该过程更加复杂,因为
openrc
软件包必须在引导过程中从外部仓库下载。 - 这看起来很简单;人们可能会认为,只需将
openrc
构建期间创建的packages
目录放在 Web 服务器上,并使用alpine_repo=<仓库的_URI>
即可,但问题是alpine_repo
只接受单个仓库。 - 此外,软件包列表必须由出现在镜像中的密钥签名(使用
mkimage.sh
参数很容易做到这一点)。 - 这意味着必须在新仓库中包含所有网络启动和安装所需的所有软件包。
- 还有一个问题;必须在仓库中包含软件包的所有依赖项,否则软件包将无法安装。
创建必要的签名仓库的一种方法
识别网络启动所需的所有基础软件包
- 在
mkinitfs
仓库中,执行grep pkgs initfamfs-init.in
并记下 initramfs 可能使用的所有软件包。 - 在
aports
中,grep apks scripts/*
。这将识别mkimage.sh
脚本添加的所有基础软件包。 - 您还需要
linux-lts linux-virt wireless-regdb scanelf alpine-conf alpine-base openssl
识别基础软件包的所有依赖项
创建一个文件,其中包含基础软件包的列表,以空格分隔,放在一行上。例如,一个名为
~/base-packages.lst
的文件,其中包含package1 package2 package3
安装软件包
lua-aports
从
aports
中的软件包目录中,执行以下命令ap recursive-deps $(cat ~/base-packages.lst) >~/base-deps.lst
构建所有必需的软件包
在 aports
中创建所需的软件包目录列表
获取上述基础软件包和依赖项的列表,并创建一个文件,其中包含所有软件包,以空格分隔,放在一行上。对于上面的
~/base-deps.lst
,您可以这样做cat ~/base-deps.lst ~/base-pkgs.lst | tr $'\n' ' ' >~/oneline-deps.lst
从
aports
中的软件包目录中,执行以下命令ap builddirs $(cat ~/oneline-deps.lst) >~/packages-to-build.lst
为软件包仓库创建一个目录
<code class="fenced-code-block language-shell">mkdir -p ~/packages/main</code>
将此目录添加到系统 APK 仓库
注意:如果您没有在构建环境中使用最新的 (edge) Alpine,这将破坏某些东西
假设您的用户主目录是
/home/user
,那么在文件/etc/apk/repositories
中添加/home/user/packages/main
构建软件包
cd ~ for pdir in $(cat ~/packages-to-build.lst); do (cd $pdir && abuild -r -m | tee -a ~/build.log); done
构建网络启动镜像
从 aports
目录
./scripts/mkimage.sh --profile netboot --repository /home/user/packages/main
复制到您的网络启动服务器并进行网络启动
请参阅 使用 iPXE 网络启动 Alpine Linux 并根据需要调整路径。