我想在一台 PC 上安装 Ubuntu 22.04,该 PC 配备一个 NVMe 固态硬盘作为操作系统,一个传统硬盘作为 /home,并使用全盘加密。
在购买硬件之前,我一直在尝试在具有两个 SATA 驱动器的虚拟机上安装 Ubuntu 22.04 来模拟此设置。由于该机器将用作桌面,因此我一直在使用桌面安装程序。
如果我在安装过程中选择全盘加密,安装程序似乎想将所有内容安装到单个驱动器上,而我无法控制分区。
如果我选择高级选项,我会得到一些手动分区选项,但我不清楚应该如何设置加密。我得到的最接近工作配置是这样的:
驾驶 | 分割 | 描述 |
---|---|---|
/dev/sda(固态硬盘) | /dev/sda1 | lvm 分区用于加密,填充整个驱动器 |
/dev/mapper/sda1_crypt | ext4 分区挂载在 /,填满整个分区 | |
/dev/sdb(硬盘) | /dev/sdb1 | 1MB biosgrub 分区 |
/dev/sdb2 | 1GB EFI 分区 | |
/dev/sdb3 | 1GB ext4 /boot 分区 | |
/dev/sdb4 | 用于加密的 lvm 分区,占用驱动器上的剩余空间 | |
/dev/mapper/sdb4_crypt | /home 的 ext4 分区占据了整个加密分区 |
我不知道如何添加任何交换,我也想加密它。在这种情况下,我实际上无法继续安装,因为“立即安装”按钮是灰色的。
我已将 biosgrub、EFI 和 /boot 分区放在硬盘上,因为我使用的较旧系统上的 BIOS 几乎肯定无法从 NVMe SSD 启动。这显然不是我测试的虚拟机的问题。
这种配置可行吗,还是我要求太多了?实际上情况比这更糟,因为我真的很想使用 bcache,并将部分 SSD 留出来用于缓存 /home 分区,但我没有把它放在问题标题中,因为我认为在不添加 bcache 的情况下询问这个问题可能会更有帮助。
使用服务器安装程序会更好吗?让桌面安装程序将所有内容放在一个驱动器上,然后再尝试修复问题,是不是最简单的方法?
看看现有的问题:
- 我发现如何在 SSD 上安装带有 LVM 和 LUKS 的 Ubuntu,并使用 LUKS 加密的 HDD 来存储戴尔 Inspiron 7580 上的数据但这似乎与 Ubuntu 19.04 有关,而且我不清楚该建议是否仍然适用。
- 如何安装具有磁盘加密和 SSD 缓存的 Ubuntu看起来这正是我想要的,但它是 2015 年的,所以我不确定它是否仍然适用。
任何建议都将不胜感激,即使只是“不要那样做!”。:-)
答案1
我搞清楚了如何做到这一点,包括 bcache。到目前为止,我只在 VirtualBox VM 中尝试过,但我认为它在真实硬件上也能以类似的方式工作。
根据上面对我的原始问题的评论,这不是一个合理的配置。多年来我一直在使用这样的设置(但没有加密),对我来说没问题。也许我只是不那么苛刻,或者 bcache 正在做它的工作并在后台加速对 /home 上内容的访问,而我不需要手动决定哪些内容放在 SSD 上小而快的 /home 上,哪些内容放在硬盘上大而慢的分区上。无论如何,我很固执,我想看看我是否能让它工作,我想我已经做到了 - 但在选择这样的设置之前,请考虑上面的评论。
我写得可能过于详细了,但我还是要写出来供自己参考,所以我想我还是把它贴在这里吧。当然,如果你真的想按照这个做,你可能需要对驱动器名称和分区大小进行一些手动调整。
这里的关键技巧是:
- 从命令行手动分区,设置未加密分区和 LUKS 加密分区,然后设置 LVM,然后设置 bcache。然后让标准安装程序执行其操作。
- 调整最终的安装,以便它可以从加密分区正确启动并理解 bcache 分区。
我将以 VirtualBox 的一系列步骤来解释这一点,但这只是在实际硬件上尝试之前的一次练习。因为我将使用旧硬件(i5-2500K CPU、Intel DQ670W 主板)和 PCI-e 卡上的 NVMe SSD,BIOS 可能无法从中启动,所以我将所有与启动相关的分区放在硬盘上,并将其用作启动驱动器。在更现代的硬件上可能没有必要这样做,或者如果您真的想在 VirtualBox 中“真正”地设置它,则可能没有理由这样做。
这些说明包括 bcache 支持,但我认为只要省略 bcache 特定的步骤,就可以成功实现在两个驱动器上进行全盘加密的系统,只是没有缓存。不过我还没有尝试过。
创建一个具有(例如)4GB RAM 的新虚拟机
创建一个名为“HDD”的虚拟硬盘(例如 64GB),并将其连接到 SATA 端口 0
创建一个名为“SSD”的虚拟硬盘(例如 32GB),并将其连接到 SATA 端口 1
- 勾选“固态硬盘”框只是为了整洁,但它可能不会影响任何东西
将 Ubuntu 22.04 Desktop 安装程序映像插入光驱。
启动虚拟机并引导至“欢迎”屏幕
按 Ctrl-Alt-F2 获取虚拟控制台,以“ubuntu”身份登录,然后执行“sudo bash”获取 root shell
-
我不会尝试在这里提供操作“gdisk”的逐步说明,但我会指出,当它要求输入第一个扇区时,只需按 Enter 键,当它要求输入最后一个扇区时,输入“+”(非常重要)后跟大小,例如“+1M”或“+1024M”,或者只需按 Enter 键即可使用磁盘的其余部分。
这可能不是必需的,但我很偏执:输入“sync”和“reboot”,然后再次按照上述步骤返回到 root shell。
将 EFI 分区格式化为 FAT32:
mkfs.fat -F 32 /dev/sda2
设置密码(我强烈建议相同的两个 LUKS 分区的密码:
cryptsetup luksFormat /dev/sda4 # 硬盘上的 LUKS 分区 cryptsetup luksFormat /dev/sdb1 # SSD 上的 LUKS 分区
打开这两个 LUKS 分区:
cryptsetup luks打开/dev/sda4 sda4_crypt cryptsetup luks打开/dev/sdb1 sdb1_crypt
在这两个分区上创建 LVM 物理卷:
pvcreate /dev/mapper/sda4_crypt pvcreate /dev/mapper/sdb1_crypt
创建 LVM 卷组 - 我在此处的名称中包含了主机名,因为我知道如果您随后将驱动器移动到另一台机器并最终导致卷组名称冲突,这会很麻烦。我建议避免在卷组名称中使用连字符,因为 LVM 似乎有时会将它们加倍,这会让人有点困惑。
vgcreate medusahdd /dev/mapper/sda4_crypt vgcreate medusassd /dev/mapper/sdb1_crypt
创建 LVM 逻辑卷。在这里,我在 SSD 上创建了一个交换分区、一个根分区和一个 bcache 缓存分区,并在 HDD 上创建了一个 bcache 后备分区。如果您不想使用 bcache,则显然不需要 bcache 缓存分区,而这里的 bcache 后备分区将只是一个 ext4 文件系统或类似的文件系统。
lvcreate -n 交换 medusassd -L 4G lvcreate -n root medusassd -L 16G lvcreate -n 缓存 medusassd -l 100%免费 lvcreate -n 备份 medusahdd -l 100%免费
安装“bcache-tools”:
apt 安装 bcache-tools
设置 bcache,以便将缓存 LV 用作主备份 LV 支持设备的缓存设备:
make-bcache -B /dev/mapper/medusahdd-homebacking -C /dev/mapper/medusassd-cache
在新的 /dev/bcache0 上创建一个文件系统;这可能不是必需的,但是如果不这样做的话,安装程序似乎会将 /dev/bcache0 视为设备而不是分区,而我就是这么做的:
mkfs.ext4 /dev/bcache0
按 Ctrl-Alt-F1 返回图形安装程序。选择“安装”选项并正常进行,直到到达“安装类型”,您应该在此处选择“其他”。
确保“用于引导加载程序安装的设备”是硬盘驱动器 /dev/sda。(如果您尝试在我之前描述的特定旧硬件上练习硬件安装,这可能才重要。)
将 /dev/bcache0 设置为具有挂载点 /home 的 ext4 文件系统并(可能没有必要)勾选该框以便安装程序对其进行格式化。
将/dev/mapper/medusassd-root设置为挂载在“/”的ext4文件系统,并勾选格式化它。
将 /dev/mapper/medusassd-swap 设置为交换区域。
将/dev/sda3设置为挂载在“/boot”的ext4文件系统,并勾选该框进行格式化。
检查 /dev/sda1 和 /dev/sda2 是否已分别自动识别为 biosgrub 和 efi。
继续正常进行其余安装。
出现提示时重新启动。这将显示一小段图形启动画面,然后最终进入文本模式 BusyBox shell。手动解密加密分区并挂载根分区:
cryptsetup luks打开/dev/sdb1 sdb1_crypt cryptsetup luks打开/dev/sda4 sda4_crypt mkdir /mnt 挂载 /dev/mapper/medusassd-root /mnt
设置一些绑定挂载,以便稍后进行 chroot:
安装--bind /dev /mnt/dev 安装 --bind /sys /mnt/sys 安装--bind /proc /mnt/proc
挂载准备进行 chroot 的 /boot 分区:
挂载 /dev/sda3 /mnt/boot
chroot,这样我们就可以在我们的驱动器上进行安装:
chroot /mnt
编辑 /etc/fstab(例如“vi /etc/fstab”)并在 /home 行首添加“#”以将其注释掉。这可能不是必需的,但我的实验耐心有限。:-) 在我们安装 bcache-tools 之前,我们无法成功挂载 bcache 支持的 /home,并且我们希望避免系统启动失败,以便网络能够启动,我们可以安装 bcache-tools。
获取加密分区的 UUID:
ls -l /dev/disk/by-uuid | egrep '(sda4|sdb1)' > /tmp/uuid
使用这些 UUID 创建 /etc/crypttab;因为我认为这个 shell 中没有可用的复制和粘贴功能,我们可以使用 /tmp/uuid 文件来避免手动输入长 UUID,但你显然可以按照你喜欢的方式执行此操作:
六、/ etc / crypttab :r /tmp/uuid
更新 initramfs 和 grub:
更新-initramfs -u -k 全部 更新 grub
重新启动系统:
同步 exit #离开 chroot 同步 重启#对我来说似乎没有效果...... 同步 同步 halt # 机器挂起 - 手动重新启动(例如通过 VirtualBox 中的 Machine->Reset)
图形登录屏幕会提示您输入密码。输入密码。系统应启动到常规登录屏幕,您可以在其中以安装期间设置的用户身份登录。bcache 分区上的 /home 目录目前无法访问,因为系统不知道如何挂载它,但这不会造成太大影响,我们即将修复它。(我注意到的主要影响是系统认为我有一个美国键盘,尽管我在安装期间设置了它。)
打开终端并执行以下操作:
sudo bash #获取 root shell apt 安装 bcache-tools keyutils
bcache-tools 将允许系统正确挂载我们的 /home 目录,因此现在编辑 /etc/fstab 并删除我们之前添加的 /home 行开头的“#”。
编辑 /etc/crypttab 并将“luks”更改为“luks,keyscript=decrypt_keyctl”。这会告诉系统缓存我们在启动时输入的密码,并用它来解密另一个 LUKS 分区。如果你不这样做,它可能会起作用,但在启动过程中会提示你输入包含 /home 的 LUKS 分区的密码。
更新 initramfs 和 grub:
更新-initramfs -u -k 全部 更新 grub
祈祷并重新启动:
立即关机-rf
您应该会得到一个图形提示,要求输入加密密码,然后系统应该会启动到登录提示。以您在安装期间设置的用户身份登录。一切都应该没问题:
请注意,与标准的 Ubuntu 22.04 全盘加密不同,此安装在加密分区上没有设置任何恢复密码/数据。我还没有仔细研究过这个问题。
为了解决这个问题,我搜索了很多网页,绞尽脑汁。我发现的一些有用的网站包括:
- https://help.ubuntu.com/community/Full_Disk_Encryption_Howto_2019
- https://wiki.archlinux.org/title/Dm-crypt/Encrypting_an_entire_system
- https://unix.stackexchange.com/questions/392284/using-a-single-passphrase-to-unlock-multiple-encrypted-disks-at-boot
- https://www.kernel.org/doc/Documentation/bcache.txt
- 如何从 LiveCD 运行 update-grub?
这一切都有点麻烦吗?不可否认。不过,这只是一次性安装;一旦安装成功,它就应该“正常工作”。就我个人而言,这也让我更加有信心,我知道幕后发生了什么——我想开始使用全盘加密,以防被盗,但万一我不知何故被锁在自己的机器之外,这似乎总是有点可怕,经历了上述过程后,感觉更容易处理一些。当然,YMMV。:-)