從缺少設備的 zpool 中恢復數據
我有一個由兩個鏡像驅動器組成的 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 上,我再也不會在睡眠不足的狀態下觸摸它了。