测试修改后的安装镜像和软件包

来自 Alpine Linux

概述

修改作为无盘启动安装一部分的软件包(例如在安装介质上),或者可以被引导过程接受的参数,比修改单个软件包要复杂一些,特别是对于网络启动镜像。作者在处理 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 安装到自己的构建环境中。
  • 使用来自 aportsscripts/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 并根据需要调整路径。