Linux

從缺少設備的 zpool 中恢復數據

  • November 11, 2021

我有一個由兩個鏡像驅動器組成的 zpool,用於存​​儲我的所有個人數據。我想添加另一個鏡像驅動器,因為其他驅動器已經使用了好幾年了。相反,我設法削弱了池,無法再導入它。

這是在我做任何事情之前池(稱為“保險庫”)的原始佈局:

vault
 mirror-0
   sdd
   sdh

我嘗試通過發出來添加另一個驅動器zpool add vault /dev/sdc,並從 zpool 收到警告(關於期待 vdev,但 scd 是磁碟)。我忽略了警告,並強制操作-f(是的,這很愚蠢……)

我最終得到了以下池配置:

vault
 mirror-0
   sdd
   sdh
 sdc

注意到 sdc 不是鏡像的一部分,我嘗試再次將其從池中刪除,並意識到這是不可能的。我忽略了額外的驅動器並重新啟動,並假設我的數據在 mirror-0 中已經是安全的,並決定使用重新利用 sdc 並改用另一個驅動器,用零覆蓋前 100MB 的 sdc:(dd if=/dev/zero of=/dev/sdc bs=1MB count=100是的,我今天特別愚蠢… )

現在,當我嘗試導入我的 zpool 時,我收到以下錯誤:

root@atlas:~# zpool import                                                                                                                         
  pool: vault                                                                                                                                     
    id: 3553551207657826252                                                                                                                       
 state: UNAVAIL                                                                                                                                   
status: One or more devices are missing from the system.                                                                                          
action: The pool cannot be imported. Attach the missing                                                                                           
       devices and try again.                                                                                                                     
  see: http://zfsonlinux.org/msg/ZFS-8000-6X                                                                                                      
config:                                                                                                                                           
                                                                                                                                                  
       vault        UNAVAIL  missing device                                                                                                       
         mirror-0   ONLINE                                                                                                                        
           sdd      ONLINE                                                                                                                        
           sdh      ONLINE                                                                                                                        
                                                                                                                                                  
       Additional devices are known to be part of this pool, though their                                                                         
       exact configuration cannot be determined.                                                                                                  

這些驅動器上鏡像中的數據對我來說非常重要,我真的希望有一種方法可以從“部分”池中恢復數據。由於我在虛假操作後幾分鐘重新啟動add,我假設文件系統的元數據已被擦除,並且有一種方法可以以某種方式訪問原始數據。但我不知道從哪裡開始。

誰能幫我這個?

通過將 debian 升級到 Bullseye(以便訪問更新版本的 zdb)並導入缺少 vdevs 的 zpool,我設法恢復了部分數據:

echo 1 >> /sys/module/zfs/parameters/zfs_max_missing_tvds
zpool import -o readonly=on vault

但是,zpool 上的某些文件系統已損壞。我已經將完整的數據複製到一個新的 zpool 上,並探測了早期的txg值以找到一個沒有引發任何錯誤的值:

zdb -e vault -ul | grep ' txg' | sed 's/.*= //' | sort | head
zdb -deG -o zfs_max_missing_tvds=1 -T 5102203 vault  # <- errors
zdb -deG -o zfs_max_missing_tvds=1 -T 5102202 vault  # <- errors
zdb -deG -o zfs_max_missing_tvds=1 -T 5102201 vault  # <- worked!

然後我能夠以完整的事務組 ID 導入 zpool:

zpool import -o readonly=on -T 5102201 vault

對於我的 2x4TB 鏡像,這個命令大約需要 15 個小時,但我可以再次訪問我的所有文件。數據已被複製到一個新的 zpool 上,我再也不會在睡眠不足的狀態下觸摸它了。

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