如何运行具有单独分区加密和 UEFI/安全启动的多个 Ubuntu 18.x?

如何运行具有单独分区加密和 UEFI/安全启动的多个 Ubuntu 18.x?

为了明确区分不同任务(工作、开源编程、游戏)的关注点,而无需投资多台计算机,我更喜欢在单独加密的分区上安装并行操作系统。

愿望清单、目标:

  • 使用配备单个硬盘的单台机器。
  • 使用UEFI安全启动
  • 并行安装多个高度分离的 Linux 实例。
    • 单独加密分区,以确保无法(轻易)访问其他实例的磁盘。
    • 保留自己的软件、设置和主文件夹。
    • 现在Ubuntu 18.x 桌面
    • 可能是其他分布,但这里不涉及。
  • 安装一个 Windows 实例。
  • 可选择使用其他分区或磁盘作为通用(共享)存储。
    • 这里不涉及。

答案1

使用以下步骤在一台机器上设置三个独立的 Ubuntu 系统。效果很好!

想法

概述

  • 显然,事先要对任何有价值的数据进行多次备份。更改启动过程、格式化磁盘、启用加密等操作可能会很危险,需要小心谨慎。
  • 首先安装 Windows。
    • 这似乎是一个普遍的建议,但对于 UEFI 来说应该没那么重要。
    • 它将准备 GPT 和 ESP,也可以使用以下命令手动完成GNOME 分区编辑器来自 Ubuntu USB/DVD。
    • 根据 Ubuntu 实例的数量和内核大小,Windows 安装程序创建的 ESP 可能不够大。512 MB 似乎足以容纳 2 个 Ubuntu 实例,但 1 GB 更安全并允许更多实例。
  • 安装refind并确保它通过安全启动启动。
  • 对于每个所需的 Ubuntu 系统实例:
    • 从 USB 或 DVD 运行默认的 Ubuntu 安装程序。
    • 选择“其他”选项来手动设置加密并选择分区。
    • 安装后不要重新启动,而是留下来设置refind启动过程。
  • 随着时间的推移,如果有内核或驱动程序更新,则执行维护任务。

按实例安装

假设GUID 分区表 (GPT)并且 ESP 已由 Windows 安装程序设置,并且有用于 Ubuntu 实例的附加分区或空磁盘空间。

分区路径和名称

为了保持一致性,我将在下面使用此分区路径命名。路径在您的系统上会有所不同,并且会因实例而异,因此请记下笔记。

  • /dev/nvme0n1p11是你的 ESP。
  • /dev/nvme0n1p22是您的临时/boot分区。
  • /dev/nvme0n1p33是每个实例的“用于加密的物理卷”(锁定)根/分区。
  • /dev/mapper/nvme0n1p33_crypt是您的(已解锁的)根/分区。

分区并安装新的(附加的)Ubuntu实例

  1. 将 Ubuntu 获取到 USB 或 DVD 上,选择“试用 Ubuntu”来启动它。
  2. 打开终端进行更新并启动安装程序。
    sudo apt update && sudo apt dist-upgrade -y
    ubiquity --no-bootloader
    
  3. 当询问安装类型(与其他操作系统共存)和磁盘格式/分区时,选择“其他”以查看磁盘和分区的列表。
  4. 查找类型为 的分区efi,即 ESP。
    • 在我的系统上这是/dev/nvme0n1p11
    • 记下分区路径名,因为下面您将需要它。
    • 在继续之前请检查它是否至少有 200 MB 的可用空间,因为新的实例内核将需要它。
  5. 选择或创建启动分区。
    • 在我的系统上这是/dev/nvme0n1p22
    • 记下启动分区路径名,因为下面您将需要它。
    • 将在后续的 Ubuntu 实例安装中重复使用。
    • 创建或选择一个较小的(最大 512 MB)分区。
    • 擦除/格式化为 EXT4。
    • 单击“更改”并将其安装为/boot
  6. 为 Ubuntu 选择或创建一个根分区。
    • 在我的系统上这是/dev/nvme0n1p33
    • 记下根分区路径名,因为下面您将需要它。
    • 它将被抹去。
    • 最低安装需要 5 GB,完整安装需要 25+ GB。
    • 单击“更改”,使其成为“用于加密的物理卷”。
    • 选择与其他实例不同的密码。
  7. 查找以 结尾的新的、解锁的分区_crypt
    • 在我的系统上这是/dev/mapper/nvme0n1p33_crypt
    • 将挂载点更改为 root /
  8. 让安装程序完成,但不要在最后选择“继续测试”来重新启动。

refind为新实例进行设置。

  1. 进入chroot新的操作系统进行更多的改变。

    # NOTE: create temporary mount directories.
    sudo mkdir /mnt/bootpartition /mnt/ospartition
    
    # NOTE: Mount the newly created encrypted partition.
    sudo mount -o subvol=@ /dev/mapper/nvme0n1p33_crypt /mnt/ospartition
    sudo mount /dev/nvme0n1p22 /mnt/bootpartition
    
    # NOTE: Copy the boot files into the encrypted partition.
    # NOTE: Watch those trailing slashes! rsync is very sensitive to them.
    sudo rsync -aXAH /mnt/bootpartition/ /mnt/ospartition/boot/
    
    sudo mount /dev/nvme0n1p11 /mnt/ospartition/boot/efi
    sudo mount --bind /dev /mnt/ospartition/dev
    sudo mount --bind /proc /mnt/ospartition/proc
    sudo mount --bind /sys /mnt/ospartition/sys
    
    # NOTE: change root to the newly installed Ubuntu.
    sudo chroot /mnt/ospartition
    
  2. 编辑/etc/fstab并注释掉 行/boot。其他条目均正确。
  3. 可选:进行其他低级系统文件更改,例如针对损坏的驱动程序的解决方法1
  4. 创建 EFI 可引导副本核心 (vmlinuz初始 ramdisk ( initrd)替换refind。记得用我们自己的内容替换ubuntu-instance。我使用“ubuntu-work”和类似的内容。不要只使用“ubuntu”,因为它可能会被 Ubuntu 安装程序覆盖。
    # NOTE: Choose your own per-instance directory name.
    sudo mkdir /boot/efi/EFI/ubuntu-instance/
    sudo cp /boot/vmlinuz* /boot/initrd* /boot/efi/EFI/ubuntu-instance/
    
  5. 查找/dev/nvme0n1p33此实例的加密物理卷。记下(或复制到剪贴板)UUID(但不是 PARTUUID)。
    sudo blkid
    
  6. refind为 中的加密分区准备的 Ubuntu 实例内核启动选项。从以下模板 refind_linux.conf创建,但使用您的路径和 UUID。/boot/efi/EFI/ubuntu-instance/refind_linux.conf
    "Boot with standard options"  "root=/dev/mapper/nvme0n1p33_crypt cryptdevice=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:nvme0n1p33_crypt ro quiet splash"
    "Boot to single-user mode"    "root=/dev/mapper/nvme0n1p33_crypt cryptdevice=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:nvme0n1p33_crypt ro single"
    "Boot with minimal options"   "root=/dev/mapper/nvme0n1p33_crypt cryptdevice=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:nvme0n1p33_crypt ro"
    
  7. 退出chroot并重启。记得在 中选择新内核refind
    exit
    sudo reboot
    

清理

可选。这将删除 中未使用的启动选项refind。我喜欢将它们保留为备份,直到系统稳定为止。

  • 删除任何剩余的共享 Ubuntu Grub 引导加载程序。
    # NOTE: The shared Ubuntu Grub EFI loader might be leftover from previous installations.
    #sudo rm -r /boot/efi/EFI/ubuntu/
    
  • 从未使用的启动分区中删除文件。
    # NOTE: Optionally clean up files from the Ubuntu installer.
    #sudo mkdir /mnt/bootpartition
    #sudo mount /dev/nvme0n1p22 /mnt/bootpartition
    #sudo rm -r /mnt/bootpartition/*
    

内核或驱动程序更新后的维护

由于 Ubuntu 不知道refind,内核+驱动程序更新需要手动复制 vmlinuz+initrd 的步骤。

  • 安装更新后,但在重新启动之前,将新的 vmlinuz + initrd 从加密复制/boot到未加密的 ESP,ubuntu-instance如上所述。
  • 如果您忘记执行此操作,并且系统崩溃或新驱动程序未加载,请启动:
    • refind通过选择自定义启动选项进入单用户模式。
    • Ubuntu 安装程序 USB/DVD,并安装到临时位置:
      • 包含 的加密磁盘/boot
      • ESP。
    • 像上面一样将 vmlinuz+initrd 从您的复制/boot到 ESP ubuntu-instance

未来的改进

  • 如果/当有EFI 文件系统驱动程序因此refind可以读取加密的 LUKS 分区,调查不要将内核保存在未加密的 ESP 上。这可能会大大简化上述设置。
  • 运行ubiquity --no-bootloader会跳过安装shim-signed,因此第三方 DKMS 模块/驱动程序(nvidia 等)需要手动签名才能安全启动。这可以使用kmodsign/lib/modules/x.y.z/updates/dkms/*.ko每次内核/驱动程序更新后。更顺畅的替代方案是安装shim-signed(包括 的部分grub),它会自动签名。也许还有一种不那么肮脏的替代方案?
  • 确定内核+驱动程序更新是否可以自动触发更新每个实例 ESP vmlinuz+initrd 副本refind
  • 使用以下方式之一改善临时启动分区的使用:
    • 在每个 Linux 实例中将临时启动分区配置为加密交换空间。
    • 将 ESP 重新用于临时/boot文件。不想因为意外格式化或类似情况而破坏 ESP,但这样做可能同样有效。

灵感

谢谢你!


1Wayland 和 Nvidia 显卡驱动问题抓住了我。它会导致磁盘解锁后出现黑屏。幸运的是,它很容易修复,Wayland 可以恢复一次已安装更新的 Nvidia 驱动程序——只需记住将更新的内核+initrd 复制到您的 ESP。

相关内容