我有一个六磁盘ZFS raidz1池,并有一个最近的故障,需要更换磁盘。 正常情况下没有问题,但是这次我的服务器硬件在我可以做replace之前就已经死了(但是据我所知,在硬盘故障之后和硬盘故障无关)。
我能够从朋友那里获得另一台机器来重build系统,但是在移动硬盘的过程中,我不得不绕过一堆交换电缆,直到获得正确的configuration,其余5个磁盘被视为在线。 这个过程似乎已经为pool / raidz生成了一些校验和错误。
我现在已经安装了5个剩余的驱动器,并且安装了一个好的驱动器,并准备好代替死亡的驱动器。 但是,由于我的池状态是FAULTED所以无法进行更换。
root@zfs:~# zpool replace tank 1298243857915644462 /dev/sdb cannot open 'tank': pool is unavailable
有没有办法从这个错误中恢复? 我认为有6个驱动器中的5个在线就足以重build正确的数据,但现在看来还不够。
这是我的池的状态日志:
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'选项来尝试检查事务日志。 因为它已经完全locking了我的机器(我无法在本地或通过networkinglogin),所以我放弃了大概48小时的放弃。
现在我正在尝试一个简单的zpool import tank命令,似乎运行了一会儿没有输出。 我会让它在一夜之间运行,看它是否输出任何东西。
更新(11/1): zpool import tank已经运行了大约12个小时,目前没有命令行输出。 但是,我的电脑仍然是响应式的,所以这是一个优点。
基本上,除了从备份还原之外,没有正式的方法来恢复。 但是有一个名为rewind的ZFSfunction,可以将事务从池中移除,以使池再次起作用。 以下文本来自ZFS Internals博客部分#11
不要试图生产。 使用您自己的风险!
zpool import -FX mypool其中options表示:
* -F尝试重放,如有必要。
* -X打开极端倒带。
* -T指定一个起始txg用于导入。 这个选项是故意没有logging的选项用于testing目的。
首先,我尝试使用此倒带过程来恢复。 它没有为我工作,也许它没有实现Linux上的zfs-fuse。 根据ZFSOnDiskFormat.pdf,txg有128个可能的值。 在我的zfs-fuse版本0.7.0选项-T不存在。 所以我修改了zfs-fuse来列出uberblock数组中的可用txg,并允许从txg开始使用特定的Id。 使用修改后的zfs-fuse,我能够访问ZFS中的文件系统。
我通过使用这种方法恢复了我的池。 所以有可能恢复,但这种方法是不受支持的,必须非常小心,因为把事情搞得更糟,这是很容易的。 我的意见是Sun / Oracle应该为这些情况提供ZFS的ZFS。
顺便说一句,希望在未来帮助别人:
我认为这个错误加剧了,并且可能是由于我的驱动器在初始设置阶段以外使用了/ dev / sdX,/ dev / hdX命名而导致的。
我build议使用另一个命名scheme, 如Linux FAQ上的ZFS所描述的那样。 对于我的小池,我切换到/ dev / disk / by-id / 。 如果需要,在现有池上切换scheme是非常容易的 。