“zpool replace”挂起并锁定池

“zpool replace”挂起并锁定池

鉴于我的四磁盘 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 小时。:-)

相关内容