![Linux 上的 zfs:如果您不知道密钥必须安装在哪里,如何导入加密池?](https://linux22.com/image/215380/Linux%20%E4%B8%8A%E7%9A%84%20zfs%EF%BC%9A%E5%A6%82%E6%9E%9C%E6%82%A8%E4%B8%8D%E7%9F%A5%E9%81%93%E5%AF%86%E9%92%A5%E5%BF%85%E9%A1%BB%E5%AE%89%E8%A3%85%E5%9C%A8%E5%93%AA%E9%87%8C%EF%BC%8C%E5%A6%82%E4%BD%95%E5%AF%BC%E5%85%A5%E5%8A%A0%E5%AF%86%E6%B1%A0%EF%BC%9F.png)
我使用的是 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 只能作为提示给出。
所以,尝试这样的事情:
- 将包含密钥的 U 盘安装在您喜欢的任何位置
- 导入池而不加载密钥,因为您想用 覆盖该
keylocation
属性zfs load-key
。如果没有该-l
选项,则不会安装任何加密的数据集,这正是您想要的。 - 加载数据集的密钥
- 安装数据集。
zpool import rpool # without the `-l` option!
zfs load-key -L /path/to/keyfile rpool
zfs mount rpool
顺便说一句:请记住调用的池rpool
和该池的顶级数据集(也称为rpool
)之间的区别 -zpool
子命令与池一起使用,zfs
子命令与数据集、zvols、快照等一起使用。