Linux

無法獲取在 OSX 中創建的 ZFS 池以在 Linux 系統上導入

  • September 27, 2014

我正在嘗試在雙啟動 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

引用自:https://serverfault.com/questions/631124