安装 Archlinux

安装 Arch Linux

一些废话

实不相瞒,本人在六年前就误入了 Arch 邪教。只是一直以来,我都在用 不够小众 比较常见的 KDE Plasma + EXT4 组合。但时间久了,KDE 开销大的问题愈发明显,对流畅性的影响很大,于是乎就升起了放弃 DE 尝试 WM 的念头。纠结许久后选择了 Hyprland 作为 WM 顺便把文件系统也换成传说中的 Btrfs,品尝一下快照的神力。

这一期的目标就是初步安装完成一个最简单的 Arch Linux 环境。

正文

以下部分可以结合 Installation Guide 食用。

制作安装介质

首先准备一个可靠的 U 盘,因为 Arch Linux 的镜像文件仅有 1GB 左右,应该是个 U 盘就塞得下,对 U 盘的容量没有特别要求。

访问 Arch Linux 官网 选择合适的镜像源下载 archiso 镜像文件,可以通过检查 sha256 校验值或者 PGP 签名来确认文件没有损坏或者被篡改,然后将镜像文件烧录至 U 盘。

启动到 archiso

需要注意的是,官方提供的镜像并不支持安全启动 (Secure Boot),所以需要进入 BIOS 将安全启动功能关闭才能顺利进入安装环境。

由于本次安装要使用 UEFI 引导模式来安装 grub,所以在这里先验证系统目前的引导模式

1
cat /sys/firmware/efi/fw_platform_size
  • 如果返回 64,表示使用 UEFI 引导且使用 x86_64
  • 如果返回 32,表示使用 UEFI 引导且使用 IA32
  • 如果返回 No such file or directory ,表示非 UEFI 引导

确认网络连接

如果使用有线网络,正常情况下无需额外操作;如果需要连接到 Wi-Fi,则需要使用 iwctl 工具

1
2
3
4
5
6
7
8
9
10
11
# 进入 iwctl
iwctl

# 搜索 Wi-Fi
station wlan0 scan

# 连接到 Wi-Fi
station wlan0 connect <SSID>

# 输入密码后退出
exit

可以使用 ping 指令来确认能够正常连接互联网

1
ping ping.archlinux.org

确认系统时间准确

系统时间的准确性关系到 TLS 握手的成功与否,使用 timedatectl 查看当前系统时间

1
timedatectl status

如果系统时间准确,可以将系统时间同步到硬件时间

1
hwclock --systohc

硬盘分区、格式化

使用 fdisk 查看所有的硬盘,本文将以 /dev/nvme0n1 为例

1
fdisk -l

然后可以使用 cfdisk 来为硬盘分区,这里给出我的分区方案以供参考

1
cfdisk /dev/nvme0n1
路径 块设备 空间 分区类型
/boot /dev/nvme0n1p1 1GB EFI System
[swap] /dev/nvme0n1p2 32GB Linux swap
/ /dev/nvme0n1p3 920.9GB Linux filesystem

ps:由于使用了 btrfs 作为文件系统,所以使用 swapfile 就不合适了,这里使用独立的 swap 分区,大小是物理内存的两倍

分区完成后可以使用 mkfs 工具对分区进行格式化

1
2
mkfs.fat -F 32 /dev/nvme0n1p1
mkfs.btrfs /dev/nvme0n1p3

使用 mkswap 工具对 swap 分区进行格式化

1
mkswap /dev/nvme0n1p2

设置子卷并挂载分区

这里需要先临时挂载到一个目录

1
mount /dev/nvme0n1p3 /mnt

接下来按照如下的设置创建子卷

子卷 路径 压缩级别 快照
@ / zstd:3 是
@home /home zstd:1 否
@log /var/log zstd:3 否
@cache /var/cache zstd:3 否
1
2
3
4
btrfs subvolume create /mnt/@
btrfs subvolume create /mnt/@home
btrfs subvolume create /mnt/@log
btrfs subvolume create /mnt/@cache

创建完成后重新挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 卸载临时挂载
umount /dev/nvme0n1p3

# 挂载根目录并设置压缩
mount -o noatime,nodiratime,subvol=@,compress=zstd:3 /dev/nvme0n1p3 /mnt

# 创建子挂点
mkdir /mnt/home
mkdir /mnt/var/
mkdir /mnt/var/log
mkdir /mnt/var/cache

# 挂载剩余子卷
mount -o noatime,nodiratime,subvol=@home,compress=zstd:1 /dev/nvme0n1p3 /mnt/home
mount -o noatime,nodiratime,subvol=@log,compress=zstd:3 /dev/nvme0n1p3 /mnt/var/log
mount -o noatime,nodiratime,subvol=@cache,compress=zstd:3 /dev/nvme0n1p3 /mnt/var/cache

# 挂载 efi 分区
mkdir /mnt/boot
mkdir /mnt/boot/efi
mount /dev/nvme0n1p1 /boot/efi

配置 pacman 镜像源

先下载所有中国的 https 镜像源

1
curl -L 'https://archlinux.org/mirrorlist/?country=CN&protocol=https' -o /etc/pacman.d/mirrorlist

然后可以根据自己的情况进行排序,我个人习惯将 ustc 镜像源排至第一位

安装系统基础软件包

这里个人习惯将尽量多的基础包用 pacstrap 安装完毕

1
pacstrap -K /mnt base base-devel linux linux-firmware linux-headers intel-ucode btrfs-progs dhcpcd networkmanager bluez bluez-utils neovim grub efibootmgr sudo wget bash-completion

安装完毕之后生成 fstab 文件

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

配置新系统

chroot 到新系统

1
arch-chroot -S /mnt

设置时区和本地化

设置时区为 UTC+8

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

随后设置区域和本地化,这里需要编辑 /etc/locale.gen

1
nvim /etc/locale.gen

将 en_US.UTF-8 UTF-8 和 zh_CN.UTF-8 UTF-8 前的 # 注释删除并保存,随后运行

1
locale-gen

然后配置 /etc/locale.conf

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

配置用户

设置 root 密码

1
passwd

创建普通用户

1
useradd -m -G wheel <username>

设置密码

1
passwd <username>

授予 wheel 组 sudo 的使用权

1
nvim /etc/sudoers

将 %wheel ALL=(ALL:ALL) ALL 前的 # 注释删除并保存

配置 pacman

开启 multilib 库并添加 archlinuxcn 仓库

1
nvim /etc/pacman.conf

取消 [multilib] 两行的 # 注释并在文件末尾添加

1
2
3
[archlinuxcn]
Server = https://mirrors.ustc.edu.cn/archlinuxcn/$arch
Server = https://mirror.sjtu.edu.cn/archlinux-cn/$arch

更多 archlinuxcn 镜像见 github

保存并退出,然后更新一下本地数据库,并安装 archlinuxcn 仓库的密钥

1
2
pacman -Sy
pacman -S archlinuxcn-keyring

配置启动项

因为默认的 initramfs 中有 fsck 钩子,这是 btrfs 不需要的,所以这里需要重新修改

1
nvim /etc/mkinitcpio.conf

将 HOOKS=(…) 中的 fsck 删除并保存,然后重新生成 initramfs

1
mkinitcpio -P

安装 grub

1
2
grub-install --target=x86_64-efi --bootloader-id=grub --efi-directory=/boot/efi
grub-mkconfig -o /boot/grub/grub.cfg

退出并重启

1
exit

卸载所有分区

1
umount -R /mnt

重启

1
reboot