无法将 OSX 中创建的 ZFS 池导入 Linux 系统

无法将 OSX 中创建的 ZFS 池导入 Linux 系统

我正在尝试在双启动 Linux/OSX 笔记本电脑上使用不同的文件系统,该笔记本电脑将充当测试平台。尽管是 BSD 变体,但我在寻找兼容的文件系统时遇到了很多麻烦,最终还是选择了 OpenZFS 实现。

两个系统上都安装了最新的 OpenZFS 0.6.3-1。我最初使用 /dev/disk0s6 在 OSX 中创建了一个池。在 OSX 中,驱动器安装并可写入,一切正常:

$ zpool status
  pool: Data
 state: ONLINE
  scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    Data        ONLINE       0     0     0
      disk0s6   ONLINE       0     0     0

errors: No known data errors

$ zpool import
   pool: Data
     id: 16636970642933363897
  state: ONLINE
 action: The pool can be imported using its name or numeric identifier.
 config:

    Data        ONLINE
      disk0s6   ONLINE

但是当我导出 zpool 并重新启动到 Linux 时,我无法导入该池,即使使用 -f:

$ zpool import -f Data
cannot import 'Data': one or more devices are already in use

$ zpool import
   pool: Data
     id: 16636970642933363897
  state: UNAVAIL
 status: One or more devices contains corrupted data.
 action: The pool cannot be imported due to damaged devices or data.
   see: http://zfsonlinux.org/msg/ZFS-8000-5E
 config:

    Data                                         UNAVAIL  insufficient replicas
      ata-Corsair_Force_GT_135004090FF015790001  UNAVAIL

重新启动进入 OSX 表明池未损坏且加载正常。

我究竟做错了什么?

答案1

在与 OpenZFS GitHub 上的一些优秀人员进行大量故障排除后,我可以确认这是一个错误。

真正的问题是我使用磁盘的最后一个分区创建了池,在 Linux 上,如果该分区与磁盘末尾足够接近,则可能会被混淆为损坏。

ZFS 在目标设备上创建了四个标签以实现冗余,两个在开头,两个在结尾。当 ZFS 在启动 Linux 后评估磁盘时,它会首先遇到 /dev/sda,这将提供与磁盘末尾(来自最后一个分区)的最后两个标签的部分匹配。然后它错误地认为该设备已损坏,因为磁盘开头没有标签。

解决方案是在磁盘末尾添加至少 10MB 可用空间的缓冲区。

完整详细信息请见此处: https://github.com/zfsonlinux/zfs/issues/2742

答案2

好吧,这肯定是由于我对 ZFS 不熟悉。与传统文件系统(可以从任何上下文引用特定分区)不同,ZFS 似乎保留了用于引用数据位置的确切信息,无论数据从何处加载。

例如,我创建了 zpool 并通过“/dev/disk0s6”从 OSX 引用了该设备,而 Linux 上不存在该设备。我创建了从 /dev/disk0s6 到 /dev/sda6 的符号链接,现在一切正常。

参考这些问题:

无冗余的 ZFS RAID0 池

为什么重新启动会导致我的 ZFS 镜像的一侧变为 UNAVAIL?

看来我在引用设备时需要考虑可移植性。例如,使用分区的 UUID,该 UUID 在两个操作系统之间保持不变。

我认为这些信息对于刚接触 ZFS 的人来说很有用。

编辑:这个答案是错误的!请参阅下面的正确答案。

相关内容