我正在尝试设置一个带有单独/boot
分区的完整加密磁盘,但遇到了一些麻烦。
我将写下我在 Ubuntu 15.04 Live DVD 会话中遵循的程序。
用“随机数据”填充磁盘
sudo dd if=/dev/urandom of=/dev/sda1 bs=4096 #ok
创建分区(使用 gparted)
- 创建分区表 - gpt 2。
- /dev/sda1 ext2 1.5GB #启动
- /dev/sda2 linux-swap 4GB #交换
- /dev/sda3 ext4 15 GB #根目录
- /dev/sda4 ext4 免费空间 #home
- 创建分区表 - gpt 2。
加密卷
cryptsetup luksFormat --cipher twofish-xts-plain64 --key-size 512 --hash sha512 --iter-time 3000 /dev/sda1 cryptsetup luksFormat --cipher twofish-xts-plain64 --key-size 512 --hash sha512 --iter-time 3000 /dev/sda2 cryptsetup luksFormat --cipher twofish-xts-plain64 --key-size 512 --hash sha512 --iter-time 3000 /dev/sda3 cryptsetup luksFormat --cipher twofish-xts-plain64 --key-size 512 --hash sha512 --iter-time 5000 /dev/sda4
打开加密卷
cryptsetup luksOpen /dev/sda1 boot cryptsetup luksOpen /dev/sda2 swap cryptsetup luksOpen /dev/sda3 root cryptsetup luksOpen /dev/sda4 home
格式
mkfs.ext2 /dev/mapper/boot mkswap /dev/mapper/swap mkfs.ext4 /dev/mapper/root mkfs.ext2 /dev/mapper/home
安装(使用 Ubiquity)
- /dev/sda 上的引导加载程序
- /dev/sda1 - 用作 ext2 - 挂载点 /boot
- /dev/sda2 - 用作 ext2 - 挂载点 /boot
- /dev/sda3 - 用作 ext2 - 挂载点 /boot
- /dev/sda4 - 用作 ext2 - 挂载点 /boot
最后,安装程序警告 grub-install 失败(因为启动卷已加密),因此选择“继续不使用引导加载程序”。
清理启动卷
mkfs.ext2 /dev/mapper/boot
装载卷
mkdir /mnt/root mount /dev/mapper/root /mnt/root mount /dev/mapper/boot /mnt/root/boot
更新 fstab 和 crypttab
sudo blkid [/dev/sr0: UUID="2015-10-21-16-17-40-00" LABEL="Ubuntu 15.10 amd64" TYPE="iso9660" PTUUID="429817b4" PTTYPE="dos" /dev/sda1: UUID="...#1" TYPE="crypto_LUKS" PARTUUID="..." /dev/sda2: UUID="...#2" TYPE="crypto_LUKS" PARTUUID="..." /dev/sda3: UUID="...#3" TYPE="crypto_LUKS" PARTUUID="..." /dev/sda4: UUID="...#4" TYPE="crypto_LUKS" PARTUUID="..." /dev/mapper/boot: UUID="..." TYPE="ext2" /dev/mapper/swap: UUID="..." TYPE="swap" /dev/mapper/root: UUID="..." TYPE="ext4" /dev/mapper/home: UUID="..." TYPE="ext4"]
文件系统
#<file system> <mount point> <type> <options> <dump> <pass> UUID=#1 /boot ext2 defaults 0 2 UUID=#2 none swap sw 0 0 UUID=#3 / ext4 errors=remount-ro 0 1 UUID=#4 /home ext4 defaults 0 2
加密表
boot UUID=#1 luks,cipher=twofish-xts-plain64,size=512, hash=whirlpool, time=3000 swap UUID=#2 luks,swap,cipher=twofish-xts-plain64,size=512, hash=whirlpool,time=3000 root UUID=#3 luks,cipher=twofish-xts-plain64,size=512, hash=whirlpool,time=3000 home UUID=#4 luks,cipher=twofish-xts-plain64,size=512, hash=whirlpool,time=5000
更新 initramfs 映像
cd /mnt sudo chroot root mount -t proc proc /proc mount -t sysfs sys /sys mount -t devpts devpts /dev/pts update-initramfs -u #ok
配置引导加载程序(
/etc/default/grub
)GRUB_ENABLE_CRYPTODISK=y GRUB_PRELOAD_MODULES="luks cryptodisk" GRUB_CMDLINE_LINUX="cryptdevice=UUID#3:root root=/dev/mapper/root resume=/dev/mapper/swap crypto=whirlpool:twofish-xts-plain64:512:0:"
创建配置文件
$ grub-mkconfig -o /boot/grub/grub.cfg [/usr/sbin/grub-probe: error: failed to get canonical path of `/dev/mapper/root'.]
尝试外面
$ exit $ grub-mkconfig -o /boot/grub/grub.cfg [/usr/sbin/grub-probe: error: failed to get canonical path of `/cow'.]
在此之前我犯了什么错误吗?我该如何继续正确配置和安装 grub?
答案1
您犯了一些错误,但主要问题在于 ubiquity 和 grub。基本上,当您设置/
为加密分区并且不为其创建单独的分区时/boot
,grub 会给出如下错误消息:
我知道
/boot
是加密的。您需要设置GRUB_ENABLE_CRYPTODISK=y
。/etc/default/grub
我不会为您设置,所以我会失败,您的安装将停止。
流程概述
- 我们使用EFI模式。
- 我们使用标准安装程序安装到未加密
/boot
分区和加密的 btrfs 。/
- 安装程序完成后,我们
chroot
进行一些重要的配置更改,并将 grub 重新安装到 EFI 系统分区并重新创建 initrd。
详细步骤
- 从 Ubuntu 16.04 安装盘启动(已使用 Xubuntu 测试)。
- 连接到互联网并运行
sudo apt update && sudo apt upgrade
以更新安装程序组件 - 使用
fdisk
、gparted
或其他工具创建 3 个分区:- GPT 分区表
- 一个 200MB 的分区,我们将使用它作为 EFI 系统分区
- 一个多 GB 的分区,我们最终将使用它作为我们的加密交换分区,但它将作为我们的临时未加密
/boot
- 使用剩余空间的加密分区
准备加密分区
sudo cryptsetup luksFormat /dev/sda3 sudo cryptsetup luksOpen --allow-discards /dev/sda3 sda3_crypt sudo mkfs.btrfs /dev/mapper/sda3_crypt
安装 Ubuntu
- 当询问安装类型时,选择“其他”。
- 配置
/dev/sda1
为EFI System Partition
- 配置
/dev/sda2
为 ext2,格式化,挂载点为/boot
- 配置
/dev/mapper/sda3_crypt
为 btrfs,挂载点为/
- 继续安装。
- 完成后,选择留在实时系统(无需重启)。
复制内容
/boot
并执行chroot
sudo mount -o subvol=@ /dev/mapper/sda3_crypt /target sudo mount /dev/sda2 /mnt # (Watch those trailing slashes! rsync is very sensitive to them.) sudo rsync -aXAH /mnt/ /target/boot/ sudo mount /dev/sda1 /target/boot/efi sudo mount --bind /dev /target/dev sudo mount --bind /proc /target/proc sudo mount --bind /sys /target/sys sudo chroot /target
(现在一切都像
chroot
在您的新系统内部发生一样。)添加行到
/etc/default/grub
GRUB_ENABLE_CRYPTODISK=y
将行添加到
/etc/crypttab
。您需要先运行以找到(NOT )sudo blkid
的 UUID 。/dev/sda3
/dev/mapper/sda3_crypt
sda3_crypt UUID=<UUID of /dev/sda3> none luks,discard
编辑
/etc/fstab
并删除 行/boot
。其他条目均正确。将 grub 安装到 EFI 系统分区,生成新的 grub.cfg,并准备 initrd。
sudo grub-install --target=x86_64-efi --efi-directory /boot/efi --bootloader=ubuntu --boot-directory=/boot/efi/EFI/ubuntu --recheck sudo grub-mkconfig -o /boot/efi/EFI/ubuntu/grub/grub.cfg sudo update-initramfs -c -k all
可选的复查:仔细检查
/boot/efi/EFI/ubuntu/grub/grub.cfg
包含的行是否包括insmod luks
、、cryptomount -u <UUID>
正确的启动项等。并仔细检查您的 initrd 是否包含cryptsetup
二进制文件。如果缺少这些内容,那是因为 grub-mkconfig 和/或 update-initrd 无法确定您在 fstab 中安装或指定的卷与 crypttab 中的加密卷有何关系。(它们执行了许多神奇的自动配置。)如果您偏离本指南,例如使用 ZFS 或尝试对 sda3_crypt 进行分区,则可能会发生这种情况。(如果使用 ZFS 而不是 btrfs)grub-mkconfig 和 update-initrd 无法识别 ZFS。解决方法包括(在 chroot 期间,在 grub-mkconfig/update-initrd 之前)编辑
/usr/sbin/grub-mkconfig
以添加|| true
到第 139 行(以 开头GRUB_DEVICE=
)、添加到GRUB_DEVICE="/dev/mapper/sda3_crypt"
、/etc/default/grub
创建/usr/share/initramfs-tools/conf-hooks.d/forcecryptsetup
包含内容的文件和包含内容的export CRYPTSETUP=y
文件。所有这些都是您在未加密 ZFS 分区时要采取的步骤的补充(例如在实时系统和 chroot 期间安装 zfs 用户空间实用程序并删除fstab 中安装的行)。/etc/initramfs-tools/conf.d/cryptroot
target=sda3_crypt,source=UUID=<UUID of sda3>,key=none,discard
/
退出 chroot 并重新启动进入新系统
exit sudo umount /target/boot/efi sudo umount /target/dev sudo umount /target/proc sudo umount /target/sys sudo umount /target sudo reboot
您应该会看到 grub 要求您输入密码。然后您将看到启动菜单。选择 Ubuntu 后,系统会再次要求您输入密码。然后您将进入系统。阅读更多关于Ubuntu 如何使用 BTRFS。
去做:创建加密交换(提示:它涉及编辑 crypttab、fstab,然后重新运行
update-initrd
)。- 去做:保存您的密码,因此您只需将其输入一次即可。这是详细的这里。
升级
- 每次安装新内核时,都应该运行自定义
grub-mkconfig
命令。 - 每次更新 grub 时,都应该运行自定义
grub-install
命令。
其他说明
- 创建一个加密卷并对其进行分区以创建交换分区(可能还有其他分区)是很有诱惑力的,但这并不奏效。 grub-mkconfig 和 update-initrd 都会出现问题。不过,我还没有尝试过 LVM。
- 使用在 btrfs 之上进行交换文件,但从性能角度来看,这可能是一个坏主意。