ShinKouyo の 小栈

Arch Linux 安装教程

根据 GNU Free Documentation License, 版本 1.3 或 Free Software Foundation 发布的任何后续版本之条款, 无 Invariant Sections, 无 Front-Cover Texts 及无 Back-Cover Texts, 授予复制, 分发和/或修改本文的许可

本文将介绍一个基本的 Arch Linux 操作系统的安装方法.

根据 ArchWiki:

Arch Linux 被设计为可以运行在配置为最低 512 MiB 内存的 x86_64 架构的计算机上, 但如果是从安装介质启动系统并成功安装在计算机硬盘中, 则可能需要更多的内存. 基本安装方式将占用小于 2 GiB 的硬盘存储空间. 由于安装过程中需要从远程存储库获取软件包, 计算机将需要一个有效的互联网连接.

在安装之前, 请确保你的计算机符合以上要求, 且使用 UEFI 引导禁用了安全启动.


1. 准备 Live 环境

1.1. 获取安装映像

Arch Linux 官方一般每月通过 archiso 创建用于安装的 Live ISO 映像.

打开 Arch Linux 下载页面, 找到 HTTP Direct Downloads 章节, 在镜像站列表中打开一个合适的镜像站点, 下载最新的 ISO 文件. 一个正确的文件名形如 archlinux-x86_64.isoarchlinux-yyyy-MM-dd-x86_64.iso.

回到下载页面, 找到 Checksums and signatures 小节, 选择任意一种的方式验证 ISO 文件的完整性.

例如, 在下载 ISO 文件的 .sig PGP 签名文件后, 可以使用 GnuPG 来验证文件签名:

# 下载签名密钥
gpg --auto-key-locate clear,wkd -v --locate-external-key pierre@archlinux.org
# 验证签名
gpg --verify <archlinux-yyyy-MM-dd-x86_64.iso.sig> <archlinux-yyyy-MM-dd-x86_64.iso>

1.2. 准备安装介质

可以通过 光盘, PXE 等多种方式制作安装介质, 也可以使用 Ventoy 制作引导 U 盘.

或者, 直接通过 dd(1) 将 ISO 刻录到 U 盘等设备:

dd \
    if=<archlinux-yyyy-MM-dd-x86_64.iso> \
    of=/dev/<sdX> \
    bs=4M \
    status=progress \
    conv=fsync

1.3. 进入 Live 环境

一般情况下, 你需要在计算机开机自检期间按下某个热键 (常见的有 <F12><F8>) 并选择带有 Arch Linux 安装映像的介质启动. 具体请参考你的计算机或主板说明书.

当出现 systemd-boot(7) 提供的引导加载菜单时, 使用方向键选择 Arch Linux install medium, 并按 <Enter> 进入安装环境.


2. 安装前的准备

你将以 root 身份登录到一个虚拟控制台.
默认的 ShellZsh. 可用的文本编辑器包括 nanovim.
使用 <Alt>+<方向> 可以切换不同的控制台, 可用的网页浏览器包括 lynx.

参阅 GitLab – packages.x86_64 文件获取 Live 环境中包含的所有软件包.

2.1. 更改控制台字体

默认的控制台字体可能不够清晰, 使用 setfont(8) 可以更改控制台的字体.
已安装的控制台字体位于 /usr/share/kbd/consolefonts/ 目录.

例如, 要使用适合 HiDPI 屏幕的最大字体之一:

setfont ter-v32b

ter-v32b 是字体的名称. 其中, ter- 代表 Terminus Font 字体; v (vertical) 代表宽高定义顺序是先垂直后水平; 32 代表字体的高度为 32 像素; b (bold) 代表使用粗体版本.

2.2. 验证引导模式

为了验证当前的引导模式, 尝试打印 UEFI 固件指针大小:

cat /sys/firmware/efi/fw_platform_size
  • 如果输出 64, 则系统以 UEFI 模式引导且使用 64 位 x64 UEFI.
  • 如果输出 32, 则系统以 UEFI 模式引导且使用 32 位 IA32 UEFI.
  • 如果报错 No such file or directory,则系统以非 UEFI 模式启动 (如 BIOS 或 CSM), 你应该参考计算机或主板说明书将引导模式修改为 UEFI.

2.3. 连接网络

使用 ip link 命令查看所有可用的网络接口:

ip link
# 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
#     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
# 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
#     link/ether 52:54:00:bc:8c:ae brd ff:ff:ff:ff:ff:ff
#     altname enx525400bc8cae

接着, 连接到网络:

  • 使用有线以太网, 请连接网线.
  • 使用移动网卡, 参阅 ArchWiki – mmcli.
  • 使用 WiFi, 通过 iwctl(1) 认证网络:
iwctl device list                   # 列出所有 WiFi 设备
iwctl station <device> scan         # 扫描网络
iwctl station <device> get-networks # 列出可用的网络
# 连接到网络
# 如果要连接到隐藏的 SSID, 将 connect 更改为 connect-hidden
iwctl \
    --passphrase <passphrase> \
    station <device> \
    connect <ssid>

如果网络启用并正确配置了 DHCP, 应该能够开箱即用.
否则, 如果要配置静态 IP, 参阅 ArchWiki – 网络配置#静态 IP 地址.

随后通过 ping 命令检查网络连接.

-c 3 指定了 ping 发送 3 个包.

ping -c 3 ping.archlinux.org
# PING redirect.archlinux.org (95.216.195.133) 56(84) bytes of data.
# 64 bytes from redirect.archlinux.org (95.216.195.133): icmp_seq=1 ttl=45 time=197 ms
# 64 bytes from redirect.archlinux.org (95.216.195.133): icmp_seq=2 ttl=45 time=196 ms
# 64 bytes from redirect.archlinux.org (95.216.195.133): icmp_seq=3 ttl=45 time=197 ms
# --- redirect.archlinux.org ping statistics ---
# 3 packets transmitted, 3 received, 0% packet loss, time 2002ms
# rtt min/avg/max/mdev = 196.299/196.773/197.050/0.336 ms

关于 SSH 的说明

Live 环境默认启动了 OpenSSH 服务器, 允许通过密码登录到 root 账户.
可以使用 ip addr 命令查看计算机的 IP 地址, passwd 命令为 root 账户设置密码.

参阅 GitLab – sshd_config.d/10-archiso.confArchWiki – OpenSSH.

2.4. 更新系统时间

正确的系统时间可以避免签名校验问题和 TLS 证书错误, 使用 timedatectl(1) 配置时间同步:

# 设置 IANA 时区
timedatectl set-timezone <Area>/<Location>
# 开启 NTP 同步
timedatectl set-ntp true
# 确认系统时间
timedatectl

输出中的 Local time 应该显示正确的当前时间.

2.5. 确定分区设备

本文不讨论 RAID, LVM 等块设备堆叠方案.

任何识别到的内置硬盘, U 盘或者移动硬盘等类型磁盘, 会将其分配为一个 块设备. 可以使用 fdisk(8) 等命令查看所有的块设备:

fdisk -l
# Disk /dev/vda: 20 GiB, 21474836480 bytes, 41943040 sectors
# Units: sectors of 1 * 512 = 512 bytes
# Sector size (logical/physical): 512 bytes / 512 bytes
# I/O size (minimum/optimal): 512 bytes / 512 bytes
#
# Disk /dev/loop0: 999.41 MiB, 1047961600 bytes, 2046800 sectors
# Units: sectors of 1 * 512 = 512 bytes
# Sector size (logical/physical): 512 bytes / 512 bytes
# I/O size (minimum/optimal): 512 bytes / 512 bytes

2.6. 确定分区方案

关于分区方案

  • 应该花时间规划一个长期的分区方案, 以避免将来需要有风险和复杂的转换或重新分区.
  • 如果要从中启动的磁盘已经有一个 EFI 分区, 请不要创建另一个 EFI 分区, 而是使用现有分区.

常见的情况下, 以下分区是必须的:

  • 一个 根分区 (/)
  • 一个 EFI 系统分区 (/boot)

本文使用一个较为常见的单系统 UEFI + GPT 分区表的分区方案:

挂载点分区分区类型建议大小
/boot/dev/<vda1>EFI System1 GiB +
//dev/<vda2>Linux filesystem设备剩余空间
[SWAP]/dev/<vda3>Linux swap4 GiB +

Swap 分区的大小应根据内存灵活分配. 若使用休眠, 则应至少等于物理内存大小.

另见 Farseerfc 翻译的 替 swap 辩护: 常见的误解.

2.7. 进行分区

确定分区方案后, 使用一个合适的分区工具进行分区.

常见的分区工具有 cfdisk(8), fdisk(8)parted(8).

例如, 使用 fdisk 在一块全新的硬盘上进行分区

fdisk /dev/<vda>

接着顺序进行如下操作:

  1. g: 创建 GPT 分区表.
  2. n 创建 EFI 分区: 两次 <Enter> 使用默认值, 接着输入预期大小 (如 +1G).
  3. n 创建 根分区: 两次 <Enter> 使用默认值, 输入期望大小 (如 -4G 表示留出 4 GiB 空间).
  4. n 创建 Swap 分区: 三次 <Enter> 使用所有剩余空间.
  5. t 修改第 1 个分区类型: 输入 1 选择分区, 输入 1 选择 EFI System.
  6. t 修改第 2 个分区类型: 输入 2 选择分区, 输入 20 选择 Linux filesystem.
  7. t 修改第 3 个分区类型: 输入 3 选择分区, 输入 19 选择 Linux swap.
  8. w: 写入 并退出

分区完成后, 再次使用 fdisk 确认分区情况:

fdisk -l /dev/<vda>
# Disk /dev/vda: 20 GiB, 21474836480 bytes, 41943040 sectors
# Units: sectors of 1 * 512 = 512 bytes
# Sector size (logical/physical): 512 bytes / 512 bytes
# I/O size (minimum/optimal): 512 bytes / 512 bytes
# Disklabel type: gpt
# Disk identifier: 6E40E1EC-D232-4E14-AD8F-359BEAD9EA66
#
# Device        Start      End  Sectors  Size Type
# /dev/vda1      2048  2099199  2097152    1G EFI System
# /dev/vda2   2099200 33554431 31455232   15G Linux filesystem
# /dev/vda3  33554432 41940991  8386560    4G Linux swap

2.8. 格式化分区

本文使用了 Ext4 作为根分区的文件系统.
如果你想使用其它文件系统 (如 Btrfs, XFS), 参阅 ArchWiki – 文件系统.

创建分区后, 使用合适的文件系统对每个新创建的分区进行格式化.

# 将 EFI 系统分区格式化为 FAT32
mkfs.fat -F 32 /dev/<vda1>
# 将根分区格式化为 Ext4
# -L 指定了分区的卷标
# -m 指定了预留空间百分比
mkfs.ext4 -L Arch_Linux -m 1 /dev/<vda2>
# 初始化 Swap 分区
mkswap /dev/<vda3>

2.9. 挂载分区

将根磁盘卷挂载到 /mnt:

-o 指定 挂载选项.
noatime 禁止更新文件访问时间 以减少磁盘写入.

mount -o noatime /dev/<vda2> /mnt

将 EFI 系统分区挂载到 /mnt/boot:

--mkdir 选项使 mount 创建指定的挂载点.
-o umask=0077 将分区权限限制为仅 root 可访问.

mount --mkdir -o umask=0077 /dev/<vda1> /mnt/boot

启用 Swap 卷:

-d 参数在支持的设备上启用 TRIM.

swapon -d /dev/<vda3>

2.10. 配置 Pacman

Pacman 是 Arch Linux 的包管理器. 良好的 Pacman 配置可以缩短下载时间, 并提升用户体验.

2.10.1. 配置 pacman.conf

编辑 /etc/pacman.conf (参阅 pacman.conf(5)), 或使用以下命令直接修改配置.

# 开启 Color, 启用彩色输出
sed -i '/^#Color/s/#//' /etc/pacman.conf
# 开启 VerbosePkgLists, 显示每个包的版本和大小变化
sed -i '/^#VerbosePkgLists/s/#//' /etc/pacman.conf
# 开启并设置 ParallelDownloads 为 5, 启用并行下载
sed -i '/^#ParallelDownloads = 5/s/#//' /etc/pacman.conf

2.10.2. 配置 mirrorlist

安装软件包时, pacman 默认会从文件 /etc/pacman.d/mirrorlist 中所列的镜像站下载. 列表中越靠前的镜像站会拥有越高的优先级.

在默认的 Live 环境下, 配置文件启用了所有 HTTPS 镜像站. 位于文件顶端的是全球镜像站, 在一般的网络环境下, 这些站点足够快.
在特殊的网络环境下, 默认的镜像站配置可能很慢. 此时, 应该编辑 /etc/pacman.d/mirrorlist, 可以在 Arch Linux – Pacman 镜像列表生成器 获取一份合适的镜像列表.

例如, 以下是一个适用于中国大陆用户的 mirrorlist:

cat > /etc/pacman.d/mirrorlist << 'EOF'
##
## Arch Linux repository mirrorlist
## Updated: 2026-07-25
##

Server = https://mirrors.nju.edu.cn/archlinux/$repo/os/$arch
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch
Server = https://mirrors.sustech.edu.cn/archlinux/$repo/os/$arch
Server = https://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch
Server = https://mirrors.mirrorz.org/archlinux/$repo/os/$arch
EOF

为防止密钥环过时, 使用 pacman -Sy 更新证书包:

pacman -Sy archlinux-keyring

3. 安装操作系统

3.1. 安装软件包

使用 pacstrap(8)/mnt 安装基础软件包:

使用 -K 参数在目标系统中初始化一个全新的空密钥环.

关于基础软件包

  • 除了 base, 理论上所有软件包都可以在进入系统后再选择性的安装.
  • 你可以选择除 linux 以外的内核和其对应的头文件, 参阅 ArchWiki – 内核.

推荐在确定需要的软件包后, 通过 pacstrap -K /mnt 一次性安装.
更多信息见下文命令中的注释.

pacstrap -K /mnt \
    base                `: 基础系统所需的最小包组` \
    base-devel          `: 构建 Arch 软件包所需的包组, 如果不安装推荐自行安装 sudo 等提权工具` \
    linux-firmware      `: 硬件所需的固件文件, 虚拟机或容器中无需安装` \
    linux linux-headers `: 内核与对应头文件, 容器中无需安装` \
    amd-ucode           `: AMD CPU 微码, 根据 CPU 厂商选择安装` \
    intel-ucode         `: Intel CPU 微码, 虚拟机中无需安装, 便携式系统可安装多个微码` \
    networkmanager      `: 网络连接管理器, 可以替换为你想使用的网络管理器` \
    terminus-font       `: Terminus Font 控制台字体, 使用默认字体则无需安装` \
    bash-completion     `: Bash 补全, 可替换为 zsh zsh-completions 等` \
    man-db man-pages    `: man 手册, 不使用无需安装` \
    emacs-nox           `: Emacs 文本编辑器, 可替换为 vim neovim nano 等`

3.2. 生成 fstab

/etc/fstab 文件定义了在系统启动时需要挂载的文件系统. genfstab(8) 可以用于生成 fstab 文件.

应当生成一个具有持久化块设备名的 fstab.
例如, 本文使用了 -U 选项来通过 UUID 指定文件系统.

genfstab -U /mnt > /mnt/etc/fstab

查看 /mnt/etc/fstab 是否正确:

cat /mnt/etc/fstab
# # /dev/vda2 LABEL=Arch_Linux
# UUID=7aa624fb-0305-4206-b711-1347abe7503b	/         	ext4      	rw,noatime	0 1
#
# # /dev/vda1
# UUID=BE8A-7515      	/boot     	vfat      	rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro	0 2
#
# # /dev/vda3
# UUID=5979db30-d742-4de3-8128-db6f8e6dadc8	none      	swap      	defaults  	0 0

可以手动编辑 /mnt/etc/fstab 以修改挂载选项.
参见 ArchWiki – fstab.

例如, 在确认 /sys/block/<vda>/queue/discard_granularity 不为 0 (即硬盘支持 TRIM) 后, 为 Ext4 根分区开启持续性 TRIM:

在不支持 TRIM 的设备上开启 TRIM 可能导致数据丢失!

# /dev/vda2 LABEL=Arch_Linux
-UUID=7aa624fb-0305-4206-b711-1347abe7503b	/         	ext4      	rw,noatime	0 1
+UUID=7aa624fb-0305-4206-b711-1347abe7503b	/         	ext4      	rw,noatime,discard	0 1

4. 配置新系统

4.1. chroot 到新系统

chroot(1) 命令用于修改当前进程及其子进程的可见根目录, arch-chroot(8) 增强了 chroot.

使用 arch-chroot 切换到新系统:

-S 指定 arch-chroot 使用 systemd 服务模式.

arch-chroot -S /mnt

将启动新系统的 /bin/bash.
如果运行 vim, clear 等程序时遇到错误, 请安装对应终端模拟器的的终端信息.

4.2. 配置时间和时区

为正确的当地时间及处理夏令时, 配置时区:

ln -sf /usr/share/zoneinfo/<Area>/<Location> /etc/localtime

例如, 对于中国大陆用户, 设置为北京时间:

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

然后, 使用 hwclock(8) 将软件时间同步到硬件:

hwclock --systohc

接着启用 NTP 服务:

systemctl enable systemd-timesyncd

4.3. 区域与本地化配置

区域设置决定了软件和库的语言, 格式等本地化选项.

编辑 /etc/locale.gen, 取消注释需要的 UTF-8 区域设置.

例如, 启用 en_US.UTF-8, en_GB.UTF-8zh_CN.UTF-8:

sed -i '/^#en_US.UTF-8/s/#//' /etc/locale.gen
sed -i '/^#en_GB.UTF-8/s/#//' /etc/locale.gen
sed -i '/^#zh_CN.UTF-8/s/#//' /etc/locale.gen

随后执行 locale-gen 生成 Locale 信息:

locale-gen
# Generating locales...
#   en_GB.UTF-8... done
#   en_US.UTF-8... done
#   zh_CN.UTF-8... done
# Generation complete.

创建 locale.conf(5) 文件, 配置 LANG 变量:

C 是标准的区域设置.

echo 'LANG=C.UTF-8' > /etc/locale.conf

4.4. 网络配置

如果安装了 networkmanager 软件包, 启用网络服务:

systemctl enable NetworkManager
systemctl disable NetworkManager-wait-online

接着, 创建 /etc/hostname, 配置主机名:

主机名最长可以是 63 个字符, 且推荐仅使用 a-z, 0-9, -, _. 并以 a-z 开头.
参阅 RFC1178 – 为计算机命名RHEL 网络指南 获取有关建议.

echo '<arch-pc>' > /etc/hostname

4.5. 设置 root 密码

使用 passwdroot 用户配置密码:

请设置一个强密码.

passwd
# New password:
# Retype new password:
# passwd: password updated successfully

4.6. initramfs 配置

initramfs 是内核启动过程中加载的临时根文件系统, 负责挂载真正的根分区. mkinitcpio 是 Arch Linux 用于生成 initramfs 映像的工具.

mkinitcpio 40-1 开始, 默认的配置应该已经足够好, 无需手动配置.

如果有需要, 编辑 /etc/mkinitcpio.conf.

如果启用了 sd-vconsole 钩子, 应创建 /etc/vconsole.conf:

使用 KEYMAP 配置键盘布局, FONT 指定字体, 不指定以使用默认配置.

cat > /etc/vconsole.conf << 'EOF'
KEYMAP=us
FONT=ter-v16b
EOF

4.7. 配置引导程序

本文使用 UKI + systemd-boot 的引导方案.

4.7.1. 配置 UKI

UKI 是可直接从 UEFI 启动的可执行文件.

首先, 创建 /etc/cmdline.d/ 目录用于存放内核参数:

mkdir /etc/cmdline.d

配置根文件系统, 创建 /etc/cmdline.d/root.conf:

echo "root=UUID=$(blkid -s UUID -o value /dev/<vda2>) rw" > /etc/cmdline.d/root.conf

如果需要使用 swap 分区休眠, 创建 /etc/cmdline.d/resume.conf:

echo "resume=UUID=$(blkid -s UUID -o value /dev/<vda3>)" > /etc/cmdline.d/resume.conf

要配置静默启动, 创建 /etc/cmdline.d/quiet.conf:

echo "quiet loglevel=3 bgrt_disable" > /etc/cmdline.d/quiet.conf

要禁用看门狗, 创建 /etc/cmdline.d/nowatchdog.conf:

echo "nowatchdog" > /etc/cmdline.d/nowatchdog.conf

要禁用 iTCO_wdtsp5100-tco 看门狗, 创建 /etc/modprobe.d/disable-watchdog.conf:

cat > /etc/modprobe.d/disable-watchdog.conf << 'EOF'
blacklist iTCO_wdt
blacklist sp5100_tco
EOF

其它内核参数可以放在 /etc/cmdline.d/custom.conf, 例如:

cat > /etc/cmdline.d/custom.conf << 'EOF'
mitigations=off
# SPDX-License-Identifier: MIT
vt.default_red=30,243,166,249,137,245,148,186,88,243,166,249,137,245,148,166
vt.default_grn=30,139,227,226,180,194,226,194,91,139,227,226,180,194,226,173
vt.default_blu=46,168,161,175,250,231,213,222,112,168,161,175,250,231,213,200
EOF

然后, 创建 /boot/EFI/Linux 用于存放 UKI 文件:

mkdir -p /boot/EFI/Linux

接着, 编辑 /etc/mkinitcpio.d/ 目录下的内核预设, 启用 UKI 并将默认目录设置为 /boot/EFI/Linux.

例如, 编辑 /etc/mkinitcpio.d/linux.preset:

sed -i \
  -e '/^default_image=/s/^/#/' \
  -e 's|^#default_uki="/efi/EFI/Linux/|default_uki="/boot/EFI/Linux/|' \
  /etc/mkinitcpio.d/linux.preset

之后, 构建预设并清理旧文件:

mkinitcpio -P
rm -f /boot/initramfs-linux*.img

4.7.2. 配置 systemd-boot

systemd-boot 是 systemd 项目提供的简易 UEFI 引导加载器, 使用 bootctl(1) 安装到 /boot:

bootctl install

systemd-boot 会自动检测 /boot/EFI/Linux/ 目录下的 UKI 文件, 因此无需手动配置.

编辑 /boot/loader/loader.conf 配置引导菜单:

  • default arch-linux.efi 指定了默认引导的文件名.
  • timeout 0 指定跳过菜单.
  • console-mode max 使用最大可用分辨率.
  • editor no 禁用内置编辑器.
cat > /boot/loader/loader.conf << 'EOF'
default arch-linux.efi
timeout 0
console-mode max
editor no
EOF

接着, 启用自动引导更新:

systemctl enable systemd-boot-update

5. 结束安装

使用 exit 退出 chroot 环境.

重启计算机:

reboot

systemd 将自动卸载所有分区.

移除安装介质, 然后可以使用 root 账户登录到新系统.


6. 后续步骤

参阅:


参考资料

  1. https://wiki.archlinux.org/title/Installation_guide
  2. https://archlinux.org/download/
  3. https://gitlab.archlinux.org/archlinux/archiso/-/raw/master/configs/releng/packages.x86_64
  4. https://arch.icekylin.online/guide/rookie/basic-install.html
  5. https://codeberg.org/unixchad/arch-install-guide
  6. https://wiki.archlinux.org/title/Iwd#iwctl
  7. https://gitlab.archlinux.org/archlinux/archiso/-/raw/master/configs/releng/airootfs/etc/ssh/sshd_config.d/10-archiso.conf
  8. https://chrisdown.name/2018/01/02/in-defence-of-swap.html
  9. https://man.archlinux.org/man/fdisk.8
  10. https://man.archlinux.org/man/pacman.conf.5
  11. https://man.archlinux.org/man/pacstrap.8
  12. https://en.wikipedia.org/wiki/Chroot
  13. https://man.archlinux.org/man/arch-chroot.8
  14. https://www.rfc-editor.org/rfc/rfc1178.html
  15. https://gitlab.archlinux.org/archlinux/mkinitcpio/mkinitcpio
  16. https://gitlab.archlinux.org/archlinux/packaging/packages/mkinitcpio
  17. https://wiki.archlinux.org/title/Unified_kernel_image