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 表明池沒有損壞並且載入正常。
我究竟做錯了什麼?
在 OpenZFS GitHub 與一些優秀的人進行了大量故障排除後,我可以確認這是一個錯誤。
真正的問題是我使用磁碟的最後一個分區創建了池,在 Linux 上,如果分區與磁碟末尾足夠接近,則可能會被混淆為損壞。
ZFS 在目標設備上創建四個標籤以實現冗餘,其中兩個在開頭,兩個在結尾。當 ZFS 在引導到 Linux 後評估磁碟時,它將首先遇到 /dev/sda,這將提供與磁碟末尾的最後兩個標籤(來自最後一個分區)的部分匹配。然後它錯誤地認為設備已損壞,因為磁碟開頭沒有標籤。
解決方案是在磁碟末尾添加至少 10MB 可用空間的緩衝區。
完整的細節可以在這裡找到: https ://github.com/zfsonlinux/zfs/issues/2742