如何使用 mkimage 制作自定义 ISO 镜像

来自 Alpine Linux

本文档解释了如何使用位于 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

提示: 确保您的公钥放置在 /etc/apk/keys/ 中(例如:build-xxxxxxxx.rsa.pub)

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

提示: 您可以多次使用 --repository 选项,这在混合本地和官方仓库时非常有用。--extra-repository 选项仅用于向后兼容。

在您的 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。

参见