我有一个六磁盘 ZFS raidz1 池,最近发生故障,需要更换磁盘。通常没有问题,但这次我的服务器硬件在我进行更换之前就坏了(但据我所知,这是在驱动器故障之后并且与驱动器故障无关)。
我可以从朋友那里得到另一台机器来重建系统,但在移动驱动器的过程中,我不得不交换它们的电缆,直到我得到正确的配置,其中剩余的 5 个好磁盘被视为在线。这个过程似乎为池/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 个小时,到目前为止没有命令行输出。但是,我的电脑仍然有响应,所以这是一个优点。
答案1
基本上,除了从备份中恢复之外,没有其他官方恢复方法。但是 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。
答案2
顺便说一句,希望将来能帮助到别人:
我认为这个错误被加剧了,并且可能是由于使用/dev/sdX,/dev/hdX在初始设置期之外为我的池中的驱动器命名。
我建议使用另一种命名方案Linux 上的 ZFS FAQ 中有更详细的描述。对于我的小游泳池,我改用/dev/磁盘/按 ID/。 这是很轻松切换方案如果需要,可以在现有池上进行。