前言

这样安装的基础安装将非常简洁,文件系统使用 LVM + LUKS,同时使用mkinitcpio 来生成UKI,安全启动由 sbctl处理,TPM处理LUKS加密解锁。后续你可以安装你自己喜欢的桌面环境。

你需要下载最新的 Arch Linux ISO,将其写入 USB 驱动器并启动或使用Ventoy添加最新的ArchLinux镜像。然后,你需要保证你的计算机可以正常的访问互联网,这样的话,你可以参考接下来的内容来进行安装。

本文多数为原创,部分内容摘编自文章:Arch Install with Secure Boot, btrfs, TPM2 LUKS encryption, Unified Kernel Images.

1. 分区

1.1 对磁盘进行分区

1.1.1 使用以下命令进行分区

cfdisk /dev/nvme0n1

1.1.2 分区格式如下(以博主的分区格式为例)

分区

大小

卷标

/dev/nvme0n1p1

512M

EFI File System

/dev/nvme0n1p2

剩余空间

Linux File System

1.2 格式化分区

1.2.1 格式化ESP分区

mkfs.vfat /dev/nvme0n1p1

1.2.2 初始化LUKS分区

cryptsetup luksFormat /dev/nvme0n1p2   # 运行后输入大写的YES,然后设置密码(不会回显,请牢记你设置的密码,当TPM故障时可以)

1.2.3 启用LUKS分区

cryptsetup open /dev/nvme0n1p2 root    # 启用LUKS,挂载点为/dev/mapper/root

1.2.4 准备LVM卷组

新建物理卷

pvcreate /dev/mapper/root

新建卷组

vgcreate ArchLinux /dev/mapper/root

新建LVM逻辑卷,你可以自己决定你的分区格式和分区大小。

# 新建根目录分区(ext4)
lvcreate -L 50G ArchLinux -n lvolroot

# 新建OPT分区,用于安装APP(ext4)
lvcreate -L 100G ArchLinux -n lvolopt

# 新建HOME分区,用于存储用户目录(ext4)
lvcreate -L 120G ArchLinux -n lvolhome

# 新建VAR分区,用于存储应用数据(ext4)
lvcreate -L 100G ArchLinux -n lvolvar

# 新建admin分区,为root用户新建用户目录(ext4,可选)
lvcreate -L 20G ArchLinux -n lvoladmin

# 新建src分区,用于存储网页数据(ext4,可选)
lvcreate -L 20G ArchLinux -n lvolsrv

# 新建交换分区
lvcreate -l 100%FREE ArchLinux -n lvolswap

1.2.5 格式化LVM卷组

mkfs.ext4 /dev/ArchLinux/lvolroot        # /dev/mapper/ArchLinux-lvolroot 也可以
mkfs.ext4 /dev/ArchLinux/lvolopt
mkfs.ext4 /dev/ArchLinux/lvolhome
mkfs.ext4 /dev/ArchLinux/lvolvar
mkfs.ext4 /dev/ArchLinux/lvoladmin
mkfs.ext4 /dev/ArchLinux/lvolsrv
mkswap /dev/ArchLinux/lvolswap
  • 使用LVM+ext4的形式存储数据,分区大小请自行调整,本方案视为磁盘为NVMe、500G大小,且系统为ArchLinux单系统。

1.3 挂载分区

  • 此处我使用mount --mkdir <partition> <directory>命令来进行分区,这样的话可以省去创建文件夹的步骤

1.3.1 挂载根分区

mount --mkdir /dev/ArchLinux/lvolroot /mnt

1.3.2 挂载ESP分区

mount --mkdir /dev/nvme0n1p1 /mnt/efi

1.3.3 准备其他分区

mount --mkdir /dev/ArchLinux/lvolhome /mnt/home
mount --mkdir /dev/ArchLinux/lvoladmin /mnt/root
mount --mkdir /dev/ArchLinux/lvolvar /mnt/var
mount --mkdir /dev/ArchLinux/lvolopt /mnt/opt
mount --mkdir /dev/ArchLinux/lvolsrv /mnt/srv

2. 安装基本系统

2.1 基本配置

如果你知道如何安装ArchLinux,你可以跳过本章节,但是请暂时不要安装grub和其他任何引导。

2.1.1 禁用reflector并替换软件源

建议禁用reflector,否则可能在安装软件包的过程中导致安装速度突然减慢。

# 禁用reflector,
systemctl disable --now reflector

此处以中科大源和清华源为例,北方的用户建议以清华源为主

echo 'Server = https://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch' > /etc/pacman.d/mirrorlist
echo 'Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch' >> /etc/pacman.d/mirrorlist

2.1.2 安装基本系统

pacstrap -i /mnt base base-devel linux-zen linux-firmware vim sudo

2.1.3 生成fstab并进入新系统

此处使用tee -a命令代替ArchLinux官方的>>管道符号,可以在生成时同时查看

genfstab -U /mnt | tee -a /mnt/etc/fstab

进入新系统

arch-chroot /mnt

2.1.4 设置时区和语言

此处建议配置语言为英文而非中文,否则可能会导致重新启动后中文无法显示的问题。如果你执意要配置中文,请提前配置ssh连接。

sed -i -e "/^#"en_US.UTF-8"/s/^#//" /mnt/etc/locale.gen
sed -i -e "/^#"zh_CN.UTF-8"/s/^#//" /mnt/etc/locale.gen
locale-gen
echo "LANG=en_US.UTF-8" > /etc/locale.conf

设置时区,中国大陆及港澳台用户请使用Asia/Shanghai作为时区。

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

2.1.5 设置root用户和普通用户

为root用户设置密码

passwd

新建普通用户并设置密码,此处的用户名为username 请改为你自己的用户名

useradd -m -G wheel -s /bin/bash username
passwd username

2.1.6 设置主机名和hosts

请为archlinux设置主机名,此处设置主机名为archpc,建议设置,否则可能导致KDE软件无法启动(在KDE 5时可能会出现,目前博主使用的是KDE 6,不知是否会出现这样的问题)。

echo "archpc" > /etc/hostname

此处为ArchLinux设置hosts,假设主机名为archpc

cat >> /etc/hosts << EOF
127.0.0.1    localhost
::1          localhost
127.0.1.1    archpc.localdomain  archpc
EOF

2.2 安装必需的软件包

# 安装一些必需的软件包
sudo pacman -S cryptsetup sbctl efibootmgr lvm2
# 安装微码,如果你使用的是amd CPU,则你需要安装amd-ucode
sudo pacman -S intel-ucode

3. 准备配置UEFI引导

3.1 新建必需的文件

新建vconsole文件

touch /etc/vconsole.conf

为EFI分区准备存放引导的目录

mkdir -p /efi/EFI/Linux/

3.2 修改mkinitcpio内核配置

修改内核配置,编辑/etc/mkinitcpio.d/linux-zen.present,根据自己安装的内核来编辑,此处博主使用的是zen内核

修改ALL_microcode字段,按需修改为intelamd

编辑PRESENT字段,删除掉'fallback'字段并注释掉和fallback有关的内容

注释掉default_image字段,并反注释default_uki字段,这样的话在运行mkinitcpio命令的时候,会生成一个便于引导的.efi文件。

将镜像引导更改为统一内核镜像(Unified Kernel Images),以下简称UKI。

以下为示例文件(被注释掉的内容已省略)

ALL_kver=/boot/vmlinuz-linux-zen
ALL_microcode=(/boot/intel-ucode.img)
PRESENTS=('default')

default_config=/etc/mkinitcpio.conf
default_uki=/efi/EFI/Linux/arch-linux-zen.efi

3.3 修改mkinitramfs.conf

需要修改HOOKS字段和MODULES字段

首先,使用dmesg命令查看tpm芯片的名称

dmesg | grep tpm

然后编辑/etc/mkinitcpio.conf修改HOOKS和MODULES

修改MODULES

MODULES=(tpm)

修改HOOKS

HOOKS=(base systemd autodetect modconf kms keyboard sd-vconsole block sd-encrypt lvm2 filesystems fsck)

3.4 查看磁盘blkid,然后修改启动参数

运行blkid,然后记录/dev/nvme0n1p2的UUID,假设记录的UUID为<PARTUUID_FOR_DEV_NVME0N1P2>,则你需要编辑/etc/kernel/cmdline文件(如果没有,则新建一个)

rd.luks.name=<PARTUUID_FOR_DEV_NVME0N1P2>=root root=/dev/mapper/ArchLinux-lvolroot rw

保存之前请先仔细检查UUID是否正确,如果正确,则可以开始下一步。

3.5 运行mkinitcpio,生成所需的引导项

mkinitcpio -P

3.6 使用efibootmgr创建引导项

为Arch Linux默认启动项新建引导项

efibootmgr --create --disk /dev/nvme0n1 --part 1 --loader /EFI/Linux/arch-linux-zen.efi --label Arch Linux (zen) --unicode

4 设置Secure Boot

4.1 设置Bios

重启到Bios,将Secure Boot设置为Setup Mode(必须,否则无法写入密钥)

4.2 设置EFI文件

4.2.1 检测是否开启了Setup Mode

sbctl status

4.2.2 生成密钥

sbctl create-keys

4.2.3 录入密钥

此处,我们使用 -m 选项来注册微软供应商密钥和我们自己创建的平台密钥。如果你不能保证你的设备上没有其他任何微软签名的操作系统(例如支持安全启动的Windows 11),你可以不使用该选项。

警告:

  • 录入密钥前请三思而后行,如果操作失误,你的其他系统可能会无法启动。虽然可能导致系统出现错误,但通常安装微软供应商密钥会更安全。

  • 如果你正在安装的是ArchLinux单系统,你可以忽略这个警告。

使用微软的密钥来进行签名

sbctl enroll-keys -m

不使用微软的密钥签名(这样做一般不会影响你的Windiws或使用微软签名的其他操作系统)

sbctl enroll-keys

4.2.4 使用密钥对EFI进行签名

对ArchLinux默认启动项EFI签名

警告:

  • 血的教训,请务必添加-s参数,否则initcpio post-hook将不会自动签名你的EFI!

  • 操作不当则会导致重启后EFI签名丢失!!从而导致安全启动状态无法启动!!!

  • 非安全启动或非本机解锁LUKS仍需要重新输入密码。

sbctl sign -s /efi/EFI/Linux/arch-linux-zen.efi

检测是否签名成功

sbctl verify # 

4.3 配置安全启动免密码

重启电脑,保存安全启动设置。重启后,我们需要通过将 LUKS 密钥绑定到 TPM 来配置根文件系统的自动解锁。让我们生成一个新密钥,将其添加到卷中,以便在现有密钥的基础上解锁卷,并将新密钥绑定到 PCRs 0 和 PCRs 7中(系统固件和安全启动状态)。首先,让我们生成一个恢复密钥,以防将来出现问题.

sudo systemd-cryptenroll /dev/nvme0n1p2 --recovery-key

运行上方的命令并输入密码后,你会得到一个密钥,此时你需要保存这个密钥。接下来,我们将设置系统固件和安全启动状态。通常情况下,只要安全启动的状态没有改变,TPM 就能解锁加密硬盘。当然,你可以添加 --tpm2-with-pin=yes参数,这样我们在启动时就会被提示输入 PIN 码。

使用systemd-cryptenroll对LUKS进行签名

systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=0+7 /dev/nvme0n1p2 # 再次输入LUKS密码

4.4 开启Secure Boot

进入Bios,开启Secure Boot,然后就可以使用带LUKS + LVM + Secure Boot + TPM 2.0 的 Arch Linux了!

4.5 测试自动签名

重新安装内核,此时会重新生成initcpio ,这样做会重置UKI,此时可以查看sbctl是否会自动签名UKI。

sudo pacman -S linux-zen

此处为efi成功自动签名的场景

... (此处省略前方的内容)** ...
Signing EFI binaries...
Generating EFI bundles....
✓ Signed /efi/EFI/Linux/arch-linux-zen.efi

此处为内核无法自动签名的场景(可能是签名时未添加-s 的原因)

... (此处省略前方的内容)** ...
Signing EFI binaries...
Generating EFI bundles....

如果你无法看到✓ Signed /efi/EFI/Linux-arch-linux-zen.efi,则你需要当心,签名可能已经丢失!

4.6 可能的补救方法

博主真心希望本章节各位读者不会用到,如果真的出现错误,各位读者可以尝试使用以下方法进行补救(未做过充分尝试,不保证有效)。如果LUKS密码忘记只能格式化磁盘后重装系统,数据无法找回,目前无任何补救措施。

4.6.1 重启后仍需要LUKS输入密码

解锁LUKS后再次尝试录入恢复密钥

sudo systemd-cryptenroll /dev/nvme0n1p2 --recovery-key

再次录入LUKS密钥到TPM中

systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=0+7 /dev/nvme0n1p2 # 再次输入LUKS密码

4.6.2 更新系统后安全启动失效

这是因为录入安全启动密钥时未保存导致的问题,此时你需要进入UEFI设置后关闭安全启动模式,输入LUKS密码进入系统,再次录入密钥

sbctl sign -s /efi/EFI/Linux/arch-linux-zen.efi

此时可以重启电脑,进入UEFI设置开启安全模式了。

4.6.3 签名后Windows系统无法启动

这个问题常常发生在开启了安全启动的Windows10和Windows11中,一般出现这种状况的电脑都支持TPM2。这是因为sbctl签名时使用了微软的签名,而Windows的签名被sbctl覆盖导致BitLocker无法启动(BitLocker类似于Linux中的LUKS,Windows11 开启安全启动时会自动开启)。

解决方法是找到BitLocker的恢复密钥,输入恢复密钥,然后进入系统后关闭BitLocker,待关闭后再重新打开。这样做的话Windoows和Linux的恢复密钥都不会影响。