Linux 上的 zfs:如果您不知道密钥必须安装在哪里,如何导入加密池?

Linux 上的 zfs:如果您不知道密钥必须安装在哪里,如何导入加密池?

我使用的是 zfs 的 livecd。我想导入一个加密池,其中有一个密钥文件作为“密码”

首先我用密钥文件安装 USB 加密狗

mkdir /tmpusb
mount /dev/disk/by-uuid/uuidofdongle... /tmpusb

然后我导入池

zpool import -l -d /dev/disk/by-partlabel/ROOTPOOL1 -d /dev/disk/by-partlabel/ROOTPOOL2 -o altroot=/mnt rpool
1 / 1 keys successfully loaded

一切正常!问题是什么?

如果我忘记了安装加密狗的正确目录?

zfs 给了我正确的答案,但泳池必须先打开!

zfs get all rpool|grep -i kyloc
rpool  keylocation           file:///tmpusb/cifry  local

问题是:有没有办法让这个房产在游泳池关闭的情况下?

答案1

我已经使用 ZFS 十多年了,但从未使用过 ZFS 加密,因此虽然我总体上对 ZFS 了解很多,但我当然不是 ZFS 加密方面的专家。

AFAIK,如果不导入池,您就无法获取数据集的关键位置属性(因为它是数据集的属性,而不是池 - 可能有一种方法可以使用 ZFSzdb调试实用程序来完成此操作,但如果有的话,我不知道)。

但是,您可以在导入池之后、挂载数据集之前覆盖该属性,并手动告知zfs密钥文件的位置。

通过阅读文档,我很确定这就是-L选项的zfs load-key用途。从man zfs-load-key

zfs load-key [-nr] [-L keylocation] -a|filesystem

加载文件系统的密钥,允许访问它以及继承 keylocation 属性的所有子项。

密钥应采用 keyformat 指定的格式和 keylocation 属性指定的位置。请注意,如果将按键位置设置为提示,终端将交互等待输入按键。

加载密钥不会自动挂载数据集。如果需要该功能,zfs mount -l将询问密钥并安装数据集(请参阅 zfs-mount(8))。

加载密钥后,keystatus 属性将变得可用。

-r递归加载指定文件系统和所有后代加密根的密钥。

-a加载所有导入池中所有加密根的密钥。

-n执行空运行(“无操作”)加载键。这将导致 zfs 仅检查提供的密钥是否正确。即使密钥已经加载,也可以运行此命令。

-L keylocation- 使用 keylocation 而不是 keylocation 属性。这不会更改数据集上的属性值。请注意,如果与-r或一起使用-a,则 keylocation 只能作为提示给出。

所以,尝试这样的事情:

  1. 将包含密钥的 U 盘安装在您喜欢的任何位置
  2. 导入池而不加载密钥,因为您想用 覆盖该keylocation属性zfs load-key。如果没有该-l选项,则不会安装任何加密的数据集,这正是您想要的。
  3. 加载数据集的密钥
  4. 安装数据集。
zpool import rpool    # without the `-l` option!
zfs load-key -L /path/to/keyfile rpool
zfs mount rpool

顺便说一句:请记住调用的池rpool和该池的顶级数据集(也称为rpool)之间的区别 -zpool子命令与池一起使用,zfs子命令与数据集、zvols、快照等一起使用。

相关内容