鉴于我的四磁盘 RAIDZ1,其中一个磁盘在物理上变得嘈杂,虽然尚未产生错误,但听起来也不正常。所以我选择先发制人地更换它。
我已经做好了:
zpool offline tank0 ad6
关闭、移除和更换磁盘
zpool replace tank0 ad6 ad6
永远悬挂。
zpool status
也会永远挂起,就像 一样zpool history
。
如果我重新启动移除磁盘的机器,一切都会正常工作,并按预期处于降级模式。
我现在该怎么办?我很担心,因为我的数据现在很容易受到单个磁盘故障的影响。
操作系统是 FreeBSD 7.3-RELEASE-p1 - 又名 FreeNAS 7.0.2.5226
我刚刚在虚拟机中尝试了同样的操作,尽管 FreeBSD 7.3-RELEASE-p7(FreeNAS 0.7.2.8191,稍高版本)运行良好。尝试使用我现在能找到的最旧版本的 FreeNAS(7.0.2.5799),稍后会更新。
另外,zpool replace
不需要使用文件系统吗?NAS 上的另一个守护进程可能正在使用该文件系统。我认为这样是可以的,但是这当然也可能是错误的。
更新,2012-01-10
我启动了装有 FreeNAS 8 的机器并执行了以下操作zpool replace
- 启动后立即开始抛出大量数据损坏错误和内核恐慌 - 尽管每周清理池一次但从未发现任何问题。我不认为我做了任何愚蠢的事情,比如告诉它更换错误的磁盘。我立即发出了命令,shutdown -h
因为我知道数据没问题。
无论如何,我现在有一个降级的池,处于替换暂停的状态,我正在将数据复制到一个花费巨资购买的 3TB 外部驱动器上,这样我就可以销毁池并重新开始。谢天谢地,数据看起来没问题——我碰巧有大约 100GB 文件的 md5sum,到目前为止这些文件似乎完好无损,我已经设法恢复了所有真正无法替代的东西。
我现在正在等待更多的 RAM 到来,因为 FreeNAS 8 一直因 kmem_max 太小错误而感到恐慌,我似乎无法对此进行调整,并且机器的 RAM 受到限制(4TB RAIDZ1 为 1 GB RAM)。
从备份中吸取了惨痛的教训,但对 ZFS/FreeNAS/FreeBSD 的信心也受到了严重打击。
更新日期 13/1/12
嗯,我的数据现在看起来已经安全备份了。
即使将故障模式设置为继续,zpool status -v 仍会挂起。以下是 zpool status 的输出,其中插入了新磁盘 (ada1)
pool: tank0
state: DEGRADED
status: One or more devices has experienced an error resulting in data
corruption. Applications may be affected.
action: Restore the file in question if possible. Otherwise restore the entire pool
from backup.
see: http://www.sun.com/msg/ZFS-8000-8A
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
tank0 DEGRADED 0 0 0
raidz1 DEGRADED 0 0 0
ada2 ONLINE 0 0 0
ada3 ONLINE 0 0 0
ada0 ONLINE 0 0 0
replacing DEGRADED 0 0 3.17K
6540253751212815210 UNAVAIL 0 0 0 was /dev/ada3/old
ada1 ONLINE 0 0 0
errors: 3130 data errors, use '-v' for a list
插入旧磁盘而不是新磁盘后,ZFS 将不会导入池,并zfs status
显示:
tank0 UNAVAIL insufficient replicas
raidz1 FAULTED corrupted data
ada2 ONLINE
ada3 ONLINE
ada0 FAULTED corrupted data
replacing UNAVAIL insufficient replicas
ada1 FAULTED corrupted data
ada1 FAULTED corrupted data
我不明白为什么插入新磁盘 (ada1) 时 ada0 会出现故障,而插入旧磁盘时 ada0 却处于联机状态?我不明白 ada0 有何关联。
让我们尝试恢复这个池作为一项学习练习。
答案1
我不是 ZFS 专家,但我会尝试一下:听起来 ZFS 子系统仍在尝试访问故障驱动器,并且由于某种原因挂起。尝试将池的failmode
值设置为continue
( zpool set failmode=continue
),看看这是否会让挂起消失并让您弄清楚发生了什么。
(请注意,这不是一个修复:系统仍然无法访问它认为应该能够访问的驱动器,它只是告诉它返回错误并继续运行而不是阻止直到收到答复。)
答案2
这件事确实让我陷入了绝境。最后只能平整池并将文件从备份恢复到 FreeNAS 8。
到目前为止感觉更加稳定 - 较新的 x64 操作系统、4GB RAM 可能都有所贡献。
答案3
我最近遇到了类似的情况,虽然没有遇到挂起,但我只是无法更换发生故障的驱动器。当然,我处于完全不同的环境中:带有 ZFS-fuse 的 Linux。但是,与您不同的是,我并没有被告知我遇到了数据损坏,我看到的是:
state: DEGRADED
status: One or more devices could not be opened. Sufficient replicas exist for
the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
see: http://www.sun.com/msg/ZFS-8000-2Q
[...]
disk/by-id/ata-Hitachi_HDS722020ALA330_JK1105B8GNNADX-part4 UNAVAIL 0 0 0 cannot open
现在,在继续之前,重要的是要意识到这个池中的任何数据都不是不可替代的,所有内容要么是备份,要么是其他系统的备份。如果您没有这些数据的良好备份,您可能希望就此停止,并在执行任何其他操作之前制作光盘的原始副本,以防情况变得更糟。
我最终做的并且有效的是这个。
首先,我使用“zfs export POOLNAME”导出池。然后我重新启动并执行“zfs import POOLNAME”。
现在,当我执行“zpool status”时,我得到了以下信息:
state: DEGRADED
[...]
12640132412556728613 UNAVAIL 0 0 0 was /dev/disk/by-id/ata-Hitachi_HDS722020ALA330_JK1105B8GNNADX-part4
现在我可以使用上述号码来更换光盘:
zpool replace POOLNAME 12640132412556728613 /dev/DEVILCENAME
现在它显示为替换“zpool status”中的驱动器:
state: DEGRADED
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scrub: resilver in progress for 0h0m, 0.00% done, 282h43m to go
它“仅”花费了大约 48 小时来运行,而不是上面估计的 282 小时。:-)