无法获得在OSX中创build的ZFS池在Linux系统上导入

我正在尝试使用不同的文件系统,以便在作为testing平台的双启动Linux / OSX笔记本电脑之间使用。 尽pipe是一个BSD变种,但是我在寻找一个兼容的文件系统方面遇到了很多麻烦,但是在OpenZFS的实现上已经解决了。

最新的OpenZFS 0.6.3-1安装在两个系统上。 我最初使用/ dev / disk0s6从OSX内部创build了一个池。 一切工作正常的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显示该池没有损坏,并加载得很好。

我究竟做错了什么?

在经过OpenZFS GitHub的一些优秀人士的许多故障排除后,我可以确认这是一个错误。

真正的问题是我使用磁盘的最后一个分区来创build池,在Linux上,如果分区与磁盘末端足够紧密alignment,可能会造成混淆。

ZFS在目标设备上创build四个标签,以便在开始时使用两个标签,结束时使用两个标签。 当ZFS在启动到Linux之后评估磁盘时,它将首先遇到/ dev / sda,它将提供与磁盘末尾的最后两个标签(从最后一个分区)的部分匹配。 然后错误地认为设备已损坏,因为在磁盘开始时没有标签。

解决scheme是在磁盘末尾添加至less10MB可用空间的缓冲区。

完整的细节可以在这里find: https : //github.com/zfsonlinux/zfs/issues/2742

好的,所以这肯定是由于我对ZFS的经验不足。 与传统的文件系统不同,您可以从任何上下文中引用特定的分区,ZFS似乎保留用于引用数据位置的确切信息,而不pipe从哪里加载。

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

参考这些问题:

ZFS RAID0池没有冗余

为什么重新启动导致我的ZFS镜像的一面成为UNAVAIL?

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

我认为这些信息对于ZFS的新用户非常有用。

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