archiso
Archiso 是一个高度可定制的工具,用于构建 Arch Linux Live CD/USB ISO 镜像、网络启动工件和 bootstrap 压缩包。官方镜像是使用 archiso 构建的,并包含以下软件包。它可以作为救援系统、Linux 安装程序或其他系统的基础。这篇 wiki 文章介绍了如何安装 archiso,以及如何配置它来控制生成 ISO 镜像的各个方面,例如包含的软件包和文件。技术要求和构建步骤可以在官方项目文档中找到。Archiso 是使用许多 bash 脚本实现的。archiso 的核心组件是 mkarchiso 命令。其选项记录在 mkarchiso -h 中,此处不再赘述。
安装
准备自定义配置文件
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 环境中使用。要实现在 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 引导的 GRUB 或 systemd-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.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 --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/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 中列出的用户创建所有指定的家目录,并将 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-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 钩子来实现,该钩子稍后会由另一个钩子自动从镜像中移除。创建包含以下内容的 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。
删除工作目录
/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-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 系统环境中运行设置命令。例如,如果您想启用额外的语言区域,则必须在 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
要在不与系统进行任何交互的情况下通过 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 模块的硬件上,根文件系统的默认大小可能不允许下载和安装此类软件包。
在 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/*.cfggrub/*.cfgsyslinux/*.cfg
结果可以通过以下命令检查:
$ df -h
故障排除
窗口管理器卡死
如果您想在 Live CD 中使用窗口管理器 (WM),您必须添加必要且正确的显卡驱动,否则 WM 可能会在加载时卡死。