archiso
Archiso 是一个高度可定制的工具,用于构建 Arch Linux Live CD/USB ISO 镜像。官方镜像使用 archiso 构建,并包含以下软件包。它可以作为救援系统、Linux 安装程序或其他系统的基础。这篇 Wiki 文章解释了如何安装 archiso,以及如何配置它来控制生成的 ISO 镜像的各个方面,例如包含的软件包和文件。技术要求和构建步骤可以在官方项目文档中找到。Archiso 是用许多 bash 脚本实现的。archiso 的核心组件是 mkarchiso 命令。其选项记录在 mkarchiso -h 中,此处不做介绍。
安装
安装 archiso 或 archiso-gitAUR 软件包。
准备自定义配置文件
Archiso 带有两个配置文件,releng 和 baseline。
- 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) 简单地创建。
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 启动,以及 GRUB 或 systemd-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.target
的 gpm.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/passwd
、archlive/airootfs/etc/shadow
、archlive/airootfs/etc/group
和 archlive/airootfs/etc/gshadow
。
例如,要添加用户 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-8
和 en_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#Hooks 和 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 系统的默认 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/
。
# mkarchiso -v -w /tmp/archiso-tmp /path/to/profile/
运行时,该脚本将下载您指定的软件包并将其安装到 work_directory/x86_64/airootfs
,创建内核和 init 镜像,应用您的自定义设置,最后将 ISO 镜像构建到输出目录中。
移除工作目录
/run/media/user/label
的外部设备会在 work/x86_64/airootfs/run/media/user/label
中绑定)。临时文件被复制到工作目录中。成功构建 ISO 镜像后,可以删除工作目录及其内容。例如
# rm -rf /path/to/work_dir
使用 ISO 镜像
有关各种选项,请参阅 安装指南#准备安装介质。
在 QEMU 中测试 ISO 镜像
安装 可选依赖项 qemu-desktop 和 edk2-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#Hooks 和 alpm-hooks(5) 以获取有关如何创建自定义 Pacman hook 的详细信息。另请查看 #本地化 以获取示例。
由于这些设置 hook 通常只需要在 ISO 构建过程中运行一次,因此 releng 配置文件包含一个 Pacman hook,用于删除任何标记为字符串 "remove from airootfs"
的 Pacman hook。因此,如果您不希望您的 Pacman hook 也应用于正在运行的 Live 系统,请在您的 Pacman hook 中添加以下注释
# remove from airootfs!
准备用于 SSH 安装的 ISO 镜像
要通过 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 模块的硬件上,根文件系统的默认大小可能不允许下载和安装此类软件包,因为其大小有限。
当在 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。
要在引导加载程序阶段(通过按 e
或 Tab
)调整大小,请使用引导选项
cow_spacesize=SIZE
要在构建镜像时调整大小,请将引导选项添加到
efiboot/loader/entries/*.cfg
grub/*.cfg
syslinux/*.cfg
结果可以使用以下命令检查
$ df -h
故障排除
窗口管理器冻结
如果您想在 Live CD 中使用窗口管理器,则必须添加必要且正确的视频驱动程序,否则 WM 可能会在加载时冻结。