如何使用 mkimage 制作自定义 ISO 镜像
本文档解释了如何使用位于 aports 目录中的新 mkimage 脚本构建自定义 ISO 镜像。
先决条件
首先确保我们拥有所需的工具
apk add alpine-sdk alpine-conf syslinux xorriso squashfs-tools grub grub-efi doas
对于 efi,您应该添加以下内容
apk add mtools dosfstools grub-efi
创建一个用户(例如 build)并将其添加到 abuild 组
adduser build -G abuild
给予用户类似 root 的权限
vi /etc/doas.d/doas.conf
permit persist :abuild
切换到 build 用户
su - build
然后创建签名密钥(-i 将它们安装在 /etc/apk/keys 中,这是稍后需要的)
abuild-keygen -i -a
ls /etc/apk/keys/
克隆(或更新)git 仓库。
git clone --depth=1 https://gitlab.alpinelinux.org/alpine/aports.git
确保 apk 索引是最新的(以便 apk 可以找到软件包)
doas apk update
确保您的 /tmp 足够大。如果您有默认的 1GB /tmp,则创建一个本地的,使用
mkdir -pv ~/tmp export TMPDIR=~/tmp
配置
mkimg 脚本附带预配置的配置文件。
格式为 mkimg.$PROFILENAME.sh
为了拥有自定义 ISO,您应该创建自己的 mkimg.$PROFILENAME.sh 脚本。
这是一个用于制作 ZFS 模块、overlayfs(它为 /lib/modules 启用 r/w 模式)、串行控制台输出和一些其他有用的 apks 以构建简单 NAS 的示例
export PROFILENAME=nas
cat << EOF > ~/aports/scripts/mkimg.$PROFILENAME.sh profile_$PROFILENAME() { profile_standard kernel_cmdline="unionfs_size=512M console=tty0 console=ttyS0,115200" syslinux_serial="0 115200" kernel_addons="zfs" apks="\$apks iscsi-scst zfs-scripts zfs zfs-utils-py cciss_vol_status lvm2 mdadm mkinitfs mtools nfs-utils parted rsync sfdisk syslinux util-linux xfsprogs dosfstools ntfs-3g " local _k _a for _k in \$kernel_flavors; do apks="\$apks linux-\$_k" for _a in \$kernel_addons; do apks="\$apks \$_a-\$_k" done done apks="\$apks linux-firmware" } EOF
将脚本设置为可执行
chmod +x ~/aports/scripts/mkimg.$PROFILENAME.sh
在启动时使软件包可用
可以通过定义 apkovl 的生成来使软件包在 live 系统中可用,apkovl 包含相应的 /etc/apk/world 文件,并将该 overlay 定义添加到 mkimg-profile 中,例如使用 `apkovl="genapkovl-mkimgoverlay.sh"`
请注意,要*使用*您添加的 apks,您必须使用 apk add
安装它们。
该定义可以像 genapkovl-dhcp.sh 示例中那样完成。将相关部分(包括 rc_add 行)复制到 `genapkovl-mkimgoverlay.sh` 文件中,并在 /etc/apk/world 的文件内容中为应在 live 系统中安装的软件包添加单独的行。
cp ~/aports/scripts/genapkovl-dhcp.sh ~/aports/scripts/genapkovl-mkimgoverlay.sh
编辑文件以添加
... mkdir -p "$tmp"/etc/apk makefile root:root 0644 "$tmp"/etc/apk/world <<EOF alpine-base <apk1-service> <apk2-service> EOF ... rc_add <apk1-service> boot rc_add <apk2-service> boot ...
在相关位置。
然后编辑上面的配置文件构建脚本并添加
apkovl="aports/scripts/genapkovl-mkimgoverlay.sh"
紧接在最后一个 apks= 行之后。
创建 ISO
mkimage.sh [--tag RELEASE] [--outdir OUTDIR] [--workdir WORKDIR] [--arch ARCH] [--profile PROFILE] [--hostkeys] [--simulate] [--repository REPO] [--extra-repository REPO] [--yaml FILE] mkimage.sh --help options: --arch 指定要构建的架构镜像(默认:x86_64) --hostkeys 将系统 apk 签名密钥复制到创建的镜像 --outdir 指定创建镜像的目录 --profile 指定要构建的配置文件 --repository 用于创建镜像的软件包仓库 --extra-repository 添加要从中搜索软件包的仓库 --simulate 不执行命令 --tag 为标签 RELEASE 构建镜像 --workdir 指定临时工作目录(缓存) --yaml 已知配置文件:ali rpi uboot base minirootfs standard vanilla extended virt xen
在您的 home 目录中创建一个 iso 目录
mkdir -p ~/iso
然后创建实际的 ISO。在此示例中,我们将使用 edge 版本 x86_64
sh aports/scripts/mkimage.sh --tag edge \ --outdir ~/iso \ --arch x86_64 \ --repository https://dl-cdn.alpinelinux.org/alpine/edge/main \ --profile $PROFILENAME
注释
- 如果您想制作自定义安装程序,则需要创建
.default_boot_services
,这将导致mkinitfs
为 live 镜像创建默认值。
- 本文档的几个部分可以使用脚本自动化,例如仓库/架构/输出目录设置。
这些步骤留给您和您的想象力 :)
测试您的 ISO 镜像
QEMU 对于快速测试您新创建的 ISO 镜像非常有用。此 ISO 构建过程已经过测试,可以工作并生成一个带有自动安装 APK 的 ISO,截至 2023 年 11 月 20 日,使用 Alpine edge。