文章目录
- 前言
- [1. 制作U盘启动盘](#1. 制作U盘启动盘)
- [2. 安装](#2. 安装)
- [3. 系统配置](#3. 系统配置)
-
- [UEFI 安装 GRUB](#UEFI 安装 GRUB)
- Linux系统启动过程
- FAQ
- references
前言
1. 制作U盘启动盘
准备环境
arch linux ISO文件下载:
本文选择 .iso 文件,从U盘安装系统
https://archlinux.org/download/
下载制作工具 rufus:
启动盘制作完成后,插入要安装系统的电脑,从该电脑BIOS中设置为从U盘启动。
重启电脑后,应该看到如下画面:
需要先在BIOS中关闭安全启动

选择第一个进入。在经过一些时间的加载后会以root用户登录到虚拟控制台并启动zsh shell。应该看到如下画面:

arch linux的安装程序是命令行界面,而非向Ubuntu一样的图形化界面
此时进入的系统为 live environment , 意为整个系统完全在内存中运行,不依赖任何外存
连接网络
输入下面的指令显式当前可用的网卡
sh
ip link
可选的网络链接方式:
- 以太网
- Wi-Fi
- 无线蜂窝网络
以为Wi-Fi为例介绍如何使用iwctl命令连接
iwctl有交互式和非交互式工作方式,下面是非交互式方式;输入iwctl后会进入交互式界面,交互式命令只需去掉iwctl即可
sh
iwctl device list # 查看无线网卡信息
# 如果网卡没有打开就打开它
iwctl device <name> set-property Powered on
iwctl adapter adapter set-property Powered on
# 初始化扫描
iwctl station <name> scan
# 列出扫描到的网络
iwctl station <name> get-networks
# 连接网络, 然后输入密码
iwctl station <name> connect <SSID>
# 或者连接是直接输入密码:
iwctl --passphrase <password> station <name> connect <SSID>
# 连接成功后检查是否有网络
ping ping.archlinux.org
通过timedatectl查看时间是否同步,否则会影响包签名和tls证书认证
为硬盘分区
硬盘分区三部曲:建立分区表=》创建分区=》格式化分区
至少需要下面的分区:
- rootfs分区
- UEFI启动:一个EFI系统分区
分区example:
| 挂载点 | 分区 | 分区类型 | 建议大小 |
|---|---|---|---|
| /boot | /dev/efi_system_partition | EFI system partition | 1GB |
| [SWAP] | /dev/swap_partition | Linux swap | >4GB |
| / | /dev/root_partition | root(/) | > 32 GB |
以parted命令创建分区
2048s = 1MB
2097152s = 1GB
sh
parted /dev/sda # 使用块硬盘
# 建立分区表
(parted) mklabel gpt
# 1GB大小的EFI分区
(parted) mkpart "EFI System Partition" fat32 2048s 2099199s
# 为 EFI 分区设置 "boot" 标志
(parted) set 1 boot on
# 创建交换分区 (SWAP) 8GB
mkpart "Linux Swap" linux-swap 2099200s 18876415s
# 创建根分区 (/) 并使用所有剩余空间
(parted) mkpart "Linux Root" ext4 1025MiB 100%

格式化分区:
sh
# 格式化 EFI 分区为 FAT32:
mkfs.fat -F 32 /dev/sda1
# 初始化交换分区:
mkswap /dev/sda2
swapon /dev/sda2 # (可选) 立即启用该交换空间
# 格式化根分区为 ext4:
mkfs.ext4 /dev/sda3
挂载文件系统:
sh
mount /dev/root_partition /mnt
mount --mkdir /dev/efi_system_partition /mnt/boot
swapon /dev/swap_partition
2. 安装
安装定义arch linu的最小的基础包:
sh
pacstrap -K /mnt base linux linux-firmware
其它软件包可在chroot进入新系统后通过pacman安装
该命令就是再安装arch linux。执行完后 在/mnt/boot目录下会看到两个文件:
initramfs-linux.img : 运行在内存中的最小文件系统,内核启动时会自动加载它
vmlinuz-linux : Linux 内核文件
3. 系统配置
设置自动挂载分区
sh
genfstab -U /mnt >> /mnt/etc/fstab
临时切换root目录,将根目录切换至新系统
sh
arch-chroot /mnt
设置时区
sh
ln -sf /usr/share/zoneinfo/<Area>/<Location> /etc/localtime
# 生成/etc/adjtime
hwclock --systohc
本地化设置
sh
# 生成 /etc/locale.gen
locale-gen
# 生成 /etc/locale.conf
echo "LANG=en_US.UTF-8" > /etc/locale.conf
# 设置 Linux 虚拟控制台(非图形界面)的本地化参数
/etc/vconsole.conf
网络配置
sh
echo "<name>" > /etc/hostname
关于名称如何选:
需要为新系统安装WiFi工具、网络连接工具,保证重启后新系统可以通过pacman连接网络安装其它工具
sh
# 安装iwctl
pacman -S iwd
sh
systemctl enable iwd
systemctl start iwd
initramfs
在调用pacstrap命令时,mkinitcpio已经运行过了,因此不需要再执行了
为root用户设置密码
passwd
选择boot loader
https://wiki.archlinux.org/title/Arch_boot_process#Boot_loader
UEFI: Unified Extensible Firmware Interface 支持读取分区表和文件系统。UEFI不启动任何在MBR(Master Boot Record)上的boot code,启动依赖NVRAM的启动项。UEFI标准支持FAT12, FAT16和FAT32文件系统。
UEFI启动EFI应用,如,boot loader,boot manager, UEFI shell等。这些应用通常作为文件存储在EFI系统分区。每个供应商都能将他们的文件存储在EFI系统分区下的/EFI/vendor_name目录下。通过向NVRAM添加启动项或UEFI shell来启动应用。
boot loader 选择 GRUB
UEFI 安装 GRUB
这里说的是GRUB 2,即为新版本的
在使用 UEFI 安装时,重要的是要以 UEFI 模式启动安装介质,否则 efibootmgr 将无法添加 GRUB UEFI 启动项。
首先需要安装grub和efibootmgr:GRUB是boot loader,efibootmgr被用于GRUB安装脚本向NVRAM写启动项。
sh
# 通过pacman安装grub-install
pacman -S grub efibootmgr
安装完grub和efibootmgr后,接下来要做的:
- 选择引导加载程序标识符,此处名为
GRUB。将在 esp/EFI/ 中创建一个具有该名称的目录来存储 EFI 二进制文件,并且该名称将出现在 UEFI 启动菜单中以标识 GRUB 启动项。 - 执行以下命令将 GRUB EFI 应用程序 grubx64.efi 安装到 esp/EFI/GRUB/ 并将其模块安装到 /boot/grub/x86_64-efi/
sh
# 执行 grub-install 命令
grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id=GRUB
执行完上面的命令后,/boot/ 目录结构如下(需要修改成下面的结构,否则启动失败)
EFI
GRUB # --bootloader-id
grubx64.efi # EFI binary, UEFI boot menu中的名字
grub
fonts
...
grubenv
locale
...
thems
...
x86_64-efi # grub的内核模块
...
initramfs-linux.img # 外部initramfs文件
vmlinuz-linux # linux内核文件
grub-install命令会尝试 create an entry in the firmware boot manager,该过程可能会失败(启动项满了或者系统禁止启动向被修改)。此时需要,使用 efibootmgr 移除多余的启动项,或者关闭BIOS的" Boot Order Lock "。
配置grub
每次启动时GRUB都会加载/boot/grub/grub.cfg配置。下面需要将Linux添加到该配置中。
修改/etc/default/grub或者/etc/grub.d/后,应该总是重新生成主配置文件
使用grub-mkconfig工具生成 /boot/grub/grub.cfg
sh
grub-mkconfig -o /boot/grub/grub.cfg
检查
使用efibootmgr检查boot loader的路径设置是否正确

sh
# 切换至EFI分区执行:
cp -r esp/EFI EFI
Linux系统启动过程
(不感兴趣可跳过)
https://wiki.archlinux.org/title/Arch_boot_process#Boot_loader
系统初始化
现代CPU都具有后台功能:
UEFI:
- 上电自检之后,UEFI初始化需要启动的硬件(包括disk,键盘控制器等)
- 固件从NVRAM中读取启动项来决定从哪个EFI应用启动从哪里启动(如,从哪个硬盘的哪个分区)
- 一个启动项可以是一块硬盘。此时,固件会在该硬盘上找查EFI系统分区,同时尝试搜索一个EFI应用在启动路径: \EFI\BOOT\BOOTx64.EFI。这就是UEFI可引导可移动介质的工作原理。
- 固件启动EFI应用
- 这个EFI应用可以是boot loader或者arch Linux内核(使用EFI boot stub)
- 也可以是其它EFI应用,如,UEFI shell或者boot manager(如systemd-boot, rEFInd)
如果安全启动打开,启动程序将会校验EFI二进制的签名。
boot loader
boot loader 是由固件------UEFI/BIOS启动的一段代码。它用于加载内核(传递内核参数)和任何外部的initramfs镜像。
启动管理器用于管理多个EFI程序
UEFI可以使用EFI boot stub直接启动内核。
boot loader需要能直接访问/boot目录下的kernel和initramfs,这意味着boot loader需要能够支持块设备,stacked block devices(LVM, RAID, etc)文件系统。
boot loader 选择 GRUB
kernel
直接管理硬件的应用
initramfs
initial RAM file system 镜像是一个cpio归档文件,它提供了早期用户空间用以开始后面的真正的用户空间。这主要意味着定位、访问和挂载根文件系统所需的所有内核模块、用户空间工具、相关库、支持文件(如udev规则)等。借助initramfs的概念,可以处理更复杂的设置,例如从外部驱动器启动、堆叠设备(逻辑卷、软件RAID、压缩、加密)或在早期用户空间中运行小型SSH服务器,以远程解锁或维护根文件系统。
大多数模块将在初始化过程的后期阶段由 udev 加载,此时系统已经切换到根文件系统。
initramfs加载过程大致如下:
- 位于 / 的根文件系统最初是一个空的 rootfs,它是 tmpfs 或 ramfs 的特殊实例。这是临时根文件系统,initramfs 镜像将在此解压。
- 内核会将其内置的 initramfs 解压到临时根文件系统中。Arch Linux 官方支持的内核使用空归档作为内置 initramfs,这是构建 Linux 时的默认设置。
- 内核会按启动加载器传递的命令行中指定的顺序解压外部 initramfs 镜像,覆盖嵌入 initramfs 或之前解压的文件。注意,多个 initramfs 镜像可以组合到单个文件中,内核将按照文件中的顺序处理它们。
- 如果第一个 initramfs 镜像为未压缩,解压后,内核将分别在 /kernel/x86/microcode/ 和 /kernel/firmware/acpi/ 中查找 CPU 微代码更新和 ACPI 表更新。
- 在处理完 CPU 微代码和 ACPI 表更新后,内核将继续解压其余的 initramfs 镜像(如果有的话)。
Initramfs 镜像是 Arch Linux 设置早期用户空间的首选方法,可以使用 mkinitcpio、dracut 或 booster 生成。
Linux 内核从6.13.8之后内置了Btrfs和Ext4驱动,这使得内核可以直接使用根分区并加载模块。但这样做有些限制。
Early userspace
即,initramfs阶段。内核通过执行 /init 二进制文件作为 PID 1 开启Early userspace。
Early userspace的功能是可配置的,但其主要目的是引导系统到可以访问根文件系统的阶段。这包括:
- 加载内核模块,例如挂载真实根文件系统所需的任何块设备模块。
- 设置根文件系统所在的存储栈。
- 通过 udev 将持久性块设备名称解析为实际设备。
- 加载 DRM 模块,因为默认情况下已启用早期 KMS。
请注意,Early userspace的作用不仅仅是设置根文件系统。在根文件系统挂载之前,有些任务是必须完成的,例如 fsck 和从休眠恢复。
在Early userspace的最终阶段,真实根文件系统被挂载在 /sysroot/(对于基于 systemd 的 initramfs)或 /new_root/(对于基于 busybox 的 initramfs),然后在使用基于 systemd 的 initramfs 时通过 systemctl switch-root 切换,或者在使用基于 busybox 的 initramfs 时通过 switch_root(8) 切换。Late userspace通过从真实根文件系统执行 init 程序启动。
Late userspace
从真实根文件系统的init程序开始。现在流行的是systemd。
gettty
init进程为每个虚拟控制台(tty)(arch Linux有六个tty)调用一次getty。getty会初始化每个终端并防止未授权的访问,当用户名和密码输入后,getty通过/etc/passwd和/etc/shadow校验,然后调用login。
login
login程序为用户打开一个会话,设置环境变量并启动用户shell(基于/etc/passwd)(此时的shell称为login shell)(一般会在这个shell启动之前在屏幕上打印一些条款等)
shell
一旦用户的 shell 启动,它通常会在向用户显示提示符之前运行一个运行时配置文件,例如 bashrc。如果账户配置为在登录时启动 X,运行时配置文件将调用 startx 或 xinit。跳转到 #Graphical session (Xorg) for the end.
显示管理器
此外,可以将 init 配置为在特定虚拟终端上启动显示管理器,而不是 getty。这需要手动启用其 systemd 服务文件。然后显示管理器会启动一个图形会话。
FAQ
arch Linux Wifi配置