加密定制安装

我的电脑运行的是Ubuntu操作系统。我想在另一个介质上安装Ubuntu。我希望启用加密功能,但是由于Ubuntu安装程序的默认选项(擦除/并排等)只涉及默认驱动器,所以我必须选择"其他选项"并手动在另一个驱动器上创建分区。我创建了一个大约128MB的引导分区,然后就迷失了方向。如果我用剩余的空间创建一个加密分区,我无法将其拆分,因此就没有交换分区;如果我创建两个加密分区,似乎不太对,因为它要求设置两个不同的密码...
那么,我应该如何设置交换分区呢?(在安装过程中还是之后)。

请参阅https://askubuntu.com/questions/293028/how-can-i-install-ubuntu-encrypted-with-luks-with-dual-boot。 - Flimm
4个回答

更新 2020-07-16: 这可能不适用于已经远离Ubiquity安装程序的Ubuntu版本(例如Lubuntu,现在使用Calamares),因为其中一些安装程序甚至会停用它们在预安装过程中没有配置的LVM分区,从而使得为系统安装配置的分区不可用。

如何使用LVM和单个加密分区完成此操作

警告

首先,128M对于引导来说太小了!我使用1G。否则,可能会发生这样的情况,您可能会忘记删除旧内核,/boot将被填满,然后您将不得不处理尝试从系统中删除旧内核的痛苦,以便您可以再次使用aptapt-get。即使有1G,请确保定期删除旧内核。

下面的步骤不适合新手用户。
更新:我已经创建了一个脚本,可以为您执行以下操作以及更多!您只需在安装之前从Live OS运行它即可。您可以在我的博客上找到相关介绍。

从实时操作系统进行预安装

您想在手动分区时设置LUKS和LVM!我在Ubuntu 16.04.2 / 18.04 / 20.04上进行了测试。

从实时操作系统启动Ubuntu,并选择“尝试Ubuntu而不安装”的选项。按照我下面概述的步骤进行操作。假设您要安装到/dev/sdb。

使用您选择的工具对驱动器进行分区:我使用fdisk在msdos分区表上设置了我的分区,如下所示:
  • 其他分区:现有的操作系统 - 我们不关心这些
  • sdb1:/boot(1G)
  • sdb2:LUKS分区(剩余的磁盘空间)
设置LUKS
  • sudo cryptsetup luksFormat --hash=sha512 --key-size=512 --cipher=aes-xts-plain64 --verify-passphrase /dev/sdb2
  • sudo cryptsetup luksOpen /dev/sdb2 CryptDisk
  • 虽然不是必需的,但最好用零填充您的LUKS分区,以便在加密状态下,分区中填充随机数据。sudo dd if=/dev/zero of=/dev/mapper/CryptDisk bs=4M 注意,这可能需要很长时间!
在/dev/mapper/CryptDisk上设置LVM
  • sudo pvcreate /dev/mapper/CryptDisk
  • sudo vgcreate vg0 /dev/mapper/CryptDisk
  • sudo lvcreate -n swap -L 2G vg0
  • sudo lvcreate -n root -L 10G vg0
  • sudo lvcreate -n home -l +100%FREE vg0

从现有操作系统安装

  1. 现在您已经准备好进行安装了。当您到达安装的“安装类型”部分时,请选择“其他选项”。然后手动分配/dev/mapper/vg0-*分区,按照您希望进行配置的方式进行分配。不要忘记将/dev/sdb1设置为/boot。/boot分区不能加密。如果加密了,我们将无法启动。将“引导加载程序安装设备”更改为/dev/sdb,并继续安装。
  2. 安装完成后,不要重新启动!选择“继续测试”选项。

安装后从实时操作系统进行配置

如果您希望系统能够启动,这一步非常重要!我花了很多时间研究这个问题,以找出这些安装后的步骤。在我的情况下,我实际上是因为想要自定义 /dev/sda 上 /boot 的大小,但所有这些工作也适用于您的情况。

在终端中,输入以下命令并查找/dev/sdb2的UUID。记下该UUID以备后用。
sudo blkid | grep LUKS
我的机器上重要的一行是 /dev/sdb2: UUID="bd3b598d-88fc-476e-92bb-e4363c98f81d" TYPE="crypto_LUKS" PARTUUID="50d86889-02"
接下来,让我们重新挂载新安装的系统,以便进行更多的更改。
sudo mount /dev/vg0/root /mnt sudo mount /dev/vg0/home /mnt/home # 这可能不是必需的 sudo mount /dev/sdb1 /mnt/boot sudo mount --bind /dev /mnt/dev # 我不确定这是否是必需的 sudo mount --bind /run/lvm /mnt/run/lvm (仅适用于使用EFI的情况):sudo mount /dev/sd*/your/efi/partition /mnt/boot/efi
现在运行 sudo chroot /mnt 以访问已安装的系统
从chroot中,再挂载一些东西
mount -t proc proc /proc mount -t sysfs sys /sys mount -t devpts devpts /dev/pts
设置crypttab。使用您喜欢的文本编辑器创建文件/etc/crypttab,并添加以下行,将UUID更换为您磁盘的UUID。
  • CryptDisk UUID=bd3b598d-88fc-476e-92bb-e4363c98f81d none luks,discard
  1. 最后,重新构建一些引导文件。
  • update-initramfs -k all -c - update-grub
  1. 重新启动,系统应该要求输入密码以解密启动!

特别感谢Martin EveEGIDIO DOCILEblog.botux.fr的教程。通过参考他们的帖子并进行一些额外的故障排除,我终于能够弄清楚这个问题。

我尝试了很多次,一次又一次地失败了。根据错误信息,我不得不自己解决的部分是sudo mount --bind /run/lvm /mnt/run/lvm

非常感谢,但我在开始设置luks分区时遇到了困难。在fdisk -L输出中找不到它。 - Yvain
当我尝试设置加密时,出现错误:无法删除标头。 - Yvain
我看到你把这个标记为解决方案了。你成功了吗?如果没有,你用什么工具来创建分区?你必须先使用像Gparted或fdisk这样的工具对磁盘进行分区,创建一个用于/boot的分区和一个用于加密的分区(EFI需要第三个非加密分区)。在我的设置中,我没有使用EFI。只有在创建了加密分区之后,你才能真正运行cryptsetup luksFormat命令对其进行加密。在创建了/dev/sdb2之后,你可以选择格式化它为文件系统或者不格式化。cryptsetup会擦除任何现有的文件系统。 - b_laoshi
你能把sudo fdisk -l /dev/sdb的输出添加到你的问题中吗? - b_laoshi
没问题,你的命令都能正常运行,唯一不正确的是 luks 分区的哈希类型应该是 sha1。另外,我无法挂载 lvm 目录 /var/lvm,因为它不存在,但我已经跳过了,一切还是正常工作的。非常感谢! - Yvain
1@Yvain - 我相信这是错误的。Sha1已不再被视为安全。应该使用更安全的选项(比如建议的sha512)来确保安全性。 - some bits flipped
我不是在说安全问题,我在创建和打开分区时经常遇到错误。在cryptsetup手册中,我看到luks格式应该使用sha1算法,我按照这样做了,它起作用了。希望这仍然是一件好事.. - Yvain
@Yvain,Mike说得对。Sha1已经被破解了,如果可能的话应该避免使用它。我不确定为什么你在尝试使用sha512时会出现错误。也许值得发布一个新问题,详细说明你的设置、运行的确切命令和收到的错误消息,看看是否有人可以帮助你让sha512正常工作。 - b_laoshi
@Yvain,如果你不需要挂载lvm目录,那就没关系。对于阅读这些评论的任何人来说,目录应该是/run/lvm,而不是/var/lvm。我怀疑这可能是为什么Yvain收到错误消息说目录不存在的原因。 - b_laoshi
我已经损坏了我的安装,所以重新设置了cryptsetup和sha512,它们按照您的预期工作,sha1只在帮助文档中被提及为luks的默认哈希算法。 - Yvain
我在安装后无法在其他操作系统(主驱动器上)重新启动时设置操作系统。我尝试了很多你指定的命令组合,只是为了测试哪些可以跳过,但没有任何效果(与使用LiveCD重新启动以完成安装相比,那个方法有效)。我认为这是因为在创建crypttab文件时,我还没有挂载sysfs。顺便说一下,如果我理解正确,在chroot之后,我们要挂载的文件夹只是它们自己,但你给它们指定了类型,以便系统能够理解?谢谢。 - Yvain
是的,chroot需要知道类型。 - b_laoshi
1+1 @b_laoshi 非常感谢你的回答,对我帮助很大 :) - Tummala Dhanvi
谢谢这个很棒的脚本。有一个问题在脚本中没有解决:设置LUKS分区。该命令总是失败并显示“Failed to initialize device signature probes”,我在网络上找不到任何有用的关于此错误的信息。 然而,在单独的 shell 中手动执行构建的命令却有效。所以我在这里添加了另一个“按回车键”的步骤,然后一切都正常工作了。最后一个小建议:在脚本开头添加set -e如何? - Jonas
当我尝试编辑/etc/crypttab时,它显示"sudo: unable to resolve host lubuntu: Connection refused",但是编辑还是成功了。这对我意味着什么? - Nickolai Leschov
@NickolaiLeschov,这与本帖子没有真正的关系,但我认为我仍然可以帮助你。你描述的问题通常是在你更改了/etc/hostname文件中的系统名称,但未能在/etc/hosts文件中更新它时出现的。 - b_laoshi
2@b老师,工作得很棒,不过需要执行sudo mount --bind /dev /mnt/dev,否则update-initramfs -k all -c会失败。 - Nathan
@Nathan,这很奇怪。脚本在运行时会检查是否为root用户,并在非root用户下使用sudo重新运行自身。你应该需要在任何命令前添加sudo。 - b_laoshi
你救了我的一天。我冒昧地在“update-initramfs”部分添加了一个警告。花了我一些时间才弄明白。 - phipsgabler
太棒了,非常感谢这个指南。我刚刚在一台装有Windows 10的Dell XPS 13上使用20.04版本运行了一遍。我使用了Ubuntu安装程序的图形界面来进行分区管理,而不是使用fdisk或类似的工具,这也意味着跳过了第2步,并且在第3步中不需要执行pvcreate命令。一切都进行得很顺利! - bernhof
安装程序完成后,我不得不重新运行sudo cryptsetup luksOpen /dev/sdb2 CryptDisk来开始后续的挂载操作。 - Zach
感谢提供脚本!这样的功能应该随安装媒体一起提供。 - Joe D
有没有办法在不需要额外的/boot分区的情况下完成这个操作,因为已经有了一个efi分区? - My1

这是给那些一直遇到这个问题想要稍微改变Ubuntu默认分区的答案。例如,删除swap分区并增加/boot大小。我认为很多人会因为所需步骤的数量而被b_laoshi的指导所打消了信心。
所以,对于简单的自定义分区加密,请使用"擦除磁盘并安装Ubuntu"选项,同时选择"为安全性加密新的Ubuntu安装"。我们将修改的是这个默认分区的配置。
这些配置文件位于/lib/partman/recipes[-arch]/目录下。对于我自己来说,我一直在修改/lib/partman/recipes-amd64-efi/30atomic文件。为了获得538M的efi分区、1024M的/boot分区和剩余空间的/ext4根分区,我编辑了该文件。
538 538 538 fat32
    $iflabel{ gpt }
    $reusemethod{ }
    method{ efi }
    format{ } .

1024 1024 1024 ext4
    $defaultignore{ }
    $lvmignore{ }
    method{ format }
    format{ }
    use_filesystem{ }
    filesystem{ ext4 }
    mountpoint{ /boot } .    

900 10000 -1 ext4
    $lvmok{ }
    method{ format }
    format{ }
    use_filesystem{ }
    filesystem{ ext4 }
    mountpoint{ / } .

请注意,在安装程序中选择要擦除的磁盘后,它会提示您分区的摘要,这样您就可以检查这个方法是否奏效,并且您得到了所需的分区。还请参阅https://askubuntu.com/a/678074/47073

如果我能的话,我会给你十个赞。 - netiul

如何实现多个加密分区和 LVM

由于我的先前答案太长了,如果您不想使用LVM,我将发布第二个答案,采用不同的方法。

您可以创建多个加密分区并使用decrypt_derived脚本,这样您只需要输入一次密码。请查看this blog post以获得逐步说明。作者使用一个密钥文件,但decrypt_derived LUKS脚本也足够了。


我最后还是拔掉了主驱动器,辅助安装可以在我的SD卡上找到:) 哈哈 - Yvain