译者注:本文摘自 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 添加锚点 keyboard
、encrypt
、lvm
:
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"