我有两台 Linux (NixOS) 机器,我想共享一个加密的 ZFS 格式的便携式 USB 硬盘。我已经让它在一台机器上正常工作,但是当我尝试将其安装在第二台机器上时,我可能已经破坏了驱动器上的 ZFS 文件系统。
在将 USB 驱动器从一台机器移动到另一台机器之前,我导出了 zpool 以卸载它。我希望可以从第二台机器上的驱动器导入 zpool,但我可能误解了 ZFS 的 zpool 概念。我无法让我的第二台机器通过zpool list
、zpool import -a
、zpool import -D
等的各种组合看到 ZFS 驱动器。该驱动器肯定显示为/dev/sdb
,但 ZFS 在这台第二台机器上的自动检测只是出于神秘原因忽略了它。
最终我做了一个简单的操作sudo zpool create z /dev/sdb
,认为 zpool 完全是一个虚拟的东西,我需要在这台机器上进行镜像,但我认为这个命令覆盖了该驱动器上的原始 ZFS 文件系统,没有任何警告。该驱动器现在是一个空的未加密文件系统,我不确定是否可以从中恢复我的数据。幸运的是我有备份,所以这并不是完全丢失。
两个问题:
在现有 vdev 上创建新的 zpool 是否会不可逆地破坏该设备上以前的任何 ZFS 文件系统?
如何将现有的加密 ZFS 驱动器 zpool 从一台计算机导入到另一台计算机,导入所有原始 zpool 配置选项(例如压缩、加密、数据集等)?如果不是
zpool import
,那是什么?
答案1
我想您已经通过实验回答了您的第一个问题:是的,对zpool create
受影响的 vdev 上的任何现有池进行破坏。
鉴于您正在努力确保要共享此池的系统之间的兼容性,我建议您放弃加密,直到您确定 zpool 结构的机制正确并且不存在可能的潜在阻塞阻止你的测试成功。
话虽如此,ZFS 池可跨系统移植的必要条件之一是构成池的块设备(以及在池元数据中编码的块设备)在要导入池的任何系统中必须是明确的。这使得使用诸如/dev/sdb
等的裸物理设备是不明智的。更好的方法是在每个要使用的驱动器上创建一个分区,并为每个使用的分区分配一个唯一的标签。驱动器的序列号通常是一个方便使用的字符串,因为它不仅在池元数据中以电子方式可见,而且在输出中也可见blkid
,并且在检查物理驱动器底盘时人为可见。
因此,如果硬盘驱动器的序列号是6SL0CTD
,您应该在该驱动器上创建一个分区并为其添加标签zfs-data-6SL0CTD
。然后创建引用该逻辑设备(而不是可能可变的物理设备)的池:
# zpool create tank /dev/disk/by-partlabel/zfs-data-6SL0CTCD
另外,请阅读 的手册页zpool import
,并注意,当您不确定要导入的内容(或为什么不导入)时,可以使用许多非破坏性工具:
不带参数:
# zpool import
显示任何可导入的池。我手头没有测试用例,但我相信它也会显示池不能被导入,通常是由于设备丢失或故障。 “丢失”设备的原因之一可能是因为池元数据表明要使用 /dev/sdb,但主机已有 /dev/sdb,并且该设备不包含与池匹配的元数据。同样,这就是为什么分配分区标签和仅基于分区标签创建池很重要。如果存在该分区标签,则将找到该池,并且无论是什么身体的分区出现的设备。
# zpool import -N tank
导入池tank
但不从中挂载任何文件系统。这可以用作池的二级检查。尽管没有安装任何东西,但可以检查池的统计数据,池可以scrub
床等。
一旦您正确创建了池,以便它使用明确的设备名称,事后您就会明白为什么这可能很重要。
zpool status -P
将显示池中所有设备的完整逻辑路径:
# zpool status -P
pool: tank
state: ONLINE
scan: scrub repaired 0B in 21h34m with 0 errors on Sun Oct 10 21:58:23 2021
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
/dev/disk/by-partlabel/zfs-data-6SL0CTCD ONLINE 0 0 0
errors: No known data errors
反之,zpool status -L
将显示身体的池中所有设备的设备名称:
# zpool status -L
pool: tank
state: ONLINE
scan: scrub repaired 0B in 21h34m with 0 errors on Sun Oct 10 21:58:23 2021
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
sdb1 ONLINE 0 0 0
errors: No known data errors
使用分区标签而不是物理设备节点的最终结果是,导入池的所有计算机上的输出zpool status -P
将相同,但输出zpool status -L
可能会很不同。这就是为什么zpool create
需要根据非变体逻辑设备编写命令的原因,以保证这些设备在可能需要导入池的所有计算机上都是明确的。
一旦您根据明确的设备名称构建了池,假设您在需要能够导入池的主机上具有相当相似的 ZFS 堆栈,则对 zpool 进行加密应该很简单。