跳转至内容

archiso

来自 ArchWiki

Archiso 是一个高度可定制的工具,用于构建 Arch Linux Live CD/USB ISO 镜像、网络启动工件和 bootstrap 压缩包。官方镜像是使用 archiso 构建的,并包含以下软件包。它可以作为救援系统、Linux 安装程序或其他系统的基础。这篇 wiki 文章介绍了如何安装 archiso,以及如何配置它来控制生成 ISO 镜像的各个方面,例如包含的软件包和文件。技术要求和构建步骤可以在官方项目文档中找到。Archiso 是使用许多 bash 脚本实现的。archiso 的核心组件是 mkarchiso 命令。其选项记录在 mkarchiso -h 中,此处不再赘述。

安装

安装 archiso 软件包。

准备自定义配置文件

注意: 您可以在 archiso 项目的 README.profile.rst 中深入了解配置文件。

Archiso 附带两个配置文件:relengbaseline

  • releng 用于创建官方的每月安装 ISO。它可以作为创建自定义 ISO 镜像的起点。
  • baseline 是一个最小配置,仅包含从介质启动 Live 环境所需的最低限度软件包。

要构建未经修改的配置文件版本,请直接跳至 #构建 ISO。否则,如果您希望调整或自定义 archiso 提供的配置文件之一,请将其从 /usr/share/archiso/configs/profile-name/ 复制到您选择的一个可写目录中。例如:

$ cp -r /usr/share/archiso/configs/releng/ archlive

继续阅读以下章节以自定义和构建自定义配置文件。

配置文件结构

archiso 配置文件包含定义生成的 ISO 镜像的配置。配置文件结构记录在 /usr/share/doc/archiso/README.profile.rst [1] 中。

选择软件包

编辑 packages.x86_64 来选择要在 Live 系统镜像中安装的软件包,逐行罗列软件包名称。

自定义本地仓库

要添加不在标准 Arch 仓库中的软件包(例如来自 AUR 或使用 ABS 自定义的软件包),请设置一个自定义本地仓库并将您的自定义软件包添加到其中。然后按如下方式将您的仓库添加到 pacman.conf

archlive/pacman.conf
...
[customrepo]
SigLevel = Optional TrustAll
Server = file:///path/to/customrepo
...
  • pacman.conf 中的顺序很重要。要给您的自定义仓库最高优先级,请将其放在其他仓库条目之上。
  • pacman.conf 仅用于构建镜像。它不会在 Live 环境中使用。要实现在 Live 环境中使用,请参见 #向镜像添加软件源
  • 确保仓库位于 chroot 后的 mkarchiso 进程可以访问的目录中(例如 /tmp),以确保在镜像构建过程中能正确读取仓库。
  • mkarchiso 将寻找一个名为 custom 的仓库,因此当您创建它时请运行:
 $ repo-add /path/to/custom.db.tar.zst /path/to/package-1.0-1-x86_64.pkg.tar.zst

来自 multilib 的软件包

要从 multilib 仓库安装软件包,只需取消 pacman.conf 中该仓库的注释即可。

向镜像添加文件

airootfs 目录被用作镜像上 Live 系统根目录 (/) 的起点。在安装软件包之前,其所有内容都将被复制到工作目录中。

将任何自定义文件和/或目录放在 airootfs/ 下所需的位置。例如,如果您当前系统中具有希望在 Live 镜像中使用的自定义 nftables 规则,请按如下方式复制它们:

$ cp /etc/nftables.conf archlive/airootfs/etc/

同样,对于位于层级结构深处的特殊配置文件,需要格外留意。缺失的目录结构部分可以简单地使用 mkdir(1) 创建。

提示: 要将文件添加到安装用户的家目录,请将其放在 archlive/airootfs/root/ 中。要将文件添加到所有其他用户的家目录,请将其放在 archlive/airootfs/etc/skel/ 中。
注意: 与软件包提供的文件冲突的自定义文件将被覆盖,除非软件包将其指定为备份文件

默认情况下,文件的权限将为 644,目录为 755。它们全部归 root 用户所有。要为特定文件和/或文件夹设置不同的权限或所有权,请在 profiledef.sh 中使用 file_permissions 关联数组。详情请参阅 README.profile.rst

向镜像添加软件源

要添加可在 Live 环境中使用的仓库,请创建一个经适当修改pacman.conf 并将其放置在 archlive/airootfs/etc/ 中。

如果仓库还使用了密钥,请将密钥放在 archlive/airootfs/usr/share/pacman/keyrings/ 中。密钥文件名必须以 .gpg 结尾。此外,密钥必须是受信任的。这可以通过在同一目录下创建一个 GnuPG 导出的信任文件来实现。文件名必须以 -trusted 结尾。第一列是密钥指纹,第二列是信任级别。您可以参考 /usr/share/pacman/keyrings/archlinux-trusted 作为示例。

archzfs 示例

本示例中的文件有:

airootfs
├── etc
│   ├── pacman.conf
│   └── pacman.d
│       └── archzfs_mirrorlist
└── usr
    └── share
        └── pacman
            └── keyrings
                ├── archzfs.gpg
                └── archzfs-trusted
airootfs/etc/pacman.conf
...
[archzfs]
Include = /etc/pacman.d/archzfs_mirrorlist
...
airootfs/etc/pacman.d/archzfs_mirrorlist
Server = https://archzfs.com/$repo/$arch
Server = https://mirror.sum7.eu/archlinux/archzfs/$repo/$arch
Server = https://mirror.biocrafting.net/archlinux/archzfs/$repo/$arch
Server = https://mirror.in.themindsmaze.com/archzfs/$repo/$arch
Server = https://zxcvfdsa.com/archzfs/$repo/$arch
airootfs/usr/share/pacman/keyrings/archzfs-trusted
DDF7DB817396A49B2A2723F7403BD972F75D9D76:4:

导入并信任密钥(在镜像构建期间或启动后的设置脚本中):

$ curl -O https://archzfs.com/archzfs.gpg
$ pacman-key --add archzfs.gpg
# pacman-key --lsign-key DDF7DB817396A49B2A2723F7403BD972F75D9D76

内核

虽然 archiso 包含的两个配置文件都只包含 linux,但 ISO 也可以制作成包含其他甚至多个内核

首先,编辑 packages.x86_64 以包含您想要的内核包名称。当 mkarchiso 运行时,它会将所有 work_dir/airootfs/boot/vmlinuz-*work_dir/boot/initramfs-*.img 文件包含在 ISO 中(并额外包含在用于 UEFI 启动的 FAT 镜像中)。

mkinitcpio 预设默认会构建 fallback initramfs 镜像。对于 ISO,主 initramfs 镜像通常不会包含 autodetect 钩子,因此没必要额外增加 fallback 镜像。为了防止创建 fallback initramfs 镜像(以免占用空间或减慢构建过程),请在 archlive/airootfs/etc/mkinitcpio.d/pkgbase.preset 中放置一个自定义预设。例如,对于 linux-lts

archlive/airootfs/etc/mkinitcpio.d/linux-lts.preset
PRESETS=('archiso')

ALL_kver='/boot/vmlinuz-linux-lts'
archiso_config='/etc/mkinitcpio.conf.d/archiso.conf'

archiso_image="/boot/initramfs-linux-lts.img"

最后创建引导加载程序配置以允许引导这些内核。

引导加载程序

Archiso 支持用于 BIOS 引导的 syslinux 以及用于 UEFI 引导的 GRUBsystemd-boot。有关其配置语法的信息,请参考各引导加载程序的文章。

提示
  • releng 配置文件默认构建的 ISO 在使用 El Torito 刻录到光盘,或者使用 Isohybrid 写入硬盘(或 USB 闪存盘等)时,同时支持 BIOS 和 UEFI 引导。
  • 由于 isolinux 的模块化特性,您可以使用大量插件,因为所有 .c32 文件都会被复制并可供您使用。查看 syslinux 官方网站archiso git 仓库。使用这些插件,可以制作出美观且复杂的菜单。参见 [2]

mkarchiso 期望 GRUB 配置位于 grub 目录,systemd-boot 配置位于 efiboot 目录,而 syslinux 配置位于 syslinux 目录。

UEFI 安全启动

如果您想让您的 archiso 在启用了 UEFI 安全启动的环境中可引导,您必须使用经过签名的引导加载程序。您可以按照 安全启动#引导安装介质 中的说明进行操作。

systemd 单元

要在 Live 环境中启用 systemd 服务/套接字/定时器,您需要像 systemctl enable 那样手动创建符号链接。

例如,要启用包含 WantedBy=multi-user.targetgpm.service,请运行:

$ mkdir -p archlive/airootfs/etc/systemd/system/multi-user.target.wants
$ ln -s /usr/lib/systemd/system/gpm.service archlive/airootfs/etc/systemd/system/multi-user.target.wants/

所需的符号链接可以通过读取 systemd 单元文件找到,或者如果您已经安装了该服务,可以通过启用它并观察 systemctl 的输出来确定。

登录管理器

在启动时启动 X 是通过启用您的登录管理器的 systemd 服务来完成的。如果您不知道要启用哪个 .service,如果您在构建 ISO 的系统上使用了相同的程序,您可以轻松找到它。只需使用:

$ ls -l /etc/systemd/system/display-manager.service

现在在 archlive/airootfs/etc/systemd/system/ 中创建相同的符号链接。对于 LXDM:

$ ln -s /usr/lib/systemd/system/lxdm.service archlive/airootfs/etc/systemd/system/display-manager.service

这将在您的 Live 系统启动时启用 LXDM。

修改自动登录

getty 自动登录的配置位于 airootfs/etc/systemd/system/getty@tty1.service.d/autologin.conf

您可以修改此文件来更改自动登录用户:

[Service]
ExecStart=
ExecStart=-/sbin/agetty --noreset --noclear --autologin username - ${TERM}

或者完全删除 autologin.conf 以禁用自动登录。

如果您使用的是串口控制台 (serial console),请创建 airootfs/etc/systemd/system/serial-getty@ttyS0.service.d/autologin.conf,内容如下:

[Service]
ExecStart=
ExecStart=-/sbin/agetty --noreset --noclear --autologin root --keep-baud 115200,57600,38400,9600 - ${TERM}

用户与密码

要创建一个在 Live 环境中可用的用户,您必须手动编辑 archlive/airootfs/etc/passwdarchlive/airootfs/etc/shadowarchlive/airootfs/etc/grouparchlive/airootfs/etc/gshadow

注意: 如果这些文件存在,它们必须包含 root 用户和组。

例如,要添加用户 archie。按照 passwd(5) 语法将其添加到 archlive/airootfs/etc/passwd

archlive/airootfs/etc/passwd
root:x:0:0:root:/root:/usr/bin/zsh
archie:x:1000:1000::/home/archie:/usr/bin/zsh
注意: passwd 文件必须以换行符结尾。

按照 shadow(5) 的语法将用户添加到 archlive/airootfs/etc/shadow。如果您想为该用户定义密码,请使用 openssl passwd -6 生成密码哈希并将其添加到文件中。例如:

archlive/airootfs/etc/shadow
root::14871::::::
archie:$6$randomsalt$cij4/pJREFQV/NgAgh9YyBIoCRRNq2jp5l8lbnE5aLggJnzIRmNVlogAg8N6hEEecLwXHtMQIl2NX2HlDqhCU1:14871::::::

否则,您可以保持密码字段为空,这意味着用户可以无需密码登录。

根据 group(5) 将用户的初始组及所属的其他组添加到 archlive/airootfs/etc/group。例如:

archlive/airootfs/etc/group
root:x:0:root
adm:x:4:archie
wheel:x:10:archie
uucp:x:14:archie
archie:x:1000:

根据 gshadow(5) 创建相应的 archlive/airootfs/etc/gshadow

archlive/airootfs/etc/gshadow
root:!*::root
archie:!*::

确保 /etc/shadow/etc/gshadow 具有正确的权限:

archlive/profiledef.sh
...
file_permissions=(
  ...
  ["/etc/shadow"]="0:0:0400"
  ["/etc/gshadow"]="0:0:0400"
)

安装软件包后,mkarchiso 将为 archlive/airootfs/etc/passwd 中列出的用户创建所有指定的家目录,并将 work_directory/x86_64/airootfs/etc/skel/* 复制到其中。复制的文件将具有正确的用户和组所有权。

键盘布局 (Keymaps)

要更改 Live 系统控制台的默认键盘布局,请添加包含所需布局的 vconsole.conf。有关详细信息和更多选项,请查看 Linux 控制台/键盘配置vconsole.conf(5)

例如,要将控制台和 X11 的默认键盘布局更改为德国布局 (de-latin1),请创建包含以下内容的 archlive/airootfs/etc/vconsole.conf

archlive/airootfs/etc/vconsole.conf
KEYMAP=de-latin1
XKBLAYOUT=de

语言区域 (Locales)

要更改 Live 系统的语言区域 (locale),您必须首先启用并生成本地化文件。为此,您必须添加一个包含所需 locale 的自定义 locale.gen,并在 Live 系统中运行 locale-gen。这样您也可以更改系统的默认语言区域。

例如,要启用 de_DE.UTF-8 UTF-8en_US.UTF-8 UTF-8,请创建包含以下内容的 archlive/airootfs/etc/locale.gen(详情请查看 Locale#生成本地化文件):

archlive/airootfs/etc/locale.gen
de_DE.UTF-8 UTF-8
en_US.UTF-8 UTF-8

然后您需要在 Live 系统中运行 locale-gen。这可以通过一个 Pacman 钩子来实现,该钩子稍后会由另一个钩子自动从镜像中移除。创建包含以下内容的 archlive/airootfs/etc/pacman.d/hooks/locale-gen.hook(详情请查看 Pacman#钩子alpm-hooks(5)):

archlive/airootfs/etc/pacman.d/hooks/locale-gen.hook
# remove from airootfs!
[Trigger]
Operation = Install
Operation = Upgrade
Type = Package
Target = glibc

[Action]
Description = Generating localisation files...
When = PostTransaction
Depends = glibc
Exec = /usr/bin/locale-gen

可选地,您可以通过添加自定义 locale.conf 来更改 Live 系统的默认语言区域。例如,要将默认语言区域更改为 de_DE.UTF-8,请创建包含以下内容的 archlive/airootfs/etc/locale.conf(详情请查看 Locale#变量locale.conf(5)):

archlive/airootfs/etc/locale.conf
LANG=de_DE.UTF-8

修改 ISO 中使用的发行版名称

首先将文件 /etc/os-release 复制到 rootfs 的 etc/ 文件夹中。然后,相应地编辑该文件。您还可以更改 GRUB 和 syslinux 内部显示的名称。

构建 ISO

通过运行以下命令来构建 ISO(随后您可以刻录到 CD 或 USB):

# mkarchiso -v -r -w /tmp/archiso-tmp -o /path/to/out_dir /path/to/profile/
  • -w 指定工作目录。如果未指定该选项,它将默认为当前目录下的 work。如果内存允许,建议将工作目录放在 tmpfs 上(如上所示)以加快过程。
  • -r 在成功构建 ISO 后删除工作目录(如果它是被 mkarchiso 创建的)。
  • -o 指定放置生成的 ISO 镜像的目录。如果未指定该选项,它将默认为当前目录下的 out
  • 应当注意,运行 mkarchiso 时不能直接指定配置文件 profiledef.sh,只能指定该文件所在的路径。

/path/to/profile/ 替换为您的自定义配置文件的路径,或者如果您正在构建未经修改的配置文件,则替换为 /usr/share/archiso/configs/releng/

运行时,脚本会将您指定的软件包下载并安装到 work_directory/x86_64/airootfs 中,创建内核和 init 镜像,应用您的自定义设置,并最后在输出目录中构建 ISO。

删除工作目录

警告: 如果 mkarchiso 被中断,请在删除目录前运行 findmnt(8) 以确保没有挂载绑定——否则,您可能会丢失数据(例如,挂载在 /run/media/user/label 的外部设备在构建过程中被绑定到了 work/x86_64/airootfs/run/media/user/label 中)。

临时文件会被复制到一个工作目录中。如果 mkarchiso 使用 -r 选项运行,只要该目录事先不存在,它就会在成功构建 ISO 后删除工作目录。或者,您可以手动删除工作目录:

# rm -rf /path/to/work_dir

使用 ISO

各种选项请参见 安装指南#准备安装介质

在 QEMU 中测试 ISO

安装可选依赖项 qemu-desktopedk2-ovmf

使用便捷脚本 run_archiso 通过 QEMU 运行构建好的镜像。

$ run_archiso -i /path/to/archlinux-yyyy.mm.dd-x86_64.iso

虚拟机也可以使用 UEFI 模拟运行:

$ run_archiso -u -i /path/to/archlinux-yyyy.mm.dd-x86_64.iso

技巧与提示

作为 ISO 构建过程的一部分运行设置命令

创建自定义配置文件时,某些修改可能要求您在创建 ISO 之前在 Live 系统环境中运行设置命令。例如,如果您想启用额外的语言区域,则必须在 Live 系统中运行 locale-gen 以生成必要的本地化文件。

要在创建 ISO 之前运行设置命令,请在 archlive/airootfs/etc/pacman.d/hooks/ 下添加一个 Pacman 钩子。有关如何创建自定义 Pacman 钩子的详细信息,请查看 Pacman#钩子alpm-hooks(5)。另请查看 #语言区域 以获取示例。

由于这些设置钩子通常只需作为 ISO 构建过程的一部分运行一次,因此 releng 配置文件包含一个 Pacman 钩子,它会移除任何标记有字符串 "remove from airootfs" 的 Pacman 钩子。因此,如果您不希望您的 Pacman 钩子也应用在运行的 Live 系统上,请在您的 Pacman 钩子中添加以下注释:

# remove from airootfs!

为通过 SSH 安装准备 ISO

注意:archlinux-2021.02.01-x86_64.iso 起,已提供 cloud-init 支持,且 sshd.service 默认启用

要在不与系统进行任何交互的情况下通过 SSH 安装 Arch Linux,必须将 SSH 公钥放入 authorized_keys

添加 SSH 密钥可以手动完成(此处有解释),也可以通过 cloud-init 完成。

要手动添加密钥,首先将 archiso 的 releng 配置文件复制到一个可写目录。以下示例使用 archlive

$ cp -r /usr/share/archiso/configs/profile/ archlive

在用于登录的用户的家目录中创建一个 .ssh 目录。以下示例将使用 root 用户。

$ mkdir archlive/airootfs/root/.ssh

将用于登录的 SSH 公钥添加到 authorized_keys

$ cat ~/.ssh/key1.pub >> archlive/airootfs/root/.ssh/authorized_keys
$ cat ~/.ssh/key2.pub >> archlive/airootfs/root/.ssh/authorized_keys

.ssh 目录和 authorized_keys 文件设置正确的权限和所有权:

archlive/profiledef.sh
...
file_permissions=(
  ...
  ["/root"]="0:0:0750"
  ["/root/.ssh"]="0:0:0700"
  ["/root/.ssh/authorized_keys"]="0:0:0600"
)

最后构建 ISO。引导 ISO 后,OpenSSH 将启动,并且可以使用相应的 SSH 私钥登录。

使用 iwd 自动连接到 Wi-Fi 网络

在配置文件的 airootfs 目录内创建 /var/lib/iwd/ 并设置正确的权限:

$ mkdir -p archlive/airootfs/var/lib/iwd
archlive/profiledef.sh
...
file_permissions=(
  ...
  ["/var/lib/iwd"]="0:0:0700"
)

按照 iwd#网络配置iwd.network(5) 中的说明,为您的 Wi-Fi 网络创建一个网络配置文件。

将该配置文件保存在 archlive/airootfs/var/lib/iwd/ 内部。

调整根文件系统的大小

在 Live 环境中安装软件包时,例如在需要 DKMS 模块的硬件上,根文件系统的默认大小可能不允许下载和安装此类软件包。

提示: 有关所选大小背后的原因,请参见 BBS#210389,有关历史细节,请参见 FS#45618

在 Live 环境中下载文件或安装软件包时,会表现为以下错误信息:

error: partition / too full: 63256 blocks needed, 61450 blocks free
error: not enough free disk space
error: failed to commit transaction (not enough free disk space)
Errors occurred: no packages were upgraded.

要即时调整大小:

# mount -o remount,size=SIZE /run/archiso/cowspace

有关 SIZE 可能的参数,请参见 tmpfs(5) § size

要在引导加载程序阶段调整大小(通过按 eTab),请使用引导选项:

cow_spacesize=SIZE

要在构建镜像时调整大小,请将引导选项添加到:

  • efiboot/loader/entries/*.cfg
  • grub/*.cfg
  • syslinux/*.cfg

结果可以通过以下命令检查:

$ df -h

参见 mkinitcpio-archiso 引导参数

故障排除

窗口管理器卡死

如果您想在 Live CD 中使用窗口管理器 (WM),您必须添加必要且正确的显卡驱动,否则 WM 可能会在加载时卡死。

参见