ZFS 从故障池状态中恢复

Nic*_*ick 6 zfs raidz zpool

我有一个 6 磁盘 ZFS raidz1 池,最近发生了需要更换磁盘的故障。通常没问题,但这次我的服务器硬件在我可以进行更换之前就死了(但据我所知,在驱动器故障之后并且与驱动器故障无关)。

我能够从朋友那里得到另一台机器来重建系统,但是在移动我的驱动器的过程中,我不得不交换他们的电缆,直到我得到正确的配置,剩下的 5 个好的磁盘被视为在线。此过程似乎为 pool/raidz 生成了一些校验和错误。

我现在设置了剩余的 5 个驱动器,并安装了一个良好的驱动器,并准备好取代死掉的驱动器。但是,由于我的池状态是FAULTED我无法进行替换。

root@zfs:~# zpool replace tank 1298243857915644462 /dev/sdb
cannot open 'tank': pool is unavailable
Run Code Online (Sandbox Code Playgroud)

有没有办法从这个错误中恢复?我认为让 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
Run Code Online (Sandbox Code Playgroud)

更新(10/31):过去一周我尝试导出和重新导入数组几次,但没有成功。首先我试过:

zpool import -f -R /tank -N -o readonly=on -F tank
Run Code Online (Sandbox Code Playgroud)

这立即产生了这个错误:

cannot import 'tank': I/O error
       Destroy and re-create the pool from a backup source.
Run Code Online (Sandbox Code Playgroud)

我在上面的命令中添加了“-X”选项,试图让它检查事务日志。我让它运行了大约 48 小时才放弃,因为它完全锁定了我的机器(我无法在本地或通过网络登录)。

现在我正在尝试一个简单的zpool import tank命令,它似乎运行了一段时间而没有输出。我会让它运行一夜,看看它是否输出任何东西。

更新(11/1): zpool import tank到目前为止已经运行了大约 12 个小时,没有命令行输出。但是,我的计算机仍然可以响应,所以这是一个加分项。

Ven*_*hki 6

除了从备份中恢复之外,基本上没有官方的恢复方法。但是有一个称为回退的 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。