我有一个 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 个小时,没有命令行输出。但是,我的计算机仍然可以响应,所以这是一个加分项。
除了从备份中恢复之外,基本上没有官方的恢复方法。但是有一个称为回退的 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。