目录
前言 在数字化时代,信息安全意识的觉醒往往始于一次次刻骨铭心的数据灾难,例如著名的陈冠希“艳照门”事件。随着数字资产价值的提升,从个人照片到商业机密,数据安全已成为现代人无法回避的命题。
科技巨头们早已洞悉这一趋势。微软通过可信平台模块、BitLocker全盘加密与安全启动的三重防护,在Windows生态中构建了开箱即用的安全体系。这种“无缝安全”体验让普通用户也能轻松获得企业级的数据保护,标志着消费级计算机安全进入了新时代。然而在Linux世界,实现同等安全级别却需要穿越技术的荆棘丛林——分散的工具链、复杂的配置流程、晦涩的术语体系,这些门槛让许多向往自由软件的爱好者望而却步。
本文正是要架设这座跨越鸿沟的桥梁,循序渐进地演示如何在Arch Linux上实现:基于TPM2的自动解密机制、符合UEFI规范的安全启动、支持快照的Btrfs文件系统——这些技术的有机组合不仅能媲美商业系统的安全性,更能赋予使用者完全的技术自主权。但必须清醒认识:硬盘加密如同给保险箱上锁,只能防范物理层面的数据窃取,面对网络攻击、钓鱼软件等威胁,仍需配合杀毒软件、防火墙、权限管理等其他安全措施。
名词解释及作用
安全启动(Secure Boot) :安全启动是一种计算机安全技术,主要用于确保设备在启动过程中只加载经过认证的软件(如操作系统引导程序或内核),防止恶意代码(如Rootkit、Bootkit等)在启动阶段被加载,从而增强系统的安全性。在本文中,通过Shim和MOK(机器所有者密钥)使Arch Linux实现安全启动,最终使系统在UEFI固件中完成认证,避免恶意篡改。
提示:Ubuntu、RedHat Enterprise Linux、openSUSE、Fedora等Linux发行版默认支持安全启动,是出于企业合作、安全合规和用户友好的综合考量。而Arch Linux默认不支持安全启动的选择则反映了个人用户对自由定制和极简哲学的坚持。另外,对于普通用户,这些默认支持安全启动的发行版提供了开箱即用的安全性;对于高级用户,Arch Linux则提供了更大的控制权,只不过需要自行解决安全启动的问题。需要注意的是,手动为不支持安全启动的操作系统添加安全启动支持有多种方式,比如将固件安全启动部分设置为“Setup Mode”来使用自定义密钥、使用被微软签名过的引导加载程序如“Preloader”“Shim”等,本文将采用简单便捷的“Shim”引导加载程序实现安全启动,一次实现,后续无忧。读者如因兼容性问题等需要采用其他方式,可以参阅这里 。
可信平台模块(Trusted Platform Module, TPM) :可信平台模块是一种硬件级安全芯片,用于为计算机系统提供加密、身份验证和完整性保护等核心安全功能。它通过硬件隔离和密码学技术,成为现代计算设备的“信任锚点”。在本文中,可信平台模块存储了加密卷的解锁密钥,结合PCR(平台配置寄存器)验证系统状态(如安全启动是否开启),仅在系统未被篡改时才释放密钥,然后用于自动解锁加密的系统根分区和Swap分区,提升便利性和安全性。
提示:现代的可信平台模块通常指的是2.0版本,即TPM 2.0。
Linux统一密钥设置(Linux Unified Key Setup,LUKS) :LUKS是Linux系统上广泛使用的磁盘加密标准,旨在为硬盘、分区或存储设备提供统一且安全的加密方案。在本文中,利用LUKS加密了系统分区和Swap分区,防止计算机中的数据在计算机关闭后被未授权用户直接通过物理接触的方式非法读取。并通过可信平台模块实现自动解锁,兼顾安全与便捷。
Btrfs(B-tree File System) :Btrfs是一种现代、先进的 Linux 文件系统,旨在解决传统文件系统(如 ext3/ext4)的局限性,并提供更强大的数据管理功能、更高的可靠性和可扩展性。在本文中,Btrfs文件系统用于存放根分区和家目录,支持子卷(@
和@home
)和快照,便于全盘加密情况下的系统维护。
交换空间(Swap) :是 Linux 系统用于扩展内存的一种机制,它通过将部分内存数据临时存储到硬盘上的交换分区(Swap Partition)或交换文件(Swap File),从而缓解物理内存不足的问题。在本文中,Swap分区通过LUKS加密,并同样绑定可信平台模块的自动解锁,避免手动输入密码。
阅读前须知 警告!读者请注意,如您有以下情况任一,应立即停止阅读并关闭该文章:
不能理解
安全启动、可信平台模块、全盘加密的作用和意义,并对此持反对态度
。
不能接受
繁琐数据备份操作的同时也不能承担
数据丢失的风险。
难以
从灾难性的操作系统故障中恢复计算机。
不具有
GNU/Linux操作系统的基本常识。
请注意以下问题:
实践过程风险较大,请提前对计算机上的重要数据进行备份
,一旦因误操作发生损毁,可能无法进行数据恢复。
由于计算机技术具有较强时效性
,本文的某些技术原理与步骤很可能在一定时间后失效,请读者注意鉴别。建议结合所给参考文档阅读
或者搜索最新资料,及时纠正过时的部分。
实践过程需要的时间较长(约2~3小时),且关键过程不可中断
,请读者考虑在拥有连续且较长的时间段来进行实践操作。
建议读者在实践前通读文章
,了解所有步骤与提示后再进行实践操作。若对某些步骤有疑问,请考虑事先在虚拟机上进行测试,并善用搜索引擎与AI助手帮助解决出现的问题。
实践过程中的大多数步骤上下关联性强,请读者必须确保每一步成功执行后再进行下一步操作
,否则会导致“一步错,步步错”。本文重要步骤都会给出执行后的输出结果,可以作为对比。
某些新式安全性更高的计算机,例如采用微软“安全核心电脑(Secured-core PCs)”标准的计算机,可能不会预装微软第三方 UEFI CA 证书(Microsoft Corporation UEFI CA 2011、Microsoft UEFI CA 2023),导致即使支持安全启动的Linux发行版(无论是原生支持还是用户手动设置后支持)也无法正常启动,本实践过程也随之失效。这种情况或许可以提前在UEFI固件设置中启用 Microsoft 第三方 UEFI CA 证书以解决此问题。有关该问题的详细信息,请参阅有关文档。
在固件安全启动中只预装较旧微软第三方 UEFI CA 证书(如Microsoft Corporation UEFI CA 2011)的计算机,在该证书过期后(大约在2026年6月28日左右)计算机可能会有无法启动的风险。为避免该问题,请将计算机UEFI固件更新至最新。若已经出现该问题并且OEM厂商不再提供固件更新,可以尝试关闭安全启动,此时读者也不应在此计算机上继续实施本文内容。
参考文档
与Windows共存 本文所实现的内容可以完美与启用了设备加密(Bitlocker)的Windows共存,实现双系统加密。但需要注意:
由于Arch Linux默认情况下会将引导加载程序、初始化内核等重要引导文件存放在EFI系统分区,请尽量不要让Arch Linux和Windows共用同一个EFI系统分区,避免后续任一操作系统对EFI系统分区进行修改时意外破坏另一操作系统的引导加载程序。强烈建议将Arch Linux和Windows分别安装在两个不同的硬盘上以组成双系统
,即双硬盘双系统,每个硬盘都有独立的EFI系统分区,双系统的切换通过UEFI固件的引导选择菜单进行。这样两个操作系统互不干扰,即使其中一个操作系统损毁或硬盘被拔出,在另一硬盘内容完好的前提下仍可以正常使用另一操作系统。
如要在计算机上组成Windows+Arch Linux双系统,请遵循“先安装Windows后安装Linux”的原则
,否则可能会出现Windows引导加载程序覆盖Arch Linux引导加载程序的情况,导致Arch Linux无法启动。若计算机已有Windows,则可以直接安装Arch Linux,只需在第二块硬盘上留出足够的空间来创建Arch Linux的EFI系统分区、根分区和Swap分区。在对分区进行操作时请格外小心
,避免对原有操作系统的数据造成破坏。
若计算机中原有Windows操作系统且已开启设备加密(Bitlocker),请在安装Arch Linux之前务必确保已经保存了Bitlocker的解密密钥 ,避免因修改UEFI固件安全启动策略导致Bitlocker自动解密失效,在又没有解密密钥的情况下丢失数据。若原有Windows操作系统并未开启设备加密(Bitlocker),则可以在完成本文的实践过程后再开启。
当双系统均开启加密后,将无法通过挂载分区的方式访问另一操作系统的文件。
实践过程
进入计算机的UEFI固件设置,关闭安全启动,保存固件设置后关闭计算机。
插入Arch Linux引导启动介质,并从该介质作为第一启动项启动计算机,等待进入 Arch Linux LiveCD Shell
。
请根据实际情况连接互联网。使用有线网络是最便捷的方法。如需使用无线局域网或者拨号上网,请参阅iwctl 或mmcli 工具的使用文档。连接网络后,运行 ping
测试,确保能正常访问互联网后才能进行下一步。
执行 lsblk
命令,获取当前计算机所安装的硬盘信息。
1 2 3 4 5 root@archiso ~ NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop0 7:0 0 942.7M 1 loop /run/archiso/airootfs sr0 11:0 1 1.3G 0 rom /run/archiso/bootmnt nvme0n1 259:0 0 128G 0 disk
对于本例,计算机中仅有一块固态硬盘,被识别为 nvme0n1
。请根据实际情况确定安装Arch Linux的目标硬盘。这里选择 nvme0n1
,完整路径为 /dev/nvme0n1
。
对目标磁盘进行分区。在本例中,通过调用 fdisk
工具对硬盘 nvme0n1
进行分区。首先创建一个新的GPT磁盘标签;其次,创建一个大小为1GiB的EFI系统分区用于存放Arch Linux引导文件与启动内核、创建一个大小为16GiB的Swap分区用于内存交换,剩余空间则用于创建加密卷来存放系统根分区;随后,修改这三个分区的类型,分别对应为 EFI System
、 Linux swap
和 Linux root (x86-64)
。最后保存更改并写入磁盘。
提示:
EFI系统分区建议放置在硬盘的头部位置,但也可以根据硬盘现有布局合理安排EFI分区位置(例如放置在硬盘末尾),通常情况下UEFI固件会自动搜寻并识别EFI系统分区,除非遇到不支持的老旧UEFI固件。
为了能让Arch Linux支持休眠(挂起到硬盘)或混合休眠(挂起到内存与硬盘),Swap分区的大小建议不小于物理内存的大小。
请注意GNU/Linux操作系统下容量进制单位与Windows操作系统的不同。通常情况下Windows按照1GB=1024MB进行换算,而GNU/Linux按照1GiB=1024MiB、1GB=1000MB进行换算。
考虑到EFI系统分区存放有Arch Linux的引导加载程序与内核等,其分区大小应不低于512MiB。
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 root@archiso ~ Welcome to fdisk (util-linux 2.41.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command . Device does not contain a recognized partition table. Created a new DOS (MBR) disklabel with disk identifier 0x36e3ae07. Command (m for help ): g Created a new GPT disklabel (GUID: FC64A9F0-0D70-4BBA-A39A-37B7F806E964). Command (m for help ): n Partition number (1-128, default 1): First sector (2048-268435422, default 2048): Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-268435422, default 268433407): +1GiB Created a new partition 1 of type 'Linux filesystem' and of size 1 GiB. Command (m for help ): n Partition number (2-128, default 2): First sector (2099200-268435422, default 2099200): Last sector, +/-sectors or +/-size{K,M,G,T,P} (2099200-268435422, default 268433407): +16GiB Created a new partition 2 of type 'Linux filesystem' and of size 16 GiB. Command (m for help ): n Partition number (3-128, default 3): First sector (35653632-268435422, default 35653632): Last sector, +/-sectors or +/-size{K,M,G,T,P} (35653632-268435422, default 268433407): Created a new partition 3 of type 'Linux filesystem' and of size 111 GiB. Command (m for help ): t Partition number (1-3, default 3): 1 Partition type or alias (type L to list all): 1 Changed type of partition 'Linux filesystem' to 'EFI System' . Command (m for help ): t Partition number (1-3, default 3): 2 Partition type or alias (type L to list all): swap Changed type of partition 'Linux filesystem' to 'Linux swap' . Command (m for help ): t Partition number (1-3, default 3): 3 Partition type or alias (type L to list all): 23 Changed type of partition 'Linux filesystem' to 'Linux root (x86-64)' . Command (m for help ): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks.
此时再次执行lsblk
命令查看计算机硬盘分区布局,可以看到创建的3个分区出现在输出结果中,分别标识为 /dev/nvme0n1p1
(用于EFI系统分区)、/dev/nvme0n1p2
(用于Swap加密卷)、/dev/nvme0n1p3
(用于加密系统卷)。
1 2 3 4 5 6 7 8 root@archiso ~ NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop0 7:0 0 942.7M 1 loop /run/archiso/airootfs sr0 11:0 1 1.3G 0 rom /run/archiso/bootmnt nvme0n1 259:0 0 128G 0 disk ├─nvme0n1p1 259:1 0 1G 0 part ├─nvme0n1p2 259:2 0 16G 0 part └─nvme0n1p3 259:3 0 111G 0 part
对新建的EFI系统分区进行格式化,文件系统为 FAT32
。
1 2 root@archiso ~ mkfs.fat 4.2 (2021-01-31)
利用 cryptsetup
工具创建LUKS加密卷用于存放系统根分区。输入“YES”同意抹除该分区上的所有数据。此时该工具会提示输入密码来加密分区,考虑到后期会使用可信平台模块来保存该分区新生成的另一加密密钥,这里可以直接按Enter键使用空密码。
1 2 3 4 5 6 7 8 9 10 root@archiso ~ WARNING! ======== This will overwrite data on /dev/nvme0n1p3 irrevocably. Are you sure? (Type 'yes' in capital letters): YES Enter passphrase for /dev/nvme0n1p3: Verify passphrase: cryptsetup luksFormat /dev/nvme0n1p3 27.78s user 2.15s system 179% cpu 16.670 total
由于不能直接对加密系统卷进行操作,需要利用 cryptsetup
工具将刚刚创建好的LUKS加密系统卷映射为虚拟的逻辑设备。因在上一步骤中设置的分区密码为空,提示输入密码时直接按Enter键即可。执行完成后,相当于完成了对加密系统卷的解密,并将其映射到了 /dev/mapper/root
,后续可以像普通分区一样对其进行操作。
1 2 3 root@archiso ~ Enter passphrase for /dev/nvme0n1p3: cryptsetup open /dev/nvme0n1p3 root 6.51s user 0.45s system 210% cpu 3.313 total
提示:可以自定义映射名称。自定义后需要在后续步骤中的相关部分同步进行修改。
对解密后的系统卷进行格式化,文件系统为Btrfs
。用于后续安装Arch Linux根文件系统。
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 28 root@archiso ~ btrfs-progs v6.15 See https://btrfs.readthedocs.io for more information. Performing full device TRIM /dev/mapper/root (110.98GiB) ... NOTE: several default settings have changed in version 5.15, please make sure this does not affect your deployments: - DUP for metadata (-m dup) - enabled no-holes (-O no-holes) - enabled free-space-tree (-R free-space-tree) Label: ArchLinux UUID: b28fdf5f-6940-47ea-88c7-c990320d12c1 Node size: 16384 Sector size: 4096 (CPU page size: 4096) Filesystem size: 110.98GiB Block group profiles: Data: single 8.00MiB Metadata: DUP 1.00GiB System: DUP 8.00MiB SSD detected: yes Zoned device: no Features: extref, skinny-metadata, no-holes, free-space-tree Checksum: crc32c Number of devices: 1 Devices: ID SIZE PATH 1 110.98GiB /dev/mapper/root
提示:“-L”参数后为卷标名称,可以自定义修改。
将格式化后的系统卷挂载到 /mnt
。
1 mount /dev/mapper/root /mnt
对 Btrfs
文件系统的系统卷创建子卷,用于系统快照功能。这里创建了根目录(/)子卷和家目录(/home)子卷用于后续快照。
1 2 3 4 root@archiso ~ Create subvolume '/mnt/@' root@archiso ~ Create subvolume '/mnt/@home'
由于创建了子卷,现在需要重新对系统卷进行重新挂载。执行 umount
命令进行卸载。
对根目录和家目录分别进行挂载。
1 2 3 mount -o compress=zstd,subvol=@ /dev/mapper/root /mnt mkdir -p /mnt/homemount -o compress=zstd,subvol=@home /dev/mapper/root /mnt/home
挂载步骤6中已经格式化好的EFI系统分区,用于后续安装Arch Linux的引导加载程序。
1 mount --mkdir /dev/nvme0n1p1 /mnt/boot
更新 Pacman
软件源,获取最新软件包信息用于系统安装。
1 2 3 4 root@archiso ~ :: Synchronizing package databases... core 120.2 KiB 72.8 KiB/s 00:02 [####] 100% extra 7.8 MiB 3.15 MiB/s 00:02 [####] 100%
安装基础系统软件包到挂载的系统卷中。
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 root@archiso ~ ==> Creating install root at /mnt gpg: /mnt/etc/pacman.d/gnupg/trustdb.gpg: trustdb created gpg: no ultimately trusted keys found gpg: starting migration from earlier GnuPG versions gpg: porting secret keys from '/mnt/etc/pacman.d/gnupg/secring.gpg' to gpg-agent gpg: migration succeeded ... ... ==> Updating trust database... gpg: marginals needed: 3 completes needed: 1 trust model: pgp gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u ==> Installing packages to /mnt :: Synchronizing package databases... core 120.2 KiB 81.0 KiB/s 00:01 [####] 100% extra 7.8 MiB 3.38 MiB/s 00:02 [####] 100% ... ... ==> Generating module dependencies ==> Creating zstd-compressed initcpio image: '/boot/initramfs-linux-fallback.img' -> Early uncompressed CPIO image generation successful ==> Initcpio image generation successful (14/15) Reloading system bus configuration... Skipped: Running in chroot . (15/15) Updating fontconfig cache... pacstrap -K /mnt base base-devel linux linux-firmware plymouth systemd-ukify git btrfs-progs efibootmgr sbsigntools pipewire pipewire-alsa pipewire-pulse pipewire-jack wireplumber reflector openssh man sudo nano vim vi networkmanager 22.81s user 17.87s system 45% cpu 1:29.52 total
提示:
此处可以根据需求选择安装其他软件包。推荐安装常见中文字体例如wqy-zenhei
、wqy-microhei
等。
此命令默认安装了现阶段使用率较高的pipewire
组件用于音频系统、networkmanager
组件用于网络管理。如需使用其他可替代组件,请自行修改。需要注意的是如果后续欲安装图形桌面环境,请保持采用networkmanager
网络组件。
为提升系统安全性、减少硬件错误,建议同时安装CPU微码包。请根据目标CPU平台选择安装intel-ucode
或amd-ucode
。
若目标系统处于虚拟化环境,建议根据虚拟化平台类型安装open-vm-tools
或quem-guest-agent
等组件。
对根目录和家目录的挂载点信息写入持久化配置,使计算机启动时自动进行挂载操作,并用于后续TimeShift文件系统快照工具对Btrfs子卷的识别。
1 genfstab -U /mnt >> /mnt/etc/fstab
将根用户切换到新系统,以便于直接与新系统的环境、工具和配置进行交互。切换成功后可以观察到Shell提示符发生了改变。
1 2 root@archiso ~ [root@archiso /]#
根据实际情况设置时间与地区,这里时区设置为“中国上海”。
1 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
运行 hwclock
命令使其配置生效。
编辑 /etc/locale.gen
文件并取消注释 en_US.UTF-8 UTF-8
和其他需要的 UTF-8 地区设置。通过运行locale-gen
命令生成地区设置。
1 2 3 4 5 [root@archiso /]# locale-gen Generating locales... en_US.UTF-8... done zh_CN.UTF-8... done Generation complete.
创建 /etc/locale.conf
文件,并相应地设置语言变量。
1 echo "LANG=en_US.UTF-8" | tee /etc/locale.conf
提示:中文用户建议保持“en_US.UTF-8”。不要在此处设置为“zh_CN.UTF-8”,以便于出现问题时可以利用英文日志快速故障排除。后续可以根据需求仅设置单个用户的环境变量来实现中文环境。
创建 /etc/vconsole.conf
文件,并相应地设置控制台键盘布局变量。
1 echo "KEYMAP=us" | tee /etc/vconsole.conf
修改 /etc/hostname
文件,为系统分配一个可识别的名称作为主机名用于网络环境。
1 echo "ASUS-TUF-Gaming-F15-FX507VV" | tee /etc/hostname
设置Network Manager
服务在计算机启动时自动启动,作为Arch Linux的网络管理器。
1 2 3 4 [root@archiso /]# systemctl enable NetworkManager Created symlink '/etc/systemd/system/multi-user.target.wants/NetworkManager.service' → '/usr/lib/systemd/system/NetworkManager.service' . Created symlink '/etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service' → '/usr/lib/systemd/system/NetworkManager-dispatcher.service' . Created symlink '/etc/systemd/system/network-online.target.wants/NetworkManager-wait-online.service' → '/usr/lib/systemd/system/NetworkManager-wait-online.service' .
提示:如果需要使用其他网络管理器而非“Network Manager”,请忽略本步骤并根据相关文档 自行配置网络。
创建新的用户账户,并将其加入管理员组(wheel),用于操作系统的管理,减少直接使用root账户所带来的安全风险与兼容性问题。
1 2 useradd -m kylindemons usermod -aG wheel kylindemons
执行visudo
命令,修改配置文件以启用管理员组的相关规则,保存退出。
1 2 3 4 5 6 7 8 9 10 11 12 ... %wheel ALL=(ALL:ALL) ALL %sudo ALL=(ALL:ALL) ALL ...
为root用户和新建的管理员账户修改密码。
1 2 3 4 5 6 7 8 [root@archiso /]# passwd kylindemons New password: Retype new password: passwd: password updated successfully [root@archiso /]# passwd root New password: Retype new password: passwd: password updated successfully
修改 /etc/mkinitcpio.conf
文件,在 initramfs 中启用 systemd 等组件以在计算机启动过程中支持加密系统卷的解密操作,保存退出。
1 2 3 4 5 6 7 ... BINARIES =(/usr/bin/btrfs) ... HOOKS =(base systemd encrypt plymouth autodetect microcode modconf kms keyboard sd-vconsole block sd-encrypt filesystems resume) ...
提示:原有内容中应该包含有“fsck”组件,由于启用了“systemd”,“fsck”组件不再有效,可以移除。
利用 cryptsetup
工具创建LUKS加密卷用于Swap分区。输入“YES”同意抹除该分区上的所有数据。同样地,该工具会提示输入密码来加密分区,这里仍然直接按Enter键使用空密码。
1 2 3 4 5 6 7 8 9 [root@archiso /]# cryptsetup luksFormat --label swap /dev/nvme0n1p2 WARNING! ======== This will overwrite data on /dev/nvme0n1p2 irrevocably. Are you sure? (Type 'yes' in capital letters): YES Enter passphrase for /dev/nvme0n1p2: Verify passphrase:
利用 cryptsetup
工具将刚刚创建好的LUKS加密Swap卷映射为虚拟的逻辑设备。因在上一步骤中设置的分区密码为空,提示输入密码时直接按Enter键即可。执行完成后,相当于完成了对加密Swap卷的解密,并将其映射到了 /dev/mapper/swap
。
1 2 [root@archiso /]# cryptsetup open /dev/disk/by-label/swap swap Enter passphrase for /dev/disk/by-label/swap:
在映射后的Swap分区中创建Swap文件系统。
1 2 3 [root@archiso /]# mkswap /dev/mapper/swap Setting up swapspace version 1, size = 16 GiB (17163087872 bytes) no label, UUID=0a75034e-93f2-4efb-9419-9e5aa85aaf49
执行blkid
命令,获取加密系统卷和加密Swap卷的分区UUID,用于后续内核参数的设置。
1 2 3 4 5 6 7 8 [root@archiso /]# blkid /dev/mapper/swap: UUID="0a75034e-93f2-4efb-9419-9e5aa85aaf49" TYPE="swap" /dev/nvme0n1p3: UUID="43c1359f-08cb-4ea6-a48d-16abae610247" TYPE="crypto_LUKS" PARTUUID="fa1893c2-e969-4d45-9479-51d1b4073a86" /dev/nvme0n1p1: UUID="D5AE-4666" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="c9a34f48-5ffd-47d1-b9c9-d717cac60a69" /dev/nvme0n1p2: UUID="6124b721-88b0-428f-9b12-40c6743c41c6" LABEL="swap" TYPE="crypto_LUKS" PARTUUID="0d52334e-887a-4c8b-b436-3beadeb76c66" /dev/sr0: BLOCK_SIZE="2048" UUID="2025-07-01-17-34-06-00" LABEL="ARCH_202507" TYPE="iso9660" PTUUID="9935aeb5" PTTYPE="dos" /dev/loop0: BLOCK_SIZE="1048576" TYPE="squashfs" /dev/mapper/root: LABEL="ArchLinux" UUID="b28fdf5f-6940-47ea-88c7-c990320d12c1" UUID_SUB="4c9d050c-2f94-4cce-b491-a6ee0b2f04c5" BLOCK_SIZE="4096" TYPE="btrfs"
从以上输出结果中,可以获得加密系统卷的UUID为“43c1359f-08cb-4ea6-a48d-16abae610247”,加密Swap卷的UUID为“6124b721-88b0-428f-9b12-40c6743c41c6”。
提示:不要误获取成“PARTUUID”。
编辑 /etc/kernel/cmdline
文件,利用步骤31中获取到的加密系统卷和加密Swap卷的分区UUID,写入必要内核参数,使计算机引导启动Arch Linux时能自动触发解锁加密系统卷和加密Swap卷的认证过程。
1 rd.luks.name =43c1359f-08cb-4ea6-a48d-16abae610247=root rd.luks.name=6124b721-88b0-428f-9b12-40c6743c41c6=swap root=/dev/mapper/root rootflags=subvol=@,compress=zstd resume=/dev/mapper/swap rw quiet splash loglevel=0 rd.udev.log_level=3 systemd.show_status=false
提示:为了美观,参数中的“quiet splash loglevel=0 rd.udev.log_level=3 systemd.show_status=false”部分用于显示开机动画并隐藏Arch Linux启动过程中的信息。
修改/etc/mkinitcpio.d/linux.preset
文件,开启统一内核镜像(Unified kernel Image, UKI)支持,保存退出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ALL_kver ="/boot/vmlinuz-linux" PRESETS =('default' 'fallback') default_uki ="/boot/EFI/Linux/arch-linux.efi" default_options ="--splash=/usr/share/systemd/bootctl/splash-arch.bmp" fallback_uki ="/boot/EFI/Linux/arch-linux-fallback.efi" fallback_options ="-S autodetect"
安装systemd-boot
引导加载程序。
1 2 3 4 5 6 7 8 9 10 11 12 13 [root@archiso /]# bootctl install Created "/boot/EFI" . Created "/boot/EFI/systemd" . Created "/boot/EFI/BOOT" . Created "/boot/loader" . Created "/boot/loader/keys" . Created "/boot/loader/entries" . Created "/boot/EFI/Linux" . Copied "/usr/lib/systemd/boot/efi/systemd-bootx64.efi" to "/boot/EFI/systemd/systemd-bootx64.efi" . Copied "/usr/lib/systemd/boot/efi/systemd-bootx64.efi" to "/boot/EFI/BOOT/BOOTX64.EFI" . ⚠️ Mount point '/boot' which backs the random seed file is world accessible, which is a security hole! ⚠️ ⚠️ Random seed file '/boot/loader/.#bootctlrandom-seed26302ee42e5c38bd' is world accessible, which is a security hole! ⚠️ Random seed file /boot/loader/random-seed successfully written (32 bytes).
根据以上配置信息,重新生成 initramfs。
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 [root@archiso /]# mkinitcpio -p linux ==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'default' ==> Using default configuration file: '/etc/mkinitcpio.conf' -> -k /boot/vmlinuz-linux -U /boot/EFI/Linux/arch-linux.efi --splash /usr/share/systemd/bootctl/splash-arc h.bmp ==> Starting build: '6.15.6-arch1-1' -> Running build hook: [base] -> Running build hook: [systemd] -> Running build hook: [encrypt] -> Running build hook: [plymouth] -> Running build hook: [autodetect] -> Running build hook: [microcode] -> Running build hook: [modconf] -> Running build hook: [kms] -> Running build hook: [keyboard] -> Running build hook: [sd-vconsole] -> Running build hook: [block] -> Running build hook: [sd-encrypt] -> Running build hook: [filesystems] -> Running build hook: [resume] ==> Generating module dependencies ==> Creating zstd-compressed initcpio image -> Early uncompressed CPIO image generation successful ==> Initcpio image generation successful ==> Creating unified kernel image: '/boot/EFI/Linux/arch-linux.efi' -> Using ukify to build UKI -> Using cmdline file: '/etc/kernel/cmdline' Using config file: /usr/lib/kernel/uki.conf Wrote unsigned /boot/EFI/Linux/arch-linux.efi ==> Unified kernel image generation successful ==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'fallback' ==> Using default configuration file: '/etc/mkinitcpio.conf' -> -k /boot/vmlinuz-linux -U /boot/EFI/Linux/arch-linux-fallback.efi -S autodetect ==> Starting build: '6.15.6-arch1-1' -> Running build hook: [base] -> Running build hook: [systemd] -> Running build hook: [encrypt] -> Running build hook: [plymouth] -> Running build hook: [microcode] -> Running build hook: [modconf] -> Running build hook: [kms] ==> WARNING: Possibly missing firmware for module: 'ast' -> Running build hook: [keyboard] ==> WARNING: Possibly missing firmware for module: 'xhci_pci_renesas' -> Running build hook: [sd-vconsole] -> Running build hook: [block] ==> WARNING: Possibly missing firmware for module: 'aic94xx' ==> WARNING: Possibly missing firmware for module: 'bfa' ==> WARNING: Possibly missing firmware for module: 'qed' ==> WARNING: Possibly missing firmware for module: 'qla2xxx' ==> WARNING: Possibly missing firmware for module: 'qla1280' ==> WARNING: Possibly missing firmware for module: 'wd719x' -> Running build hook: [sd-encrypt] -> Running build hook: [filesystems] -> Running build hook: [resume] ==> Generating module dependencies ==> Creating zstd-compressed initcpio image -> Early uncompressed CPIO image generation successful ==> Initcpio image generation successful ==> Creating unified kernel image: '/boot/EFI/Linux/arch-linux-fallback.efi' -> Using ukify to build UKI -> Using cmdline file: '/etc/kernel/cmdline' Using config file: /usr/lib/kernel/uki.conf Wrote unsigned /boot/EFI/Linux/arch-linux-fallback.efi ==> Unified kernel image generation successful
执行exit
命令退出Chroot环境。
1 2 3 4 [root@archiso /]# exit exit arch-chroot /mnt 101.30s user 19.85s system 6% cpu 29:13.16 total root@archiso ~
完成Arch Linux基本系统的安装,拔出Arch Linux引导启动介质,执行reboot
命令重启计算机。
此时计算机会正常引导启动Arch Linux,系统加载动画过后,会提示输入密钥解锁加密系统卷和加密Swap分区。由于设置的是空密码,直接按Enter键稍等片刻即可进入系统。
输入管理员账户名称与密码登录系统。检查与互联网的连接正常后,为Pacman
添加AUR软件源以便于后续安装第三方软件。
1 echo -e "\n[archlinuxcn]\nServer = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/\$arch" | sudo tee -a /etc/pacman.conf
重新刷新软件源,可以看到archlinuxcn
源已成功添加。
1 2 3 4 5 [kylindemons@ASUS-TUF-Gaming-F15-FX507VV ~]$ sudo pacman -Syy :: Synchronizing package databases... core 120.2 KiB 73.0 KiB/s 00:02 [####] 100% extra 7.8 MiB 3.10 MiB/s 00:03 [####] 100% archlinuxcn 1380.7 KiB 505 KiB/s 00:03 [####] 100%
之后安装 archlinuxcn-keyring
包导入 GPG key。
1 sudo pacman -Sy archlinuxcn-keyring
安装yay
工具,用于从AUR软件源获取软件。
安装shim-signed
来使用由微软签署的引导加载程序Shim
以实现安全启动。
重命名当前的引导加载程序为grubx64.efi
。
1 sudo mv /boot/EFI/BOOT/BOOTx64.EFI /boot/EFI/BOOT/grubx64.efi
复制Shim与MokManager程序到EFI系统分区中的启动引导文件夹,然后将shimx64.efi
重命名为引导加载程序之前的文件名。
1 2 sudo cp /usr/share/shim-signed/shimx64.efi /boot/EFI/BOOT/BOOTx64.EFIsudo cp /usr/share/shim-signed/mmx64.efi /boot/EFI/BOOT/
然后,创建一个新的NVRAM引导项来启动BOOTx64.EFI
。
1 sudo efibootmgr --unicode --disk /dev/nvme0n1 --part 1 --create --label "Arch Linux" --loader /EFI/BOOT/BOOTx64.EFI
创建一个机器所有者密钥(Machine Owner Key, MOK)及证书,用于签署引导加载程序与内核:
1 openssl req -newkey rsa:4096 -nodes -keyout MOK.key -new -x509 -sha256 -subj "/CN=Machine Owner Key/" -out MOK.crt
1 openssl x509 -outform DER -in MOK.crt -out MOK.cer
为了安全,将机器所有者密钥及证书存放在一个相对安全的位置,并缩小文件权限,仅限root用户能够读取与修改。
1 sudo chown root:root MOK.*
1 sudo mkdir /usr/share/sbkeys
1 sudo mv MOK.* /usr/share/sbkeys/
利用机器所有者密钥及证书签名引导加载程序以及内核。
1 2 [kylindemons@ASUS-TUF-Gaming-F15-FX507VV ~]$ sudo sbsign --key /usr/share/sbkeys/MOK.key --cert /usr/share/sbkeys/MOK.crt --output /boot/vmlinuz-linux /boot/vmlinuz-linux Signing Unsigned original image
1 2 [kylindemons@ASUS-TUF-Gaming-F15-FX507VV ~]$ sudo sbsign --key /usr/share/sbkeys/MOK.key --cert /usr/share/sbkeys/MOK.crt --output /boot/EFI/BOOT/grubx64.efi /boot/EFI/BOOT/grubx64.efi Signing Unsigned original image
为保证每次系统更新内核后,能及时对新内核进行签名,使用一个mkinitcpio
后置钩子自动化签名过程。创建/etc/initcpio/post/kernel-sbsign
文件并写入以下内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 kernel ="$1" [[ -n "$kernel" ]] || exit 0 [[ ! -f "$KERNELDESTINATION" ]] || kernel="$KERNELDESTINATION" keypairs =(/usr/share/sbkeys/MOK.key /usr/share/sbkeys/MOK.crt) for (( i=0; i<${#keypairs[@]}; i+=2 )); do key ="${keypairs[$i]}" cert="${keypairs[(( i + 1 ))]}" if ! sbverify --cert "$cert" "$kernel" &>/dev/null; then sbsign --key "$key" --cert "$cert" --output "$kernel" "$kernel" fi done
为/etc/initcpio/post/kernel-sbsign
文件添加可执行权限。
1 sudo chmod +x /etc/initcpio/post/kernel-sbsign
更新内核后,也需要及时对统一内核镜像进行签名,使用一个Pacman
钩子自动化签名过程。创建/etc/initcpio/post/uki-sbsign
文件并写入以下内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 #!/usr/bin/env bash uki="$3 " [[ -n "$uki " ]] || exit 0 keypairs=(/usr/share/sbkeys/MOK.key /usr/share/sbkeys/MOK.crt) for (( i=0 ; i<${#keypairs[@]} ; i+=2 )); do key="${keypairs[$i]} " cert="${keypairs[(( i + 1 ))]} " if ! sbverify --cert "$cert " "$uki " &>/dev/null; then sbsign --key "$key " --cert "$cert " --output "$uki " "$uki " fi done
为/etc/initcpio/post/uki-sbsign
文件添加可执行权限。
1 sudo chmod +x /etc/initcpio/post/uki-sbsign
同样地,为systemd-boot
引导加载程序设置安全启动自动签名操作。创建/etc/pacman.d/hooks/80-sign_systemd-boot_kernel_for_secureboot.hook
文件并写入以下内容。
1 2 3 4 5 6 7 8 9 10 11 12 [Trigger] Operation = Install Operation = Upgrade Type = Path Target = usr/lib/systemd/boot/efi/systemd-boot*.efi [Action] Description = Signing systemd-boot EFI binary for Secure Boot When = PostTransaction Exec = /bin/sh -c 'while read -r f; do /usr/lib/systemd/systemd-sbsign sign --private-key /usr/share/sbkeys/MOK.key --certificate /usr/share/sbkeys/MOK.crt --output "${f}.signed" "$f"; done;' Depends = sh NeedsTargets
为/etc/pacman.d/hooks/80-sign_systemd-boot_kernel_for_secureboot.hook
文件添加可执行权限。
1 sudo chmod +x /etc/pacman.d/hooks/80-sign_systemd-boot_kernel_for_secureboot.hook
开启systemd-boot
引导加载程序的自动更新功能。
1 sudo systemctl enable --now systemd-boot-update.service
重新生成 initramfs,对统一内核镜像进行签名。
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 [kylindemons@ASUS-TUF-Gaming-F15-FX507VV ~]$ sudo mkinitcpio -p linux ==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'default' ==> Using default configuration file: '/etc/mkinitcpio.conf' -> -k /boot/vmlinuz-linux -U /boot/EFI/Linux/arch-linux.efi --splash /usr/share/systemd/bootctl/splash-arch.bmp ==> Starting build: '6.15.6-arch1-1' -> Running build hook: [base] -> Running build hook: [systemd] -> Running build hook: [encrypt] -> Running build hook: [plymouth] -> Running build hook: [autodetect] -> Running build hook: [microcode] -> Running build hook: [modconf] -> Running build hook: [kms] -> Running build hook: [keyboard] -> Running build hook: [sd-vconsole] -> Running build hook: [block] -> Running build hook: [sd-encrypt] -> Running build hook: [filesystems] -> Running build hook: [resume] ==> Generating module dependencies ==> Creating zstd-compressed initcpio image -> Early uncompressed CPIO image generation successful ==> Initcpio image generation successful ==> Creating unified kernel image: '/boot/EFI/Linux/arch-linux.efi' -> Using ukify to build UKI -> Using cmdline file: '/etc/kernel/cmdline' Using config file: /usr/lib/kernel/uki.conf Wrote unsigned /boot/EFI/Linux/arch-linux.efi ==> Unified kernel image generation successful ==> Running post hooks -> Running post hook: [uki-sbsign] Signing Unsigned original image ==> Post processing done ==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'fallback' ==> Using default configuration file: '/etc/mkinitcpio.conf' -> -k /boot/vmlinuz-linux -U /boot/EFI/Linux/arch-linux-fallback.efi -S autodetect ==> Starting build: '6.15.6-arch1-1' -> Running build hook: [base] -> Running build hook: [systemd] -> Running build hook: [encrypt] -> Running build hook: [plymouth] -> Running build hook: [microcode] -> Running build hook: [modconf] -> Running build hook: [kms] ==> WARNING: Possibly missing firmware for module: 'ast' -> Running build hook: [keyboard] ==> WARNING: Possibly missing firmware for module: 'xhci_pci_renesas' -> Running build hook: [sd-vconsole] -> Running build hook: [block] ==> WARNING: Possibly missing firmware for module: 'aic94xx' ==> WARNING: Possibly missing firmware for module: 'bfa' ==> WARNING: Possibly missing firmware for module: 'qed' ==> WARNING: Possibly missing firmware for module: 'qla2xxx' ==> WARNING: Possibly missing firmware for module: 'qla1280' ==> WARNING: Possibly missing firmware for module: 'wd719x' -> Running build hook: [sd-encrypt] -> Running build hook: [filesystems] -> Running build hook: [resume] ==> Generating module dependencies ==> Creating zstd-compressed initcpio image -> Early uncompressed CPIO image generation successful ==> Initcpio image generation successful ==> Creating unified kernel image: '/boot/EFI/Linux/arch-linux-fallback.efi' -> Using ukify to build UKI -> Using cmdline file: '/etc/kernel/cmdline' Using config file: /usr/lib/kernel/uki.conf Wrote unsigned /boot/EFI/Linux/arch-linux-fallback.efi ==> Unified kernel image generation successful ==> Running post hooks -> Running post hook: [uki-sbsign] Signing Unsigned original image ==> Post processing done
将安全启动证书MOK.cer
复制一份到EFI系统分区,用于后续导入固件NVRAM中,以进行安全启动认证。
1 sudo cp /usr/share/sbkeys/MOK.cer /boot/EFI/
重新启动计算机并进入UEFI固件设置,开启安全启动,保存设置后再次重新启动计算机。
开启安全启动后,计算机再次引导Arch Linux时会因缺失机器所有者证书而禁止Arch Linux的引导加载程序启动,显示以下类似界面。
此时选择“OK”,进入“Shim UEFI Key Management”界面,在倒计时结束之前按任意键继续。
进入“Perform MOK Management”菜单,选择“Enroll key from disk”选项,在后续的文件列表中找到复制进EFI系统分区的“MOK.cer”机器所有者证书。 选择该证书文件,在接下来的菜单中,选择“Continue”并确认导入该证书。 完成后,选择“Reboot”重启计算机,即可正常进入Arch Linux。
登录进系统后,执行以下命令查看安全启动开启状态。
1 2 3 4 5 6 7 8 9 [kylindemons@ASUS-TUF-Gaming-F15-FX507VV ~]$ sudo bootctl status [sudo ] password for kylindemons: System: Firmware: UEFI 2.70 (VMware, Inc. 1.00) Firmware Arch: x64 Secure Boot: enabled (deployed) TPM2 Support: yes Measured UKI: no Boot into FW: supported
安全启动成功开启后,即可将加密系统卷与加密Swap卷的解锁凭据导入进可信平台模块实现计算机启动时自动解锁加密卷。执行以下命令将移除之前创建的空密码,并创建加密系统卷的恢复密钥。过程中会提示输入加密系统卷的密码,仍然按Enter键使用空密码确认。该命令输出的恢复密钥,将用于安全启动或可信安全模块被非法破坏时解锁加密系统卷。请务必保管好该密钥,如果丢失,可能导致意外情况下永远无法解密加密系统卷
。
1 2 3 4 5 6 7 8 9 10 11 12 [kylindemons@ASUS-TUF-Gaming-F15-FX507VV ~]$ sudo systemd-cryptenroll /dev/nvme0n1p3 --recovery-key [sudo ] password for kylindemons: 🔐 Please enter current passphrase for disk /dev/nvme0n1p3: A secret recovery key has been generated for this volume: 🔐 frgfndut-gebltkfc-nulkfffb-gunhihrj-tidrncvf-bbdevbgi-rktdbiif-rkffkbll Please save this secret recovery key at a secure location. It may be used to regain access to the volume if the other configured access credentials have been lost or forgotten. The recovery key may be entered in place of a password whenever authentication is requested. New recovery key enrolled as key slot 1.
随后执行以下命令将解锁凭据导入进可信平台模块,提示输入密码时仍然直接按Enter以空密码确认。
1 2 3 4 [kylindemons@ASUS-TUF-Gaming-F15-FX507VV ~]$ sudo systemd-cryptenroll /dev/nvme0n1p3 --wipe-slot=empty --tpm2-device=auto --tpm2-pcrs=7 🔐 Please enter current passphrase for disk /dev/nvme0n1p3: New TPM2 token enrolled as key slot 3. Wiped slot 0.
最后,对加密Swap卷的解锁凭据同样进行导入可信平台模块的操作,提示输入密码时也仍然直接按Enter以空密码确认。
1 2 3 [kylindemons@ASUS-TUF-Gaming-F15-FX507VV ~]$ sudo systemd-cryptenroll --tpm2-device auto /dev/nvme0n1p2 🔐 Please enter current passphrase for disk /dev/nvme0n1p2: New TPM2 token enrolled as key slot 1.
1 2 [kylindemons@ASUS-TUF-Gaming-F15-FX507VV ~]$ sudo systemd-cryptenroll --wipe-slot password /dev/nvme0n1p2 Wiped slot 0.
重启计算机,应能够直接进入Arch Linux系统而无需输入加密卷的解锁密码。再次执行以下命令,获取系统状态,可以发现“Measured UKI”状态已为“yes”。
1 2 3 4 5 6 7 8 9 [kylindemons@ASUS-TUF-Gaming-F15-FX507VV ~]$ sudo bootctl status [sudo ] password for kylindemons: System: Firmware: UEFI 2.70 (VMware, Inc. 1.00) Firmware Arch: x64 Secure Boot: enabled (deployed) TPM2 Support: yes Measured UKI: yes Boot into FW: supported
删除步骤51中复制进EFI系统分区中的安全启动证书文件,并对/boot引导分区设置正确权限,减少安全性问题。
1 2 3 4 5 sudo rm -rf /boot/EFI/MOK.cersudo chown root:root /bootsudo chmod 755 /bootsudo chmod 600 /boot/vmlinuz-*sudo chmod 600 /boot/initramfs-*
到此,全新安装的Arch Linux,已完成实施启用SecureBoot、基于TPM2的LUKS系统加密自动解密、具有快照功能的Btrfs根分区、Swap加密。
后续可选操作与建议
本实践过程为最小化安装,仅安装了实现加密等功能的必要工具,后续可以根据需求自行安装图形化桌面环境等组件。
在双系统环境下,请考虑在Arch Linux下将硬件时间设置为本地时间,以解决双系统因时区识别错误,导致时间不一致的问题。具体可参考相关文档 。
1 sudo timedatectl set-local-rtc 1
在双系统环境下,建议定时对Windows和Arch Linux进行系统更新,以确保两个操作系统的引导加载程序的安全启动证书为最新状态。避免后期因安全问题在UEFI固件吊销老旧安全启动证书时,导致同样采用旧安全启动证书的操作系统无法启动。
Arch Linux若要使用Timeshift
工具管理Btrfs文件系统分区的快照,请按照以下命令删除(请确保文件夹内无重要文件,如有请自行备份)并重建部分由systemd
自动生成的文件夹,避免后期删除快照的操作出错。
1 2 3 4 sudo rm -rf /var/lib/portablessudo rm -rf /var/lib/machinessudo mkdir /var/lib/portablessudo mkdir /var/lib/machines
版本记录
日期
版本
修改内容
2025-07-28
v1.0
初稿发布