Arch Linux 安装笔记(LUKS2 + Secure Boot + TPM + PIN)

  1. 1. 注意事项
  2. 2. 一些抉择
  3. 3. 准备分区
  4. 4. 预配置 Windows
  5. 5. 准备安装介质
  6. 6. 安装 Arch Linux
  7. 7. 配置网络
  8. 8. 创建用户
  9. 9. 配置 Secure Boot
  10. 10. 配置 TPM + PIN 解密模式
  11. 11. 安装桌面环境
  12. 12. 配置中文输入法
    1. 12.1. 安装输入法
    2. 12.2. 修改环境变量
    3. 12.3. 配置输入法
    4. 12.4. 应用配置
  13. 13. 配置自动开启 NumLock
    1. 13.1. 早期环境
    2. 13.2. SDDM 环境
    3. 13.3. KDE 环境
  14. 14. 配置 Plymouth
  15. 15. 安装 Paru 作为 AUR Helper
  16. 16. 安装 NVIDIA 驱动
  17. 17. 安装音频驱动
  18. 18. 蓝牙配对
  19. 19. 指纹识别
  20. 20. 自动登陆并锁定
  21. 21. 配置 Shell

注意事项

这篇文章不是教程,仅仅用于记录我在安装 Arch Linux 时的一些配置过程,以实现某种意义上的“可重现性”。您不应该直接复制粘贴这里的内容,而应该根据自己的需求和环境进行调整。

由于 Arch Linux 的更新速度较快,安装过程可能会随着时间而变化,所以请注意查看 Arch Wiki 和相关文档以获取最新的信息。

一些抉择

  • 使用块设备加密:保护数据不被泄露。
  • 不使用任何 Bootloader:Windows BitLocker 在使用 EFI Chainload 的情况下会拒绝启动,必须直接由 UEFI 固件引导。
  • 使用 UKI(统一内核映像) 启动方式:便于签名并使用 Secure Boot。
  • 不加密内核:内核本身并不具有任何敏感信息,泄露的风险不高。且 Secure Boot 会保证内核完整性。
  • 使用独立的 EFI 系统分区:避免休眠时 EFI 系统分区被另一系统挂载。若在 Linux 下不会挂载任何 Windows 使用的分区,则无需关闭 Windows 的快速启动。

准备分区

由于已安装 Windows,为方便起见,我们在 Windows 下使用磁盘管理工具调整分区:

  • 新建一个 EFI 系统分区,无需格式化,这里采用了 1 GiB 的大小(请根据实际情况调整)
  • 新建一个数据分区,无需格式化,这里采用了 350 GiB 的大小(请根据实际情况调整)

如果磁盘没有未分配空间,则可能还需要缩小现有分区以腾出空间。如果你需要对 NTFS 分区进行无损缩小,可以考虑使用在 Windows 下使用 傲梅分区助手,注意调整过程中需要先关闭 BitLocker。对于 ReFS 分区,目前暂时还没有找到无损缩小的方法(如果有的话,欢迎在 Telegram 上 PM 哦),只能备份数据后重建分区。

我这里所创建的 EFI 分区为磁盘 2 的第 4 个分区,数据分区为磁盘 2 的第 5 个分区。在 Linux,将分别被识别为 /dev/nvme1n1p4/dev/nvme1n1p5

预配置 Windows

考虑到安装 Arch 前本地已有 Windows 系统,为了避免双系统读取 RTC 时间时因为时区不一致导致未知问题,在 Windows 端设置写入到 RTC 的时区为 UTC:

1
reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation" /v RealTimeIsUniversal /d 1 /t REG_DWORD /f

准备安装介质

  1. 下载 Arch Linux LiveCD 镜像,官方站:Arch Linux Downloads
  2. 通过 GPG 验证下载到的镜像来自 Arch Linux 官方(从镜像站下载时,尤其应该进行此步骤)
  3. 使用 Rufus 制作 UEFI 启动盘(这里在 Windows 下操作,如果你从其他系统操作,请自行查找相应的工具)

安装 Arch Linux

  1. 启动到 LiveCD。注意 Live CD 不能使用 Secure Boot 启动,请在安装过程中临时关闭 Secure Boot。
  2. 使用 cat /sys/firmware/efi/fw_platform_size 验证 UEFI 引导模式,应为 64
  3. 使用 ip link 检查 LiveCD 环境的网络连接
  4. 使用 timedatectl 从网络上更新时间
  5. 检查分区信息
    1
    fdisk -l
  6. 格式化 EFI 分区
    1
    mkfs.vfat -n EFI /dev/nvme1n1p4
  7. 格式化数据分区为 LUKS2 容器,此时请设置一个强密码(后续我们将使用 TPM + PIN 模式简化大部分情况下的密码输入):
    1
    2
    cryptsetup luksFormat /dev/nvme1n1p5
    cryptsetup open /dev/nvme1n1p5 system
  8. 建立 btrfs 及子卷:
    1
    2
    3
    4
    5
    6
    mkfs.btrfs --label system /dev/mapper/system
    mount /dev/mapper/system /mnt
    btrfs subvolume create /mnt/@root
    btrfs subvolume create /mnt/@home
    btrfs subvolume create /mnt/@var
    umount -R /mnt
  9. 挂载文件系统:
    1
    2
    3
    4
    5
    umount -R /mnt
    mount --mkdir -o noatime,subvol=@root /dev/mapper/system /mnt
    mount --mkdir -o noatime,subvol=@home /dev/mapper/system /mnt/home
    mount --mkdir -o noatime,subvol=@var /dev/mapper/system /mnt/var
    mount --mkdir /dev/nvme1n1p4 /mnt/efi
  10. 安装基本系统:
    1
    pacstrap -K /mnt base linux linux-firmware intel-ucode btrfs-progs
    如果为 AMD 系列 CPU,可将 intel-ucode 替换为 amd-ucode 以安装对应的微码
  11. 生成 fstab 文件,将现有的挂载配置持久化:
    1
    genfstab -U /mnt >> /mnt/etc/fstab
    生成后使用 cat /mnt/etc/fstab 检查是否正确
  12. 切换根:
    1
    arch-chroot /mnt
    注意:使用 arch-chroot 而不是 chroot
  13. 设置时区:
    1
    2
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    hwclock --systohc
    这里设置时区为上海,你可以根据自己的实际情况调整
  14. 设置区域(Locale):
    1. 编辑 /etc/locale.gen
    2. 取消注释 en_US.UTF-8 UTF-8zh_CN.UTF-8 UTF-8
    3. 生成区域设置:
      1
      locale-gen
    4. 编辑 /etc/locale.conf 写入:
      1
      LANG=en_US.UTF-8
      由于 TTY 无法显示中文,所以全局语言设置为英文,中文环境将在桌面环境中设置。
  15. 编辑 /etc/hostname 写入主机名
  16. 使用 passwd 设置 root 密码
  17. 安装基础软件:
    1
    pacman -Syu networkmanager base-devel vim sbctl efibootmgr terminus-font
  18. 编辑 /etc/mkinitcpio.conf 使用以下 HOOKS:
    1
    HOOKS=(base systemd autodetect modconf kms keyboard sd-vconsole block sd-encrypt filesystems fsck)
  19. 查看磁盘分区永久名称:执行 ls -l /dev/disk/by-uuid/ 找到连接到 /dev/nvme1n1p5 的 UUID。
  20. 配置内核参数 /etc/kernel/cmdline
    1
    fbcon=nodefer rw rd.luks.allow-discards cryptdevice=/dev/disk/by-uuid/YOUR_DEVICE_UUID:system bgrt_disable root=LABEL=system rootflags=subvol=@root,rw splash vt.global_cursor_default=0
  21. 配置启动时解密 /etc/crypttab.initramfs
    1
    system /dev/disk/by-uuid/YOUR_DEVICE_UUID none timeout=180
  22. 设置 /etc/vconsole.conf
    1
    2
    KEYMAP=us
    FONT=ter-132b
  23. 通过 sbctl 创建自定义签名并生成 UKI(统一内核映像):
    1
    2
    3
    sbctl create-keys
    sbctl bundle -i /boot/intel-ucode.img -s /efi/main.efi
    mkinitcpio -P
  24. 添加 EFI 引导项:
    1
    efibootmgr --disk /dev/nvme1n1 --part 4 --create  --label "Arch Linux" --loader main.efi
  25. 退出 chroot 环境:
    1
    2
    3
    exit
    umount -R /mnt
    reboot

配置网络

1
2
systemctl enable NetworkManager
systemctl start NetworkManager

创建用户

  1. 配置用户
    1
    2
    useradd -m alampy
    passwd alampy
  2. 配置 sudo 权限:
    1. 首先配置用户组
      1
      2
      groupadd sudo
      usermod -aG sudo alampy
    2. 然后运行编辑配置 visudo,取消注释 %sudo ALL=(ALL:ALL) ALL

配置 Secure Boot

进入 UEFI 设置,重置 Secure Boot 模式为 Setup Mode,进入系统:

1
sbctl enroll-keys -mcft
参数含义
-m添加微软密钥
-c添加我们的自定义密钥
-f添加固件内置密钥
-t添加 TPM 事件日志

重启进入 UEFI 设置,开启 Secure Boot。

配置 TPM + PIN 解密模式

1
sudo systemd-cryptenroll --wipe-slot tpm2 --tpm2-device auto --tpm2-pcrs 7 --tpm2-with-pin=yes /dev/nvme1n1p5

安装桌面环境

1
2
pacman -S plasma-meta sddm konsole dolphin kwrite ark
systemctl enable sddm
包名称用途
plasma-metaKDE 桌面环境
SDDM会话管理器
konsoleGUI 终端
dolphin文件管理器
kwrite记事本
ark压缩文件管理工具
okularPDF/EPUB 文档查看器

配置中文输入法

遵循新设置标准:Support in Wayland Compositor: KDE Plasma

安装输入法

1
sudo pacman -S fcitx5-im fcitx5-chinese-addons fcitx5-rime

修改环境变量

编辑 /etc/environment,写入:

1
XMODIFIERS=@im=fcitx

不在全局环境变量中设置 GTK_IM_MODULE & QT_IM_MODULE & SDL_IM_MODULE,如遇到无法支持 Wayland IME 的软件,可按需单独设置

配置输入法

进入 KDE 的虚拟键盘设置,选择 fcitx5

应用配置

运行 Chromium/Electron 应用时,加入启动参数:

1
--ozone-platform-hint=auto --enable-wayland-ime

对于 Electron 应用,可配置以下全局设定:

  • 写入到 ~/.config/electron25-flags.conf
    1
    2
    3
    --enable-features=WaylandWindowDecorations
    --ozone-platform-hint=auto
    --enable-wayland-ime
  • 写入到 ~/.config/electron13-flags.conf
    1
    2
    3
    --enable-features=UseOzonePlatform
    --ozone-platform=wayland
    --enable-wayland-ime

对于 VSCode,写入如下配置到 ~/.config/code-flags.conf

1
2
3
--enable-features=WaylandWindowDecorations
--ozone-platform-hint=auto
--enable-wayland-ime

配置自动开启 NumLock

早期环境

参照 https://bbs.archlinux.org/viewtopic.php?id=283252

写入 /usr/bin/numlock(并给予执行权限):

1
2
3
4
#!/bin/bash
for tty in /dev/tty[0-9]; do
/usr/bin/setleds -D +num < "$tty"
done

写入 /usr/lib/initcpio/install/numlock(并给予执行权限):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash
build() {
add_binary /bin/bash
add_binary /usr/bin/setleds
add_binary /usr/bin/numlock

cat >"$BUILDROOT/usr/lib/systemd/system/numlock.service" <<EOF
[Unit]
Description=Numlock before LUKS
Before=cryptsetup-pre.target
DefaultDependencies=no
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/numlock
EOF
add_systemd_unit cryptsetup-pre.target
cd "$BUILDROOT/usr/lib/systemd/system/sysinit.target.wants" || exit
ln -sf /usr/lib/systemd/system/cryptsetup-pre.target cryptsetup-pre.target
ln -sf /usr/lib/systemd/system/numlock.service numlock.service
}

help() {
cat <<HELPEOF
This hook adds support to enable numlock before sd-encrypt hook is run.
HELPEOF
}

修改 /etc/mkinitcpio.conf,在 HOOKS 中添加 numlock(位于 sd-vconsole 后)

1
mkinitcpio -P

这保证了解密过程中 Num Lock 被设置。

SDDM 环境

编辑 /etc/sddm.conf,加入:

1
2
[General]
Numlock=on

KDE 环境

配置 KDE 的 NumLock 设置为开启。

配置 Plymouth

Plymouth 是一个启动画面框架,可以用来美化启动过程。

1
pacman -S plymouth

修改 /etc/mkinitcpio.conf,在 HOOKS 中添加 plymouth(位于 systemd 后),在 FILES 中添加字体(如 FILES=(/usr/share/fonts/noto/NotoSans-Regular.ttf)

修改 /etc/plymouth/plymouthd.conf 配置高分屏缩放:

1
2
[Daemon]
DeviceScale=2

重新生成 initramfs:

1
mkinitcpio -P

安装 Paru 作为 AUR Helper

AUR Helper 提供了方便的 AUR 软件包安装方式,这里使用 Paru:

1
2
3
4
sudo pacman -S --needed base-devel
git clone https://aur.archlinux.org/paru.git
cd paru
makepkg -si

安装 NVIDIA 驱动

对于 NV160 及之后系列的显卡,可以选择官方开源驱动:

1
pacman -S nvidia-open

修改 /etc/mkinitcpio.conf,在 HOOKS 中删除 kms

为了保证 plymouth 的显示不出现缩放失败、字体过小等问题,需要使用 early KMS。因此,在 /etc/mkinitcpio.conf 的 HOOKS 中保留 kms ,并在 MODULES 中添加 nvidia nvidia_modeset nvidia_uvm nvidia_drm
(参见 ArchWiki: Kernel mode setting / mkinitcpioArchWiki: NVIDIA / Early loading

配置 pacman hook,创建如下的 /etc/pacman.d/hooks/nvidia.hook 文件,以在每次安装新版本驱动后自动重建 initramfs:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Trigger]
Operation=Install
Operation=Upgrade
Operation=Remove
Type=Package
Target=nvidia-open
Target=linux

[Action]
Description=Updating NVIDIA module in initcpio
Depends=mkinitcpio
When=PostTransaction
NeedsTargets
Exec=/bin/sh -c 'while read -r trg; do case $trg in linux*) exit 0; esac; done; /usr/bin/mkinitcpio -P'

编辑 /etc/kernel/cmdline,添加内核参数:

1
nvidia_drm.fbdev=1 nvidia_drm.modeset=1

重新生成 initramfs:

1
mkinitcpio -P

安装音频驱动

1
pacman -S sof-firmware

蓝牙配对

为了使得蓝牙设备在双系统下同时可用,需要提取配对过程中产生的临时密钥并写入到另一系统,请参照:Bluetooth: Dual boot pairing

首先,启用蓝牙服务(新系统默认关闭):

1
systemctl enable bluetooth

先在 Linux 配对,然后在 Windows 配对,最后提取 Windows 下的密钥并回写到 Linux 系统的 /var/lib/bluetooth/BT-Adapter-MAC-address/device-MAC-address/info 文件中。

部分设备的 MAC 会在每次配对后自增,此时,请修改 Linux 侧的文件夹为自增后的MAC。

最后,重启蓝牙服务:

1
systemctl restart bluetooth

备注:
如果发现蓝牙无法在开机时被自动启用,请检查 ~/.config/bluedevilglobalrc 文件(参见 KDE plasma: Bluetooth not automatically powered on at login, try this

指纹识别

安装 fprintdlibfprint,由于本人使用的是 FPC 传感器,libfprint 原版还不支持,故从 AUR 安装 libfprint-fpcmoh-git

1
2
paru -S libfprint-fpcmoh-git
pacman -S fprintd

录入指纹:

1
fprintd-enroll -f "right-index-finger"

为了同时启用密码和指纹认证,安装:

1
paru -S pam-fprint-grosshack

添加 auth sufficient pam_fprintd_grosshack.so/etc/pam.d/sddm/etc/pam.d/sudo 文件起始位置

自动登陆并锁定

写入 /etc/sddm.conf.d/autologin.conf

1
2
3
[Autologin]
User=alampy
Session=plasma.desktop

写入 ~/.config/autostart-scripts/00-auto-lock.sh

1
2
#!/bin/sh
/usr/bin/dbus-send --session --type=method_call --dest=org.freedesktop.ScreenSaver /ScreenSaver org.freedesktop.ScreenSaver.Lock &

配置 Shell

安装并使用 Fish:

1
2
pacman -S fish
chsh $(which fish)