在两台 Linux 计算机之间共享便携式加密 ZFS 格式驱动器时出现问题

在两台 Linux 计算机之间共享便携式加密 ZFS 格式驱动器时出现问题

我有两台 Linux (NixOS) 机器,我想共享一个加密的 ZFS 格式的便携式 USB 硬盘。我已经让它在一台机器上正常工作,但是当我尝试将其安装在第二台机器上时,我可能已经破坏了驱动器上的 ZFS 文件系统。

在将 USB 驱动器从一台机器移动到另一台机器之前,我导出了 zpool 以卸载它。我希望可以从第二台机器上的驱动器导入 zpool,但我可能误解了 ZFS 的 zpool 概念。我无法让我的第二台机器通过zpool listzpool import -azpool import -D等的各种组合看到 ZFS 驱动器。该驱动器肯定显示为/dev/sdb,但 ZFS 在这台第二台机器上的自动检测只是出于神秘原因忽略了它。

最终我做了一个简单的操作sudo zpool create z /dev/sdb,认为 zpool 完全是一个虚拟的东西,我需要在这台机器上进行镜像,但我认为这个命令覆盖了该驱动器上的原始 ZFS 文件系统,没有任何警告。该驱动器现在是一个空的未加密文件系统,我不确定是否可以从中恢复我的数据。幸运的是我有备份,所以这并不是完全丢失。

两个问题:

  1. 在现有 vdev 上创建新的 zpool 是否会不可逆地破坏该设备上以前的任何 ZFS 文件系统?

  2. 如何将现有的加密 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 进行加密应该很简单。

相关内容