Zfs

ZFS 從故障池狀態中恢復

  • March 2, 2015

我有一個六磁碟 ZFS raidz1 池,最近發生了需要更換磁碟的故障。通常沒問題,但是這次我的伺服器硬體在我更換之前就死了(但據我所知,在驅動器故障之後並且與驅動器故障無關)。

我可以從朋友那裡得到另一台機器來重建系統,但是在移動我的驅動器的過程中,我不得不將它們的電纜換成一堆,直到我得到正確的配置,剩下的 5 個好磁碟被視為線上。這個過程似乎為 pool/raidz 生成了一些校驗和錯誤。

我現在設置了剩餘的 5 個驅動器,並安裝了一個好的驅動器並準備好代替死掉的驅動器。但是,由於我的池狀態是FAULTED我無法進行替換。

root@zfs:~# zpool replace tank 1298243857915644462 /dev/sdb
cannot open 'tank': pool is unavailable

有沒有辦法從這個錯誤中恢復?我認為線上擁有 6 個驅動器中的 5 個就足以重建正確的數據,但現在這似乎還不夠。

這是我的池的狀態日誌:

root@zfs:~# zpool status tank
 pool: tank
state: FAULTED
status: One or more devices could not be used because the label is missing or invalid.
       There are insufficient replicas for the pool to continue functioning.
action: Destroy and re-create the pool from a backup source.
  see: http://zfsonlinux.org/msg/ZFS-8000-5E
 scan: none requested
config:

   NAME                     STATE     READ WRITE CKSUM
   tank                     FAULTED      0     0     1  corrupted data
     raidz1-0               ONLINE       0     0     8
       sdd                  ONLINE       0     0     0
       sdf                  ONLINE       0     0     0
       sdh                  ONLINE       0     0     0
       1298243857915644462  UNAVAIL      0     0     0  was /dev/sdb1
       sde                  ONLINE       0     0     0
       sdg                  ONLINE       0     0     0

**更新(10/31):**過去一周我嘗試導出和重新導入數組幾次,但沒有成功。首先我試過:

zpool import -f -R /tank -N -o readonly=on -F tank

這立即產生了這個錯誤:

cannot import 'tank': I/O error
      Destroy and re-create the pool from a backup source.

我在上面的命令中添加了“-X”選項,試圖讓它檢查事務日誌。我讓它執行了大約 48 小時才放棄,因為它完全鎖定了我的機器(我無法在本地或通過網路登錄)。

現在我正在嘗試一個簡單的zpool import tank命令,它似乎執行了一段時間沒有輸出。我會讓它一夜之間執行,看看它是否輸出任何東西。

更新(11 月 1 日): zpool import tank現在已經執行了大約 12 個小時,到目前為止還沒有命令行輸出。但是,我的電腦仍然響應,所以這是一個加號。

除了從備份恢復之外,基本上沒有官方的恢復方式。但是有一個稱為 rewind 的 ZFS 功能,它可以將事務從池中刪除,直到池再次正常工作。以下文字來自 ZFS Internals 部落格第 11 部分

不要在生產中嘗試。使用風險自負!

zpool import -FX mypool 其中選項表示:

  • -F 如有必要,嘗試倒帶。

  • -X 打開極端倒帶。

  • -T 指定用於導入的起始 txg。出於測試目的,此選項是故意未記錄的選項。

首先,我嘗試使用此倒帶程序進行恢復。它對我不起作用,也許它沒有在 Linux 的 zfs-fuse 上實現。根據 ZFSOnDiskFormat.pdf,txg 有 128 個可能值的數組。在我的 zfs-fuse 版本 0.7.0 選項 -T 不存在。所以我修改了 zfs-fuse 以在 uberblock 數組中列出可用的 txg,並允許從具有特定 ID 的 txg 開始。使用修改後的 zfs-fuse 我能夠訪問 ZFS 中的文件系統。

我確實使用這種方法恢復了我的游泳池。所以可以恢復,但這是不受支持的方法,必須非常小心,因為很容易把事情弄得更糟。我的意見是 Sun/Oracle 應該針對這些情況為 ZFS 提供 fsck。

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