archiso

来自 Arch Linux 中文维基

Archiso 是一个高度可定制的工具,用于构建 Arch Linux live CD/USB ISO 映像。官方映像是用 archiso 构建的。它可以用作救援系统、linux 安装程序或其他系统的基础。这篇 Wiki 文章介绍了如何安装 archiso,以及如何配置它以控制生成的 ISO 映像的各个方面,例如随附的软件包和文件。 技术需求和构建步骤可以在官方项目文档中找到。 archiso 通过许多 bash 脚本实现。 archiso 的核心组件是 mkarchiso 命令。 它的选项记录在 mkarchiso -h 中,这里没有介绍。

安装[编辑 | 编辑源代码]

安装 archisoarchiso-gitAUR 包。

准备自定义配置文件[编辑 | 编辑源代码]

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 环境里使用,请参考 #向映像中添加仓库

安装 multilib 中的软件包[编辑 | 编辑源代码]

要从 Multilib 资源库中安装软件包,仅需在pacman.conf中取消注释如下的相关行以启用 multilib

[multilib]
Include = /etc/pacman.d/mirrorlist

向映像里添加文件[编辑 | 编辑源代码]

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

将任何自定义文件和/或目录放在 airootfs/ 下的所需位置。例如,如果您在当前系统上有一组 iptables 脚本,您希望在您的 Live 映像上使用它们,请按如下方式复制它们:

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

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

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

默认情况下,权限将是 644 (对于文件)和 755(对于目录)。所有这些都将归根用户所有。要为特定文件和/或文件夹设置不同的权限或所有权,请使用 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,但可以使映像包含其他甚至多个内核

首先,编辑 packages.x86_64 以包含您想要的内核包名称。当 mkarchiso 运行时,它将包括所有 work_dir/airootfs/boot/vmlinuz-*work_dir/boot/initramfs-*.img ISO 中的文件(以及用于 UEFI 引导的 FAT 映像中)。

mkinitcpio 默认情况下预设将构建后备 initramfs 映像。对于 ISO,主 initramfs 映像通常不包含 autodetect 挂钩,因此不需要额外的备用映像。为防止创建后备 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 引导和 systemd-bootGRUB 用于 UEFI 引导。有关其配置语法的信息,请参阅引导加载程序的文章。

提示:
  • 当使用 El Torito 刻录到光盘时,或使用 Isohybrid 写入硬盘(或 USB 闪存驱动器或类似驱动器)时,releng' 配置文件默认构建到支持 BIOS 和 UEFI 启动的 ISO 中。
  • 由于 isolinux 的模块化特性,您可以使用许多插件,因为所有 .c32 文件都已复制并可供您使用。看看 官方 syslinux 站点configs/releng/syslinux archiso git repo。使用所述插件,可以制作具有视觉吸引力的复杂菜单。参见 [1]

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 输出。

登录管理器[编辑 | 编辑源代码]

通过启用登录管理器的 systemd 服务来在启动时 Start X。如果您不知道要启用哪个 .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 并添加以下内容:

用户和密码[编辑 | 编辑源代码]

要创建在 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 文件须以换行符结尾。

Add the user to archlive/airootfs/etc/shadow following the syntax of shadow(5). If you want to define a password for the user, generate a password hash with openssl passwd -6 and add it to the file. For example: 按 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/* 给他们。复制的文件将具有适当的用户和组所有权。

更改 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
  • 需要注意的是配置文件 profiledef.sh 在运行 mkarchiso 时不能指定,只能指定文件的路径。

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

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

运行时,脚本将下载并安装您指定到 work_directory/x86_64/airootfs 的包,创建内核和初始化映像,应用您的自定义选项,最后将 ISO 构建到输出目录中。

删除工作目录[编辑 | 编辑源代码]

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

临时文件被复制到工作目录中。成功构建 ISO 后,可以删除工作目录及其内容。例如:

# rm -rf /path/to/work_dir

使用 ISO[编辑 | 编辑源代码]

有关各种选项,请参见 Installation guide#准备安装介质

在 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 以通过 SSH 进行安装[编辑 | 编辑源代码]

注意: 自从 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#Network configurationiwd.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 启动参数于

Google Compute Engine 映像[编辑 | 编辑源代码]

Google Compute Engine 兼容的 releng 压缩映像以 archlinux-gceAUR 的形式提供。

Libvirt 虚拟机配置[编辑 | 编辑源代码]

运行 releng 映像的 libvirt 配置可用作 archlinux-libvirtAUR

疑难解答[编辑 | 编辑源代码]

窗口管理器冻结[编辑 | 编辑源代码]

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

参见[编辑 | 编辑源代码]