带加密的 Arch Linux 设置(LUKS 上的 LVM)

带加密的 Arch Linux 设置(LUKS 上的 LVM)

我想为 Arch Linux 设置加密。我在上找到了教程拱门维基,并认为第二个选项(LUKS 上的 LVM)对我来说是最佳选择。这是我想要使用的分区(Thinkpad X1 Carbon,~ 500 GB SSD,16 GB RAM):

  1. [对齐间隙] 1 MB
  2. /boot256 MB(FAT 32)
  3. 交换 16 GB(内存大小)
  4. /(根)64 GB (ext4)
  5. /var8 GB (ext4)
  6. /tmp4 GB (ext4)
  7. /home~400 GB(ext4,剩余部分)

该磁盘的名称为nvme0n1。启动安装程序(2020 年 9 月版本)并连接到 WiFi 后,我用随机数据覆盖磁盘:

# shred --random-source=/dev/urandom --iterations=3 /dev/nvme0n1

然后我设置一个新的 GPT 分区架构:

# parted -s /dev/nvme0n1 mklabel gpt

接下来,我创建并格式化一个启动分区,其前面有 1 MB 的对齐间隙。

# parted -s /dev/nvme0n1 mkpart boot fat32 1MiB 257MiB
# parted -s /dev/nvme0n1 set 1 esp on
# mkfs.fat -F 32 /dev/nvme0n1p1

现在到了维基百科不清楚的部分。 (它只提到可以/boot在不同的设备上使用,但我没有。)我决定创建另一个分区,我的加密卷将位于其顶部:

# parted -s /dev/nvme0n1 mkpart cryptlvm 257MiB '100%'

/dev/nvme0n1p2这将创建具有剩余磁盘大小的第二个分区。 (也许这一步会导致问题。)我继续设置加密:

# cryptsetup luksFormat /dev/nvme0n1p2     # YES, entering passphrase  twice
# cryptsetup open /dev/nvme0n1p2 cryptlvm  # entering passphrase
# pvcreate /dev/mapper/cryptlvm
# vgcreate VolumeGroup /dev/mapper/cryptlvm

然后我按照上面的描述创建分区:

# lvcreate -L 16G VolumeGroup -n swap
# lvcreate -L 64G VolumeGroup -n root
# lvcreate -L 8G VolumeGroup -n var
# lvcreate -L 4G VolumeGroup -n tmp
# lvcreate -l '100%FREE' VolumeGroup -n home

现在正在格式化分区:

# mkswap /dev/VolumeGroup/swap
# mkfs.ext4 -F /dev/VolumeGroup/root
# mkfs.ext4 -F /dev/VolumeGroup/var
# mkfs.ext4 -F /dev/VolumeGroup/tmp
# mkfs.ext4 -F /dev/VolumeGroup/home

并安装:

# mount /dev/VolumeGroup/root /mnt

# mkdir /mnt/boot
# mount /dev/nvme0n1p1 /mnt/boot

# mkdir /mnt/var
mount /dev/VolumeGroup/var /mnt/var

# mkdir /mnt/tmp
mount /dev/VolumeGroup/tmp /mnt/tmp

# mkdir /mnt/home
mount /dev/VolumeGroup/home /mnt/home

现在可以使用以下命令来引导系统lvm2

# pacstrap /mnt base liux linux-firmware lvm2

我还创建并存储了fstab

# genfstab -U /mnt >> /mnt/etc/fstab

chroot进入引导系统:

# arch-chroot /mnt

正如 wiki 中提到的,我添加了钩子encryptlvm2/etc/mkinitcpio.conf

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

我继续执行通常的设置任务(设置 root 密码、安装基础软件包、设置时区、区域设置、语言、主机名):

# passwd
# pacman -S iw wpa_supplicant dialog intel-ucode netctl dhcpcd
# ln -sf /usr/share/zoneinfo/Europe/Zurich /etc/localtime
# timedatectl set-ntp true
# hwclock --systohc
# echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen
# locale-gen
# echo 'LANG=en_US.UTF-8' > /etc/locale.conf
# echo -n 'x1' > /etc/hostname

现在是引导加载程序。这里我传统上使用 systemd 引导加载程序而不是 grub。我的设置方法如下:

# systemd-machine-id-setup
# bootctl --path=/boot install

我计算出根分区的 UUID(不是 PARTUUID),如下所示:

# blkid | grep /dev/VolumeGroup/root | egrep -o 'UUID="[^"]!"'
UUID="6d5b4777-2621-4bec-8bbc-ebd4b5ba9faf"

然后我在以下位置创建启动条目/boot/loader/entries/arch.conf

title   Arch Linux
linux   /vmlinuz-linux
initrd  /initramfs-linux.img
options cryptdevice=UUID=6d5b4777-2621-4bec-8bbc-ebd4b5ba9faf:cryptlvm root/dev/VolumeGroup/root

并根据/boot/loader/loader.conf

default arch
timeout 0
editor  0

最后但并非最不重要的一点是,我mkinitcpio在重新启动之前运行:

# mkinitcpio -P
# exit
# umount -R /mnt
# shutdown -h now

这就是我的设置过程。我移除 USB 加密狗并启动系统。引导加载程序出现,但随后我看到以下屏幕:

:: running early hook [udev]
Starting version 246.6-1-arch
:: running early hook [lvm2]
:: running hook [udev]
:: Triggering uevents...
:: running hook [encrypt]
Waiting 10 seconds for device /dev/disk/by-uuid/6d5b4777-2621-4bec-8bbc-ebd4b5ba9faf ...
Waiting 10 seconds for device /dev/VolumeGroup/root ...
ERROR: device '/dev/VolumeGroup/root' not found. Skippng fsck.
:: mounting '/dev/VolumeGroup/root' on real root
mount: /new_root: no filesystem type specified.
You are now being dropped into an emergency shell.

现在我完全不知道自己做错了什么。一个怀疑是/dev/nvme0n1p2我需要创建的第二个分区 ( )。另一个怀疑是我的引导加载程序做错了。在常规设置中,我总是使用 PARTUUID 而不是 UUID。 (但是, 的输出中没有 PARTUUID blikd,因此这可能不是问题所在。)

答案1

由于@frostschutz 还没有写出他对该问题的正确解决方案作为答案,我将在这里快速总结该问题:我选择了错误分区的 UUID。下面的根分区/dev/VolumeGroup/root不是要选择的分区,而是实际的分区/dev/nvme0n1p2。以下是提取 UUID 的方法:

# uuid=$(blkid --match-tag UUID -o value /dev/nvme0n1p2)

然后可以在引导加载程序条目配置中使用:

# cat <<EOF >/boot/loader/entries/arch.conf
title   Arch Linux
linux   /vmlinuz-linux
initrd  /initramfs-linux.img
options cryptdevice=UUID=${uuid}:cryptlvm root=/dev/volgrp/root
EOF

我在我的博客上总结了整个过程私人网站。还要感谢@Cbhihe 对于分区大小的建议。

相关内容