復原/匯入具有重複池名稱的 ZFS Linux 池

復原/匯入具有重複池名稱的 ZFS Linux 池

今天我做了一件非常愚蠢的事情,試圖將第三個鏡像新增到名為 的現有 Linux zpool 中backup。可以說我犯了幾個錯誤,因為除了每隔幾年交換一次磁碟之外,我並沒有對 ZFS 進行太多管理。在嘗試糾正它們時,我誤讀了重新建立池的線上建議,並創建了一個新的池,backup從而破壞了現有池。 (是的,我-f在它抱怨後使用了該選項。是的,我是個白痴。現在我知道再也不會這樣做了。讓我們繼續吧。)

根據我在網上閱讀的內容,backup我「創建」的原始池可能無法恢復。這沒什麼問題,因為它的命名backup是有原因的——它主要存放我 15 年前的備份。但是,有一些東西最好能恢復(一些非必要的資料我暫時移到那裡),還有一些與備份設定有關的東西需要我幾天的時間才能重新設定駐留在該磁碟區。 (現在我知道在其他地方備份這些東西,所以這將是一次學習經驗。)

但我有我的備份的備份 - 今天我正在更換第三個鏡像,以替換幾個月前在另一次系統升級(以及作業系統升級)期間刪除的驅動器。該驅動器實際上並沒有出現故障,但它很舊並且已經開始積累一些壞扇區,所以我想我最好把它拿出來,而不是等待它損壞或其他什麼。

不管怎樣,我仍然有那個舊驅動器,所以我想我可以將其放回我的系統並從那裡恢復池資料。我只會丟失過去幾個月的備份資料。現在,我從未正式匯出該磁碟機或其他任何東西上的池。我已經升級了作業系統,所以我沒想到它會自動偵測到該磁碟機。 (我不知道它是否插入同一個 SATA 端口,因為我已經移動了一些驅動器。)

但該zpool import命令似乎沒有自動找到任何內容。使用一些選項,zpool import可以看到(現已被破壞的)池的第二個版本backup,但這只是我在其他兩個驅動器上意外創建的空池。

關於如何嘗試讀取第三個磁碟上的資料有什麼建議嗎?據我所知,在幾個月前我把它從箱子裡拿出來之前,它是 ZFS 池的一個完美且最新的鏡像。尤其:

  1. 事實上,有一個被破壞的池backup可能會幹擾檢測並嘗試恢復/導入這個舊池的能力嗎?有辦法解決這個問題嗎?
  2. 我的伺服器上仍然安裝有舊作業系統,我相信該作業​​系統在我使用舊磁碟時正在運行。我嘗試啟動它只是為了看看它是否可以檢測到 ZFS 池,但它沒有。 (同樣,驅動器可能沒有插入到同一個位置。)但是是否有任何 ZFS 日誌檔案或其他我可以提取的內容,其中可能包含舊池的元資料或 ID 號碼或我可以提取的內容?匯入該磁碟機上完整的鏡像?
  3. 我只是假設前兩個磁碟上的池已通過命令銷毀create -f。但如果有人知道我如何能夠直接在那裡恢復第一個池,那顯然會很棒。
  4. ZFS 無法將舊的第三個鏡像偵測為 ZFS 池磁碟還有其他原因嗎?如果是的話,還有其他建議嗎?我可以嘗試其他恢復工具嗎?

感謝您的任何幫助或建議。

zdb -l /dev/sdb1編輯:這是(這是第三個驅動器)的輸出

------------------------------------
LABEL 0
------------------------------------
    version: 5000
    name: 'backup'
    state: 0
    txg: 0
    pool_guid: 3936176493905234028
    errata: 0
    hostid: 8323329
    hostname: [omitted]
    top_guid: 14695910886267065742
    guid: 17986383713788026938
    vdev_children: 1
    vdev_tree:
        type: 'mirror'
        id: 0
        guid: 14695910886267065742
        whole_disk: 0
        metaslab_array: 34
        metaslab_shift: 33
        ashift: 12
        asize: 1000197324800
        is_log: 0
        create_txg: 4
        children[0]:
            type: 'disk'
            id: 0
            guid: 17914838236907067293
            path: '/dev/sdd1'
            whole_disk: 0
            DTL: 143
            create_txg: 4
        children[1]:
            type: 'disk'
            id: 1
            guid: 17986383713788026938
            path: '/dev/sdb1'
            whole_disk: 0
            DTL: 141
        children[2]:
            type: 'disk'
            id: 2
            guid: 1683783279473519399
            path: '/dev/sdc1'
            whole_disk: 0
            DTL: 145
            create_txg: 4
    features_for_read:
        com.delphix:hole_birth
        com.delphix:embedded_data
    create_txg: 0
    labels = 0 1 2 3 

如果我的解釋正確,狀態 0 表示池應該完好無損。但是,當我嘗試使用池 GUID 進行導入時zpool import 3936176493905234028,我收到“無法導入...沒有此類可用的池”錯誤。 (我假設我應該使用 pool_guid,但我也嘗試使用 guid 和 top_guid,但似乎沒有任何效果。)

EDIT2:我從該池處於活動狀態並嘗試過的原始作業系統中恢復了 zpool.cache 文件zpool import -c zpool.cache,這給出了以下內容:

   pool: backup
     id: 3936176493905234028
  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:

    backup      UNAVAIL  insufficient replicas
      mirror-0  UNAVAIL  insufficient replicas
        sdd1    FAULTED  corrupted data
        sdc1    FAULTED  corrupted data

這在某種程度上是可以預料的。這些是我的建立命令覆蓋池的兩個磁碟。然而,sdb1 並沒有被列為潛在的磁碟機——可能是因為我在取出磁碟後將其從池中刪除了。儘管如此,我認為我在 sdb1 上擁有完整的舊鏡像資料副本,zdb 也同意。為什麼不導入呢?

相關內容