Archlinux安装——UEFI 全盘加密(btrfs LUKS) 安全启动(systemd-boot UKI) TPM2自动解锁
作者声明:本文仅作安装过程整理,在ThinkPad X1 Carbon 2021上安装成功。后续有空的话我可能会对本文进行更新,增加实机演示图片和各阶段的具体解释。
Archlinux安装——UEFI 全盘加密(btrfs LUKS) 安全启动(systemd-boot UKI) TPM2自动解锁
本文大量参考https://wiki.archlinuxcn.org/wiki/%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97
1 基础环境准备
进入Arch Linux安装镜像后
1 关闭reflector.service以避免在后台自动更改镜像源干扰网络速度
1 | systemctl stop reflector.service |
2 检查启动模式为EFI
1 | ls /sys/firmware/efi/efivars |
3 联网
1 | iwctl #进入交互式命令行 |
若遇到网卡锁定问题
1 | rfkill list #查看无线连接 是否被禁用(blocked: yes) |
若看到类似Operation not possible due to RF-kill的报错,继续尝试rfkill unblock wifi来解锁无线网卡
如果是虚拟机没有网络连接检查虚拟机软件设置中的桥接网卡是不是与物理机联网网卡对应
使用ping www.bilibili.com测试网络连通性
4 系统时间同步
1 | timedatectl set-ntp true #将系统时间与网络时间进行同步 |
5 配置软件源
1 | vim /etc/pacman.d/mirrorlist |
增加以下内容
1 | Server = https://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch #中国科学技术大学开源镜像站 |
2 存储分区与加密
1 分区
1 | lsblk #显示当前分区情况 |
采用GPT分区表,划分512M作为EFI系统分区,剩余空间全部分配为Linux文件系统
2 加密分区
1 | cryptsetup luksFormat --type luks2 /dev/nvme0n1p2 #对主分区进行LUKS2标准的加密 |
3 建立文件系统
1 | mkfs.vfat -F32 -n EFI /dev/nvme0n1p1 #EFI分区,格式为vfat |
3 核心系统安装与基础配置
1 设置键盘映射为US
1 | mkdir /mnt/etc |
2 使用pacstrap安装基础系统、内核、微代码、加密与网络工具
1 | pacstrap -K /mnt base base-devel linux linux-firmware intel-ucode util-linux vim cryptsetup btrfs-progs sbctl networkmanager sudo |
3 生成挂载表fstab
1 | genfstab -U /mnt > /mnt/etc/fstab |
4 进入系统终端
1 | arch-chroot /mnt #切换进入新系统环境 |
5 本地化
1 | ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #设置时区为上海 |
编辑/etc/locale.gen,然后取消en_GB.UTF-8 UTF-8和其他需要的区域设置前的注释
执行locale-gen生成locale信息
创建locale.conf文件,并编辑设定LANG变量
1 | echo "LANG=en_GB.UTF-8" > /etc/locale.conf |
设置的LANG变量需与locale设置一致,否则会出现以下错误:
Cannot set LC_CTYPE to default locale: No such file or directory
6 主机名设定
1 | echo "archlinux" > /etc/hostname |
4 内核引导
1 Mkinitcpio Hooks配置
编辑/etc/mkinitcpio.conf
由于采用了systemd引导架构,修改为以下配置
1 | HOOKS=(base systemd autodetect microcode modconf kms keyboard sd-vconsole block sd-encrypt filesystems fsck) |
2 统一内核映像配置
1 | blkid #查看UUID |
配置LUKS解密与Btrfs根目录挂载参数
编辑/etc/kernel/cmdline
1 | rd.luks.name=UUID=linuxroot root=/dev/mapper/linuxroot rootfstype=btrfs rootflags=subvol=/@ rw loglevel=3 |
3 Mkinitcpio配置
编辑/etc/mkinitcpio.d/linux.preset
1 | ALL_config="/etc/mkinitcpio.conf" |
1 | mkinitcpio -P #生成映像 |
4 系统环境配置
1 | systemctl mask systemd-networkd #屏蔽底层网络守护进程 |
至此我们已经可以正常使用系统
5 安全启动
强烈建议在操作前使用efi-readvar备份现有的PK、KEK、db、dbx密钥
1 备份当前变量
1 | efi-readvar -v PK -o old_PK.esl |
2 生成并注册自定义安全启动密钥
1 | sbctl status |
3 使用pacman钩子自动签署
sbctl默认带有pacman钩子,可在日后内核更新时自动进行重签名
如果通过Systemd-boot启用了systemd-boot-update.service,那么引导加载程序只会在重启后升级,导致sbctl的Pacman钩子不签署新的文件
变通的方法是直接在```/usr/lib/``中签署引导加载程序,这样bootctl install与update将会自动识别并复制.efi.signed(如果有的话)到ESP,而不是普通的.efi文件
1 | sbctl sign -s -o /usr/lib/systemd/boot/efi/systemd-bootx64.efi.signed /usr/lib/systemd/boot/efi/systemd-bootx64.efi |
6 TPM2.0自动解锁
为了免去每次开机手动输入冗长LUKS密码的繁琐,可将解密密钥绑定至主板的TPM2芯片
1 生成恢复密钥以防TPM模块故障
1 | systemd-cryptenroll --recovery-key /dev/nvme0n1p2 |
2 将LUKS槽位注册到TPM2设备
1 | systemd-cryptenroll --tpm2-device=auto /dev/nvme0n1p2 |
7 进阶系统配置
1 网络配置
1 | nmcli dev wifi list # 显示附近的 Wi-Fi 网络 |
2 添加新用户
1 | useradd -G wheel -m newUser #添加newUser用户 |
3 安装fastfetch查看系统信息
1 | pacman -S fastfetch |
4 配置snapper快照
需要创建一个专门的@snapshots子卷挂载至/.snapshots,以确保在回滚根目录时不会丢失快照本身
1 | pacman -S snapper snap-pac #安装软件包 |
在/etc/fstab中补充挂载条目
1 | # <设备> <挂载点> <类型> <参数> |
编辑快照配置/etc/snapper/configs/snap
1 | #1.权限设置 |
1 | systemctl enable --now snapper-timeline.timer #启用定时快照(可选,如果你只需要 pacman 自动快照,这个可以不开) |
5 安装ssh服务
1 | sudo pacman -S openssh |
6 安装桌面环境
1 | sudo pacman –S plasma plasma-workspace kde-applications |
7 中文输入法
1 | sudo pacman –S fcitx5-im fcitx5-chinese-addons |
kdewayland配置/etc/environment
1 | XMODIFIERS=@im=fcitx |
安装词库
1 | sudo pacman –S fcitx5-pinyin-zhwiki |
8 zsh配置
1 | chsh -s /usr/bin/zsh #将Zsh设置为当前用户的默认Shell |
8 硬件适配(针对ThinkPad X1 Carbon)
安装sof-firmware以驱动声卡,并可通过easyeffects配合社区预设优化外放音频效果
1 | sudo pacman –S sof-firmware |
