Disaster-Recovery

如何恢復 ZFS 池中被覆蓋的標籤、指針塊和 ueberblocks?

  • January 5, 2015

我在單磁碟 ZFS 池中造成了一個愚蠢的事故,看起來和這個郵件列表執行緒中的人一樣,即我似乎覆蓋了重要的元數據。這可以從實際有效負載中恢復,還是有辦法在沒有元數據的情況下檢索有效負載?

這就是我所做的,確切地說:

  • 有一個 ZFS 池在一台機器上執行一個磁碟
  • 想將它遷移到另一台機器上的新 ZFS 池
  • zpool export在第一台機器上忘記了
  • zpool create抱怨設備正在使用時,我想“沒問題,我只是把主機取下來,它不再使用了”並做了zpool create -f

我應該做的(正如我在 RTFM 之後意識到的那樣)import 而不是create在新主機上。現在我有一個工作的 zfspool,但文件系統已經消失/不可見。

我嘗試在舊主機上重新導入設備,後來又嘗試了import -D,但很明顯,兩者都不起作用。

好吧,首先我會在嘗試任何事情之前獲得磁碟的位流副本。

azpool import -D有什麼作用嗎?

老實說,我不這麼認為,因為新池已經覆蓋了原始池的所有標籤、塊和指針塊。

磁碟/分區的頂部和底部 512 KB 包含標籤,其中包括最後幾個超級塊的列表(用於恢復和回滾)和池的 RAID 幾何結構(更具體地說是磁碟所屬的 vdev)。通過建立一個新的游泳池,您幾乎可以肯定已經消滅了舊標籤。這意味著您需要知道池的確切幾何結構(RAID-Z 配置與磁碟順序),並努力尋找超級塊。

zpool create 會覆蓋設備上的所有標籤(這就是您必須添加“-f”的原因,這實質上意味著“如果一切都出錯了,請怪我”)。由於 vdev 標籤包含根塊指針(指向整個池對象樹的根塊),並且該塊指針中的值隨著新數據的添加(由於 COW 語義)而移動,因此您的數據消失了

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