译者注:本文摘自 arwiki 上在 LUKS 上部署 LVM 条目,起具体操作只适用于 Arch GNU/Linux,但其所述的基本原理是通用的,可以根据其基本原理结合其他版本的实际情况操作。

这是一个在加密分区的基础上部署 LVM 而非其他途径部署的简易方法。(使用这种方法,)逻辑卷被合理地部署在了一个较大的加密区块设备里。因此,逻辑卷中的内容在加密的区块设备解锁前无法读取,底层逻辑卷结构在启动期间才接受扫描并挂载。

这是一个 LUKS 加密磁盘的布局案例:

) 注意:当使用 encrypt 锚点时,这个方法将不能在多个磁盘上搭建逻辑卷;使用sd-encrypt或者查阅dm-crypt/专项#为多分区修改 encrypt 锚点

) 提示:这是该设置的两种变体: ) ) - dm-crypt/专项#使用分离的 LUKS 报头的加密系统所提供的方法,通过在 USB 设备上的独立 LUKS 报头实现该设置,该方法可实现双因素身份认证。 ) -dm-crypt/专项#使用在 USB 设备上分离的 LUKS 报头的加密系统所提供的方法,通过使用 USB 设备上的独立的 LUKS 报头,加密的 /boot 分区,且所有密钥文件都在 USB 设备上,来实现该设置。

Preparing the disk

准备磁盘

在创建任何分区之前,你应该知晓安全擦除磁盘的相关方法及重要性,如 dm-crypt/驱动器准备中所描述的那样。

) 提示:当在 GPT 磁盘上,使用为 BIOS 启动准备的 GRUB 启动器时,创建一个 BIOS 启动分区

创建一个挂载点为 /boot 的分区,分区容量 200 MiB 以上。

) 提示:UEFI 系统可以将 EFI 系统分区 用作/boot

创建一个随后将容纳加密容器的分区。

在“系统”分区创建一个 LUKS 加密容器。键入所需口令两次。

# cryptsetup luksFormat /dev/sda1

更多可用的 cryptsetup 选项,参见 LUKS 加密选项

打开加密容器:

# cryptsetup open /dev/sda1 cryptlvm

加密容器现可已于 /dev/mapper/cryptlvm 中使用。

准备逻辑卷

在处于解锁状态的 LUKS 容器之上创建一个物理卷。

# pvcreate /dev/mapper/cryptlvm

创建名为 MyVolGroup (或者其他任何你想取的名字),将先前创建的物理卷添加进来:

# vgcreate MyVolGroup /dev/mapper/cryptlvm

在卷组中创建所有你所需的逻辑卷。

# lvcreate -L 8G MyVolGroup -n swap
# lvcreate -L 32G MyVolGroup -n root
# lvcreate -l 100%FREE MyVolGroup -n home

在每个逻辑卷上格式化你所需的文件系统:

# mkfs.ext4 /dev/MyVolGroup/root
# mkfs.ext4 /dev/MyVolGroup/home
# mkswap /dev/MyVolGroup/swap

挂载你的文件系统:

# mount /dev/MyVolGroup/root /mnt
# mkdir /mnt/home
# mount /dev/MyVolGroup/home /mnt/home
# swapon /dev/MyVolGroup/swap

准备启动分区

启动器从 /boot 目录加载系统内核,initramfs,及其配置文件。在磁盘上任何可被启动器读取的文件系统都可以使用。

在为 /boot 提前规划好的分区里创建文件系统

# mkfs.ext4 /dev/sdb1

) 提示:选择将 /boot 保持在某个 EFI 系统分区 时,推荐以如下方式格式化 ) ) ) # mkfs.fat -F32 /dev/sdb1 )

创建 /mnt/boot 目录:

# mkdir /mnt/boot

挂载启动分区到 /mnt/boot:

# mount /dev/sdb1 /mnt/boot

配置 mkinitcpio

请确认 lvm2 包已安装,然后在 mkinitcpio.conf 添加锚点 keyboardencryptlvm

HOOKS=(base udev autodetect keyboard keymap consolefont modconf block encrypt lvm2 filesystems fsck)

如果配合系统基本的 initramfs 使用 sd-encrypt 锚点,需要另外设置以下内容:

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

详情见 dm-crypt/系统配置#mkinitcpio

配置启动器

为了在启动时解锁加密的 root 分区,以下内核参数需要为启动器设置:

cryptdevice=UUID=device-UUID:cryptlvm root=/dev/MyVolGroup/root

如果使用 sd-encrypt 锚点,以下参数也需另外设置:

rd.luks.name=device-UUID=cryptlvm root=/dev/MyVolGroup/root

*device-UUID* 是指 /dev/sda1 的 UUID。详情见持久块设备命名

如果使用 dracut ,你可能需要更多可延展的参数列表,尝试:

kernel_cmdline="rd.luks.uuid=luks-deviceUUID rd.lvm.lv=MyVolGroup/root  rd.lvm.lv=MyVolGroup/swap  root=/dev/mapper/MyVolGroup-root rootfstype=ext4 rootflags=rw,relatime"

详情见 dm-crypt/系统配置文件#启动器