为了明确区分不同任务(工作、开源编程、游戏)的关注点,而无需投资多台计算机,我更喜欢在单独加密的分区上安装并行操作系统。
愿望清单、目标:
- 使用配备单个硬盘的单台机器。
- 使用UEFI和安全启动。
- 并行安装多个高度分离的 Linux 实例。
- 单独加密分区,以确保无法(轻易)访问其他实例的磁盘。
- 保留自己的软件、设置和主文件夹。
- 现在Ubuntu 18.x 桌面。
- 可能是其他分布,但这里不涉及。
- 安装一个 Windows 实例。
- 不是主要焦点。
- 现在Windows 10。
- 可选择使用其他分区或磁盘作为通用(共享)存储。
- 这里不涉及。
答案1
使用以下步骤在一台机器上设置三个独立的 Ubuntu 系统。效果很好!
想法
- 使用
refind
而不是grub
在 UEFI/安全启动期间管理系统选择。 - 不要
/boot
为每个 Linux 实例使用单独的分区。让refind
直接启动内核来自EFI 系统分区 (ESP)。 - 设置Linux 统一密钥设置(LUKS)来自 Ubuntu 安装程序。
- 请注意,当前解决方案不加密内核文件,因为不支持直接启动到加密磁盘
refind
。
概述
- 显然,事先要对任何有价值的数据进行多次备份。更改启动过程、格式化磁盘、启用加密等操作可能会很危险,需要小心谨慎。
- 首先安装 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实例
- 将 Ubuntu 获取到 USB 或 DVD 上,选择“试用 Ubuntu”来启动它。
- 打开终端进行更新并启动安装程序。
sudo apt update && sudo apt dist-upgrade -y ubiquity --no-bootloader
- 当询问安装类型(与其他操作系统共存)和磁盘格式/分区时,选择“其他”以查看磁盘和分区的列表。
- 查找类型为 的分区
efi
,即 ESP。- 在我的系统上这是
/dev/nvme0n1p11
。 - 记下分区路径名,因为下面您将需要它。
- 在继续之前请检查它是否至少有 200 MB 的可用空间,因为新的实例内核将需要它。
- 在我的系统上这是
- 选择或创建启动分区。
- 在我的系统上这是
/dev/nvme0n1p22
。 - 记下启动分区路径名,因为下面您将需要它。
- 将在后续的 Ubuntu 实例安装中重复使用。
- 创建或选择一个较小的(最大 512 MB)分区。
- 擦除/格式化为 EXT4。
- 单击“更改”并将其安装为
/boot
。
- 在我的系统上这是
- 为 Ubuntu 选择或创建一个根分区。
- 在我的系统上这是
/dev/nvme0n1p33
。 - 记下根分区路径名,因为下面您将需要它。
- 它将被抹去。
- 最低安装需要 5 GB,完整安装需要 25+ GB。
- 单击“更改”,使其成为“用于加密的物理卷”。
- 选择与其他实例不同的密码。
- 在我的系统上这是
- 查找以 结尾的新的、解锁的分区
_crypt
。- 在我的系统上这是
/dev/mapper/nvme0n1p33_crypt
。 - 将挂载点更改为 root
/
。
- 在我的系统上这是
- 让安装程序完成,但不要在最后选择“继续测试”来重新启动。
refind
为新实例进行设置。
进入
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
- 编辑
/etc/fstab
并注释掉 行/boot
。其他条目均正确。 - 可选:进行其他低级系统文件更改,例如针对损坏的驱动程序的解决方法1。
- 创建 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/
- 查找
/dev/nvme0n1p33
此实例的加密物理卷。记下(或复制到剪贴板)UUID(但不是 PARTUUID)。sudo blkid
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"
- 退出
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
到 ESPubuntu-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,但这样做可能同样有效。
灵感
谢谢你!
- @Aleksandr Dubinsky 的回答到“Ubuntu 全盘加密并加密 /boot”。
- @StefK 的回答到“安装 Ubuntu 12.04 而不安装 Grub”。
- @Rod Smith 的回答至“如何使用 UEFI 在单个硬盘上安装两个独立的 Ubuntu 安装?”
- 更多答案、文章、文档由罗德里克·W·史密斯,他是 的作者
refind
。 - Ubuntu 的安装文档适合桌面使用。
1这Wayland 和 Nvidia 显卡驱动问题抓住了我。它会导致磁盘解锁后出现黑屏。幸运的是,它很容易修复,Wayland 可以恢复一次已安装更新的 Nvidia 驱动程序——只需记住将更新的内核+initrd 复制到您的 ESP。