我正在尝试在双启动 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 镜像的一侧变为 UNAVAIL?
看来我在引用设备时需要考虑可移植性。例如,使用分区的 UUID,该 UUID 在两个操作系统之间保持不变。
我认为这些信息对于刚接触 ZFS 的人来说很有用。
编辑:这个答案是错误的!请参阅下面的正确答案。