archiso

出自 ArchWiki

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

安装

安装 archisoarchiso-gitAUR 软件包。

准备自定义配置文件

注意: 您可以在 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 环境中使用。为此,请参阅 #向镜像添加软件仓库
  • 确保仓库位于 chrooted 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/ 下的所需位置。例如,如果您当前系统上有一组 iptables 脚本,您希望在 Live 镜像上使用它们,请按如下方式复制它们

$ cp -r /etc/iptables archlive/airootfs/etc

同样,对于位于层次结构中某处的特殊配置文件,也需要小心。目录结构的缺失部分可以使用 mkdir(1) 简单地创建。

提示: 要将文件添加到安装用户的 home 目录,请将其放置在 archlive/airootfs/root/ 中。要将文件添加到所有其他用户的 home 目录,请将其放置在 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:

archzfs.gpg 本身可以直接从仓库站点 https://archzfs.com/archzfs.gpg 获取。

内核

尽管 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 hook,因此无需额外的 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'
ALL_config='/etc/mkinitcpio.conf'

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

最后创建启动引导程序配置以允许启动内核。

启动引导程序

Archiso 支持 syslinux 用于 BIOS 启动,以及 GRUBsystemd-boot 用于 UEFI 启动。有关其配置语法的更多信息,请参阅启动引导程序的文章。

提示
  • 默认情况下,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 --autologin username --noclear %I 38400 linux

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

如果您正在使用串行控制台,请改为创建具有以下内容的 airootfs/etc/systemd/system/serial-getty@ttyS0.service.d/autologin.conf

[Service]
ExecStart=
ExecStart=-/sbin/agetty -o '-p -- \\u' --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 中列出的用户创建所有指定的 home 目录,并将 work_directory/x86_64/airootfs/etc/skel/* 复制到其中。复制的文件将具有正确的用户和组所有权。

键盘映射

要更改 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

本地化

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

例如,要启用 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 hook 来实现,该 hook 稍后会被另一个 hook 从镜像中自动删除。创建具有以下内容的 archlive/airootfs/etc/pacman.d/hooks/locale-gen.hook(有关详细信息,请查看 Pacman#Hooksalpm-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 系统的默认 locale。例如,要将默认 locale 更改为 de_DE.UTF-8,请创建具有以下内容的 archlive/airootfs/etc/locale.conf(有关详细信息,请查看 本地化#变量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 -w /path/to/work_dir -o /path/to/out_dir /path/to/profile/
  • -w 指定工作目录。如果未指定该选项,则默认设置为当前目录中的 work
  • -o 指定构建的 ISO 镜像将放置的目录。如果未指定该选项,则默认设置为当前目录中的 out
  • 应该注意的是,运行 mkarchiso 时无法指定配置文件 profiledef.sh,只能指定文件的路径。

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

提示: 如果内存允许,最好将工作目录放置在 tmpfs 上。例如
# mkarchiso -v -w /tmp/archiso-tmp /path/to/profile/

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

移除工作目录

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

临时文件被复制到工作目录中。成功构建 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 系统的环境中运行设置命令。例如,如果您想启用其他 locale,则必须在 Live 系统中运行 locale-gen 以生成必要的本地化文件。

要在创建 ISO 镜像之前运行设置命令,请在 archlive/airootfs/etc/pacman.d/hooks/ 下添加一个 Pacman hook。查看 Pacman#Hooksalpm-hooks(5) 以获取有关如何创建自定义 Pacman hook 的详细信息。另请查看 #本地化 以获取示例。

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

# 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

在将用于登录的用户的 home 目录中创建一个 .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 可能会在加载时冻结。

参见