ArchLinux 在LUKS中使用LVM卷组,并启用带TPM2.0的安全启动

1. 分区

1.1 对磁盘进行分区

1.1.1 使用以下命令进行分区

cfdisk /dev/nvme0n1

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

分区设备大小卷标
/dev/nvme0n1p1512MEFI File System
/dev/nvme0n1p2632GLinux File System

1.2 格式化分区

1.2.1 格式化ESP分区

mkfs.vfat /dev/nvme0n1p1

1.2.2 初始化LUKS分区

cryptsetup luksFormat /dev/nvme0n1p2   # 运行后输入大写的YES,然后设置密码(不会回显)

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

# 新建数据分区(btrfs)
lvcreate -L 550G ArchLinux -n lvoldata

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

1.2.5 格式化LVM卷组

mkfs.ext4 /dev/ArchLinux/lvolroot        # /dev/mapper/ArchLinux-lvolroot 也可以
mkfs.btrfs /dev/ArchLinux/lvoldata
mkswap /dev/ArchLinux/lvolswap

此处博主想要使用LVM的特性,并使用btrfs子卷的形式挂载home、opt、var等目录,所以博主将data卷作为btrfs分区

1.3 挂载分区

1.3.1 挂载根分区

mount /dev/ArchLinux/lvolroot /mnt

1.3.2 挂载ESP分区

mount --mkdir /dev/nvme0n1p1 /mnt/boot

1.3.3 准备数据分区

新建临时目录用于挂在数据分区

mkdir /btrfs-temp

将数据分区挂载到临时目录

mount /dev/ArchLinux/lvoldata

切换目录到临时目录,准备创建子卷,用户可按照自己的需求增减子卷的个数

cd /btrfs-temp
btrfs subvol create @home # 家目录
btrfs subvol create @root # 用户目录(对应root用户)
btrfs subvol create @var # 配置目录
btrfs subvol create @opt # 软件安装目录
btrfs subvol create @srv # Web网站目录
# 卸载数据分区并删除临时目录
cd /
umount /dev/ArchLinux/lvoldata
rmdir /btrfs-temp

1.3.4 挂载数据分区

mount --mkdir /dev/ArchLinux/lvoldata /mnt/home -o subvol=@home
mount --mkdir /dev/ArchLinux/lvoldata /mnt/root -o subvol=@root
mount --mkdir /dev/ArchLinux/lvoldata /mnt/var -o subvol=@var
mount --mkdir /dev/ArchLinux/lvoldata /mnt/opt -o subvol=@opt
mount --mkdir /dev/ArchLinux/lvoldata /mnt/srv -o subvol=@srv

2. 安装基本系统

2.1 基本配置

此处请按照传统安装方式进行安装并生成fstab,然后chroot到ArchLinux,并设置语言、用户、网络、主机名、hosts等。

如果你不知道如何安装ArchLinux,请点击这里查看安装教程,但是不要安装GRUB

2.2 安装必需的软件包

sudo pacman -S intel-ucode sbctl efibootmgr lvm2 btrfs-progs # 如果你使用的是AMD CPU,请将intel-ucode改为amd-ucode,如果你不想使用btrfs分区,你无需安装btrfs-progs

3. 准备配置引导界面

3.1 新建必需的文件

新建vconsole文件

touch /etc/vconsole.conf

3.2 修改mkinitcpio内核配置

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

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

编辑PRESENT字段,如果你不需要fallback内核,则你可以删除掉'fallback'字段并注释掉和fallback有关的内容

注释掉default_image字段,并反注释default_uki字段,记得修改分区目录(默认为/efi/EFI/Linux/arch-linux-zen.efi),需要将/efi修改为用户实际挂载的目录,这样的话在运行mkinitcpio命令的时候,会生成一个便于引导的.efi文件。

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

ALL_kver="/boot/vmlinuz-linux-zen"
ALL_microcode=(/boot/intel-ucode.img)
PRESENTS=('default' 'fallback')
​
default_config="/etc/mkinitcpio.conf"
default_uki="/boot/EFI/Linux/arch-linux-zen.efi"
​
fallback_config="/etc/mkinitcpio.conf"
fallback_uki="/boot/EFI/Linux/arch-linux-zen-fallback.efi"

3.3 修改mkinitramfs.conf

需要修改HOOKS字段和MODULES字段

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

dmesg | grep tpm

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


MODULES=(tpm)

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

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

运行blkid,然后记录/dev/nvme0n1p2UUID,假设记录的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默认启动项新建引导项

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

为ArchLinux Fallback启动项新建引导项

efibootmgt --create --disk /dev/nvme0n1 --part 1 --loader /EFI/Linux/arch-linux-zen-fallback.efi --label "Arch Linux (zen fallback)" --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 录入密钥

sbctl enroll-keys -m

4.2.4 使用密钥对EFI进行签名

对ArchLinux默认启动项EFI签名

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

对ArchLinux Fallback启动项EFI签名

sbctl sign /boot/EFI/Linux/arch-linux-zen-fallback.efi

检测是否签名成功

sbctl verify | grep "is signed" # 如果看到了上方的的两个efi文件的所在目录,则说明签名成功

4.3 对LUKS签名

使用systemd-cryptenroll对LUKS进行签名

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

4.4 开启Secure Boot

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

4.5 设置mkinitcpio后自动签名

4.5.1 新建initcpio钩子

请一定要设置,否则在执行mkinitcpio后efi文件的签名一定会掉,且更新系统后可能会执行mkinitcpio命令,所以需要自定义一个后钩子函数(post hook function)来保证签名实时有效

编辑/etc/initcpio/post/autosign文件,其中autosign可以改为其他名称

#!/usr/bin/env bash
# SPDX-License-Identifier: LGPL-3.0-only

echo "检测linux-zen是否被签名..."
sbctl verify | grep "arch-linux-zen.efi is signed" > /dev/null
if [ $? -eq 0 ]; then
	echo "linux-zen已经签名,无需再次签名"
else
	echo "正在签名linux-zen,请稍等..."
	sbctl sign /boot/EFI/Linux/arch-linux-zen.efi
fi
echo "检测linux-zen (fallback) 是否被签名..."
sbctl verify | grep "arch-linux-zen-fallback.efi is signed" > /dev/null
if [ $? -eq 0 ]; then
	echo "linux-zen (fallback)已经签名,无需再次签名"
else
	echo "正在签名linux-zen (fallback),请稍等..."
	sbctl sign /boot/EFI/Linux/arch-linux-zen-fallback.efi
fi

4.5.2 运行mkinitcpio,测试

sudo mkinitcpio -P

再次检查签名,查看linux-zen和linux-zen-fallback是否已签名

sudo sbctl verify | grep "is signed"
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇