我正在运行 Arch Linux 的更新版本,其中包含库存内核版本 4.9.6 和 ZoL 版本 0.7.0,并且我想在启动时导入加密的非根池。该池是一个 raid 1 镜像。
加密容器是通过以下方式制作的:
cryptsetup -y -v luksFormat /dev/nvme0n1p3
和
cryptsetup -y -v luksFormat /dev/nvme1n1p3
我对每个密码都使用了相同的密码。
我可以通过以下方式手动打开容器并导入池:
cryptsetup open /dev/nvme0n1p3 enc0
cryptsetup open /dev/nvme1n1p3 enc1
zpool import -d /dev/mapper zeb
cryptosetup 命令提示我输入并接受我的密码。
我的 mkinitcpio 文件包含systemd
、zfs
和sd-encrypt
挂钩。它还包含模块dm_mod
、dm_crypt
和aes_x86_64
。raid1
这些有点像我在网上找到的一些零碎信息的盲目尝试。
我正在使用 systemd-boot,但似乎关键在于正确设置 mkinitcpio 配置。我的启动分区未加密。
同样,我在这里的唯一目标是在启动时自动(提示输入密码)导入我的加密 ZFS 池。我对非加密池执行此操作没有问题。
答案1
我没有 50 的声誉来发表评论,所以我会在这里发布我的问题。你的rootfs没有加密?那么当您启动时,您没有收到任何 cryptsetup 提示吗?如果您没有收到任何密码提示,我建议您解压 initramfs 并修改 init 文件,并在安装 rootfs 之后的某个位置添加以下行。 cryptsetup 打开 /dev/nvme0n1p3 enc0 && cryptsetup 打开 /dev/nvme1n1p3 enc1 && zpool 导入 -d /dev/mapper zeb
前段时间,我需要在远程服务器上使用 ZFS 添加 LUKS 加密 ROOTFS 的远程 ssh 解锁。我没有办法,只能修改 init 文件并向其中添加 dropbear,启动它,然后修改 cryptsetup 命令以接受来自 fifo 的密码。我为此制作了一个 bash 脚本,因此当我更新 initramfs 时,该 bash 脚本会解压 initramfs,放入我的更改,然后将其打包回来。但我正在使用 gentoo,它是漂亮的 genkernel。 Genkernel 包含 ZFS 和 cryptsetup 的挂钩(如果您指定的话)。我不知道在 arch linux 中是如何的,也许您还可以选择使用 genkernel/dracut 构建内核,这样您可以轻松地将 cryptsetup 和 zfs 挂钩包含在 initramfs 中(如果尚未包含)。无论如何,通过修改 init 文件很容易做到,尝试一下并在此处发布您的结果。您的 initramfs 可能使用不同的方法进行压缩,因此请了解如何在 archlinux 中解压缩它。在我这边,我修改了 genkernel 将其生成为 cpio,并使用 cpio 命令解包/打包回来。
更新:你需要编辑你的 mkinitcpio.conf 并在 HOOKS 中的“文件系统”之前添加 2 个钩子“加密 zfs”,接下来你需要定义你的 luks 设备,需要在 /etc/crypttab.initramfs 中解锁 # (google crypttab) 这个文件将包含在下一代 initramfs 中,所以现在我们至少正在解锁它们。也许 ZFS 会在下次重新启动时执行自动导入,但如果没有,请执行以下操作:
创建文件 /usr/lib/initcpio/install/zfsmount
#!/bin/bash
build() {
add_runscript
}
创建文件 /usr/lib/initcpio/hooks/zfsmount
#!/usr/bin/ash
run_hook() {
zpool import mypool
}
并在 mkinitcpio.conf 中的 HOOKS 中的“文件系统”之前或之后的某个位置添加“zfsmount”
当然,使用 mkinitcpio 重新生成 initramfs
参考文献: https://wiki.archlinux.org/index.php/Installing_Arch_Linux_on_ZFS