Tek*_*ngu 4 installation encryption grub2 dual-boot ecryptfs
我的目标是我想要一个 Xubuntu/Ubuntu 双启动,但有一个问题 - 我希望使用 dm-crypt (本机提供)整个磁盘加密来完全加密磁盘。现在我知道,开箱即用的 ubuntu 安装程序不会让这对我来说变得简单,也许这是不可行的,因为我不确定我最终能否欺骗这些工具为每个根文件系统创建两个不同的 initrd 配置。
所以问题:
以前有人这样做过吗?我是否缺少一种简单的方法来做到这一点?
给定 (1) 是负数... 我应该为每个安装(xubuntu/ubuntu)创建单独的基本加密卷,还是应该只创建 1 个加密卷并在其中单独安装分区?我倾向于后者以使过程更简单。但是我不确定引导加载程序将如何处理这个问题。
b. 一旦我安装了第一个发行版,如果我使用 1 个加密卷,我如何解密它并安装第二个发行版(并正确更新引导加载程序、initrd 等)?
我为 Ubuntu 22.04 Jammy Jellyfish添加了一个新答案。
\n这是完整的帐户。
\n我将这些步骤分为重新启动之间的阶段:
\n预赛
\n备份您的数据
\n重新启动至 live-USB 以执行主要任务\na。预安装:在磁盘上腾出空间\nb。安装:手动分区\nc。安装后:补充initramfs
\n重新启动到主 Ubuntu 以更新 grub
\n重新启动到辅助 Ubuntu 以添加密钥文件
\n重新启动到辅助 Ubuntu 进行最后的润色
\n未来安装提醒
\n关于未加密的/boot
\n预赛
\n我在具有 BIOS 的笔记本电脑上完成了此操作(有关 UEFI 详细信息,请参阅带有加密 /boot 的 Ubuntu 全盘加密),并且已安装加密的 Ubuntu 15.10(但也可能是 14.04 LTS)。我重复了在早期的 16.04 上安装 Ubuntu 16.10 的过程,然后在早期的 16.10 上安装 18.04。但是,我必须删除用于 Bionic 安装的根 (/) 的逻辑卷的内容。每当我不删除它时,Ubiquity 或 update-initramfs 都会以各种方式失败。
\n从 Cosmic 开始,默认为 LUKS2,grub 仅支持 LUKS1。因此,您不能从安装 Cosmic 或更高版本开始,并期望能够按照此处所述的方式在同一容器中添加另一个安装。相反,您必须手动进行分区并创建 LUKS1 容器才能以.
\n我将通过标准 Ubuntu 安装在硬盘 /dev/sda 上创建的名称来引用分区和 LVM 卷:
\n$ lsblk -o NAME,TYPE,FSTYPE,MOUNTPOINT\nNAME TYPE FSTYPE MOUNTPOINT\nsda disk \n\xe2\x94\x9c\xe2\x94\x80sda1 part ext2 /boot\n\xe2\x94\x9c\xe2\x94\x80sda2 part \n\xe2\x94\x94\xe2\x94\x80sda5 part crypto_LUKS \n \xe2\x94\x94\xe2\x94\x80sda5_crypt crypt LVM2_member \n \xe2\x94\x9c\xe2\x94\x80ubuntu--vg-root lvm ext4 /\n \xe2\x94\x94\xe2\x94\x80ubuntu--vg-swap_1 lvm swap [SWAP]\n
Run Code Online (Sandbox Code Playgroud)\nLUKS 容器“sda5_crypt”占用逻辑分区上的所有空间。缩小 LUKS 容器对我来说太困难了;我不想通过尝试破坏现有的 Ubuntu 安装。因此,我决定缩小逻辑卷“根”,为新安装腾出空间。
\n因此,磁盘上唯一未加密的空间是 255M /boot 分区。可以分割这个分区,但是两个相等的一半只能容纳两个内核版本,对我来说这还不够。因此,我决定将新的 /boot 目录放置在新的 / 根目录下(不将其指向任何其他位置)。这会带来一些额外的复杂性,但也为与主 Ubuntu 一起进行多个安装留下了空间。
\n以下所有命令都要使用 sudo 权限执行,因此我从所有命令行中跳过了 sudo 部分。
\n另外,我将谈论“次要 Ubuntu”,因为我不知道您想要安装哪个 Linux。将“次要 Ubuntu”(以及任何特定于 Ubiquity 的详细信息)替换为您选择的风格。
\n除了正常备份之外,您可能还需要将基本设置(例如 /etc/crypttab)创建一个单独的副本到易于访问的位置。如果一切按计划进行,则不需要这样做,但可以帮助您保持冷静。
\n打开 LUKS 容器并激活 LVM。
\ncryptsetup luksOpen /dev/sda5 sda5_crypt\nvgscan\nvgchange -ay\n
Run Code Online (Sandbox Code Playgroud)\n缩小现有根卷。
\ne2fsck -f /dev/mapper/ubuntu--vg-root\n#resize2fs -p /dev/mapper/ubuntu--vg-root 16G\nlvreduce -L 16G --resizefs /dev/ubuntu-vg/root\n
Run Code Online (Sandbox Code Playgroud)\n添加新的根卷。尺寸由您选择;16G只是一个例子。
\nlvcreate -L 16G -n root2 ubuntu-vg\n
Run Code Online (Sandbox Code Playgroud)\n仅当您相信可以让 hibernate 与 LUKS 一起使用时,才创建新的交换。否则,让两个安装共享现有交换空间。
\nlvcreate -L 4G -n swap2 ubuntu-vg\n
Run Code Online (Sandbox Code Playgroud)\n创建新的数据卷似乎是一件显而易见的事情,但对于此处所述的安装来说,这并不是必需的。
\nlvcreate -l 100%FREE -n data ubuntu-vg\n
Run Code Online (Sandbox Code Playgroud)\n此时,新手可能希望在没有 live-USB 的情况下重新启动并登录到主 Ubuntu,只是为了看看它是否仍然有效。如果这样做,请记住在重新引导回 live-USB 时再次重新打开 LUKS 容器。
\n另外,要注意使用正确的命令来打开LUKS容器。例如,如果您单击启动器侧栏中看到的图标,容器将以错误的名称打开,这将导致 update-initramfs 稍后无法完成其工作。
\ncryptsetup luksOpen /dev/sda5 sda5_crypt\n
Run Code Online (Sandbox Code Playgroud)\n启动安装程序并选择“其他”作为安装类型。
\n继续进行其余的安装。
\n安装结束后,选择继续测试。
\n安装两个根卷。
\nmkdir /mnt/newroot && mount /dev/mapper/ubuntu--vg-root2 /mnt/newroot\nmkdir /mnt/oldroot && mount /dev/mapper/ubuntu--vg-root /mnt/oldroot\n
Run Code Online (Sandbox Code Playgroud)\n将文件 /etc/crypttab 从旧根卷复制到新根卷。
\ncp -p /mnt/oldroot/etc/crypttab /mnt/newroot/etc/\ncat /mnt/newroot/etc/crypttab\n
Run Code Online (Sandbox Code Playgroud)\n如果您复制的文件已引用密钥文件,请同时复制密钥文件和将密钥加载到 initrd.img 所需的脚本。
\ncp -p /mnt/oldroot/crypto_keyfile.bin /mnt/newroot/\ncp -p /mnt/oldroot/etc/initramfs-tools/hooks/crypto_keyfile /mnt/newroot/etc/initramfs-tools/hooks/\n
Run Code Online (Sandbox Code Playgroud)\n关键的最后一步是将更改加载到 chroot 监狱中的 initrd.img 中。
\nfor DEV in dev dev/pts sys proc; do mount --bind /$DEV /mnt/newroot/$DEV; done\n\nchroot /mnt/newroot update-initramfs -u\n\n# Note reverse order.\nfor DEV in proc sys dev/pts dev; do umount /mnt/newroot/$DEV; done\n
Run Code Online (Sandbox Code Playgroud)\n整理(不是 100% 必要,特别是如果您在创建 live-USB 时没有选择持久性)。
\numount /mnt/oldroot && rmdir /mnt/oldroot\numount /mnt/newroot && rmdir /mnt/newroot\n
Run Code Online (Sandbox Code Playgroud)\n您还可以尝试通过关闭 LUKS 容器来进行整理,但如果您必须最小化安装程序窗口,您将收到一条错误消息,指出“设备或资源繁忙”。别担心,反正关机时它也会关闭。
\ncryptsetup luksClose sda5_crypt\n
Run Code Online (Sandbox Code Playgroud)\n编辑文件 /etc/default/grub 以使加密的 /boot 包含:
\nGRUB_ENABLE_CRYPTODISK=y\nGRUB_CMDLINE_LINUX="cryptdevice=/dev/sda5:sda5_crypt"\n
Run Code Online (Sandbox Code Playgroud)\n接下来,更新grub——主要是将新安装的Ubuntu添加到菜单中,同时也用于修改设置。
\nupdate-grub\n
Run Code Online (Sandbox Code Playgroud)\n当您从 grub 菜单中选择辅助 Ubuntu 时,系统会要求您输入密码来打开 LUKS 容器。然后系统会再次要求您输入相同的密码。\n登录后,我们需要解决必须输入两次密码的问题。我们通过向 LUKS 容器添加密钥文件来实现此目的。
\n首先,我们想知道 LUKS 容器已有多少个密钥。一个 LUKS 容器最多可以有八个密钥(编号为 0..7),因此我们只想创建我们真正需要的密钥。
\ncryptsetup luksDump /dev/sda5\n
Run Code Online (Sandbox Code Playgroud)\n接下来,我们创建新的密钥文件。
\ndd bs=512 count=4 if=/dev/urandom of=/crypto_keyfile.bin\nchmod a=,u+r /crypto_keyfile.bin\n
Run Code Online (Sandbox Code Playgroud)\n然后我们将新密钥添加到容器中。该命令将作为现有密码,因此请输入您知道的密码。
\ncryptsetup luksAddKey /dev/sda5 /crypto_keyfile.bin\n
Run Code Online (Sandbox Code Playgroud)\n我们仍然需要一个 update-initramfs 运行的脚本来加载 initrd.img 的密钥。将文件放置在 /etc/initramfs-tools/hooks/ 中,并设置其保护。
\nchmod +x /etc/initramfs-tools/hooks/crypto_keyfile\n
Run Code Online (Sandbox Code Playgroud)\n该脚本只需包含一行:
\ncp /crypto_keyfile.bin "${DESTDIR}"\n
Run Code Online (Sandbox Code Playgroud)\n我们还必须添加对 /etc/crypttab 密钥的引用。修改前是这样的:
\nsda5_crypt UUID=sda5-uuid-here none luks,discard\n
Run Code Online (Sandbox Code Playgroud)\n修改后应该是这样的:
\nsda5_crypt UUID=sda5-uuid-here /crypto_keyfile.bin luks,discard,keyscript=/bin/cat\n
Run Code Online (Sandbox Code Playgroud)\n现在我们终于准备好更新 initramfs 了:
\nupdate-initramfs -u\n
Run Code Online (Sandbox Code Playgroud)\n这次,当您从 grub 菜单中选择辅助 Ubuntu 时,您只需输入 LUKS 密码一次。
\n将密钥文件复制到旧根卷进行备份。
\nmkdir /mnt/oldroot\nmount /dev/mapper/ububtu--vg-root /mnt/oldroot\ncp /crypto_file /mnt/oldroot/\n
Run Code Online (Sandbox Code Playgroud)\n还将 grub 设置复制到备份(从旧根卷到新根卷)。由于 grub 菜单由两个安装共享,因此两者的设置相同,并且可以通过任一安装来安装该菜单。因此,即使您现在希望将主 Ubuntu 保留在菜单顶部,稍后您也可能需要设置的备份副本。
\ncp /mnt/oldroot/etc/default/grub /etc/default/\numount /mnt/oldroot\nrmdir /mnt/oldroot\n
Run Code Online (Sandbox Code Playgroud)\n您可能还想修改逻辑卷(主要是根卷)的安装选项,以便两个安装不会在 GUI 中暴露彼此的私有部分。我可以给你一个 /etc/fstab 的模式,但幸运的是,Disks 做得很好,我不需要。
\n最后,您可以开始正常部署辅助 Ubuntu,并在两个安装中部署新的数据卷。
\n如果您选择拆分未加密的主分区以为新的 /boot 腾出空间,则可以删除我介绍的一些步骤:
\n