在兩台 Linux 電腦之間共用便攜式加密 ZFS 格式磁碟機時出現問題

在兩台 Linux 電腦之間共用便攜式加密 ZFS 格式磁碟機時出現問題

我有兩台 Linux (NixOS) 機器,我想共用一個加密的 ZFS 格式的便攜式 USB 硬碟。我已經讓它在一台機器上正常工作,但是當我嘗試將其安裝在第二台機器上時,我可能已經破壞了驅動器上的 ZFS 檔案系統。

在將 USB 驅動器從一台機器移至另一台機器之前,我匯出了 zpool 以卸載它。我希望可以從第二台機器上的磁碟機匯入 zpool,但我可能誤解了 ZFS 的 zpool 概念。我無法讓我的第二台機器通過zpool listzpool import -azpool import -D等的各種組合看到 ZFS 驅動器/dev/sdb

最後我做了一個簡單的操作sudo zpool create z /dev/sdb,認為 zpool 完全是一個虛擬的東西,我需要在這台機器上進行鏡像,但我認為這個命令覆蓋了該驅動器上的原始 ZFS 文件系統,沒有任何警告。該驅動器現在是一個空的未加密檔案系統,我不確定是否可以從中恢復我的資料。幸運的是我有備份,所以這並不是完全丟失。

兩個問題:

  1. 在現有 vdev 上建立新的 zpool 是否會不可逆地破壞該裝置上先前的任何 ZFS 檔案系統?

  2. 如何將現有的加密 ZFS 驅動器 zpool 從一台計算機匯入到另一台計算機,匯入所有原始 zpool 配置選項(例如壓縮、加密、資料集等)?如果不是zpool import,那是什麼?

答案1

我想您已經透過實驗回答了您的第一個問題:是的,對zpool create受影響的 vdev 上的任何現有池進行破壞。

鑑於您正在努力確保要共享此池的系統之間的兼容性,我建議您放棄加密,直到您確定 zpool 結構的機制正確並且不存在可能的潛在阻塞阻止您的測試成功。

話雖如此,ZFS 池可跨系統移植的必要條件之一是構成池的區塊設備(以及在池元資料中編碼的區塊設備)在要匯入池的任何系統中必須是明確的。這使得使用諸如/dev/sdb等的裸實體設備是不明智的。驅動器的序號通常是一個方便使用的字串,因為它不僅在池元資料中以電子方式可見,而且在輸出中也可見blkid,並且在檢查實體驅動器底盤時人為可見。

因此,如果硬碟的序號是6SL0CTD,您應該在該磁碟機上建立一個分割區並為其新增標籤zfs-data-6SL0CTD。然後建立引用該邏輯設備(而不是可能可變的實體設備)的池:

# zpool create tank /dev/disk/by-partlabel/zfs-data-6SL0CTCD

另外,請閱讀 的手冊頁zpool import,並注意,當您不確定要匯入的內容(或為什麼不匯入)時,可以使用許多非破壞性工具:

不含參數:

# zpool import

顯示任何可匯入的池。我手邊沒有測試案例,但我相信它也會顯示池不能被導入,通常是由於設備遺失或故障。 「遺失」裝置的原因之一可能是因為池元資料顯示要使用 /dev/sdb,但主機已有 /dev/sdb,且該裝置不包含與池相符的元資料。同樣,這就是為什麼分配分區標籤和僅基於分區標籤建立池很重要。如果存在該分割區標籤,則將找到該池,並且無論是什麼身體的分區出現的設備。

# zpool import -N tank

導入池tank但不從中掛載任何檔案系統。這可以用作池的二級檢查。儘管沒有安裝任何東西,但可以檢查池的統計數據,池可以scrub床等。

一旦您正確建立了池,以便它使用明確的設備名稱,事後您就會明白為什麼這可能很重要。

zpool status -P將顯示池中所有設備的完整邏輯路徑:

# zpool status -P
  pool: tank
 state: ONLINE
  scan: scrub repaired 0B in 21h34m with 0 errors on Sun Oct 10 21:58:23 2021
config:

    NAME                                            STATE     READ WRITE CKSUM
    tank                                          ONLINE       0     0     0
      /dev/disk/by-partlabel/zfs-data-6SL0CTCD    ONLINE       0     0     0

errors: No known data errors

反之,zpool status -L將顯示身體的池中所有設備的設備名稱:

# zpool status -L
  pool: tank
 state: ONLINE
  scan: scrub repaired 0B in 21h34m with 0 errors on Sun Oct 10 21:58:23 2021
config:

    NAME                                            STATE     READ WRITE CKSUM
    tank                       ONLINE       0     0     0
      sdb1                     ONLINE       0     0     0

errors: No known data errors

使用分區標籤而不是實體設備節點的最終結果是,導入池的所有電腦上的輸出zpool status -P將相同,但輸出zpool status -L可能會有所不同。這就是為什麼zpool create需要根據非變體邏輯設備編寫命令的原因,以確保這些設備在可能需要導入池的所有計算機上都是明確的。

一旦您根據明確的裝置名稱建立了池,假設您在需要能夠匯入池的主機上具有相當相似的 ZFS 堆疊,則對 zpool 進行加密應該很簡單。

相關內容