我遭遇了完全的池故障 - 阵列机箱中的风扇停止工作并且所有驱动器都过热。冷却后,使用希捷的 Seatools 测试实用程序检查所有驱动器均正常,并且 smartctl 显示它们正常。我还能够直接从每个设备读取数据,并且系统可以看到每个设备。
但是……当我尝试使池重新上线时,它的状态为“UNAVAIL”。这是一个 raidz1 池,共有 4 个驱动器。我得到的错误说明:
zpool cannot import pool one or more devices is currently unavailable
zpool 状态显示:
NAME STATE READ WRITE CKSUM
pool_01 UNAVAIL 0 0 1
raidz1-0 DEGRADED 0 0 4
c0t5000C500A24AD833d0 ONLINE 0 0 4
c0t5000C500A232AFA6d0 ONLINE 0 0 4
3743539469189005045 UNAVAIL 0 0 0
c0t5000C500A243C8DEd0 ONLINE 0 0 4
logs
mirror-1 ONLINE 0 0 0
c0t5F8DB4C095690612d0s0 ONLINE 0 0 0
c0t5F8DB4C095691282d0s0 ONLINE 0 0 0
zpool clear 将清除校验和,但不会使池可用。我之前见过类似的行为,导出池并重新导入它可以解决问题。这次情况并非如此。这次,系统拒绝导入池。我可以使用 -F 导入它,但这使它回到相同的不可用状态。
一件奇怪的事情......如果你看上面的输出,有一个名为“3743539469189005045”的设备 - 我不知道这是什么或者为什么它会与池相关联。此处应列出的实际设备是“c0t5000C500A22D9330d0”,该设备可用且可以直接读取。
忽略这一点,我想,这是一个 raidz1 池,所以我应该能够使用 3 个“在线”驱动器导入它。仍然没有。因此,在尝试了我能想到的所有方法后,我运行了以下命令:
zpool导入-FX pool_01
我不确定我从哪里得到“-X”……它在我的笔记中,但我在手册页中找不到任何对它的引用。而且,Google 也没有多大帮助,因为现在每次关于 ZFS 的搜索启动 Linux 或 FreeBSD 而不是 Solaris。
该池由 4 个 6TB 驱动器组成。因此,如果必须扫描每个块,它应该尝试导入其中三个驱动器以获得总共 18TB 的数据。
导入已运行 14 天。它不会产生任何错误,我可以看到每个驱动器上的读/写活动。一般来说,iostat 看起来像这样:
extended device statistics
r/sw/s Mr/s Mw/s wait actv wsvc_t asvc_t %w %b device
210.3 70.1 6.7 0.1 0.0 0.2 0.0 0.6 0 15 c0t5000C500A232AFA6d0
338.5 129.2 8.1 0.1 0.0 0.4 0.0 0.8 0 28 c0t5000C500A24AD833d0
210.3 70.1 6.7 0.1 0.0 0.2 0.0 0.6 0 13 c0t5000C500A243C8DEd0
一个驱动器始终比其他两个驱动器繁忙,但所有统计数据每秒都在变化,这让我相信它正在做某事。
如果我尝试 truss 导入 PID,truss 就会挂起。 zpool-pool_01 进程每秒都会重新生成,并且显然没有做任何事情,因为它死得太快,甚至无法获得跟踪,而且我不知道 PID 是什么。
我现在的问题是,-X 选项在 Solaris 上有什么作用?在我使用它之前,导入要么立即失败,要么以 UNAVAIL 状态导入。现在,导入无限期地运行。如果它确实在做某事并且有可能成功导入,我不介意让它运行。
我可以阻止它而不造成更多伤害吗?还有其他方法可以让这个池上线吗?我仍然对具有 3 个可用磁盘的 4 磁盘池如何无法上线感到困惑。
有没有办法将 3743539469189005045 设备重新映射到实际设备 (c0t5000C500A22D9330d0),这会帮助池自行纠正吗?
系统是Solaris x64 11.4.27.0.1.82.1。我知道这里可能不再有很多特定于 Solaris 的经验,但我希望 ZFS 及其历史的丰富知识可能足以让你们中的一些人帮助我。
我真的需要一些帮助。该阵列上有大量数据,由于我自己的失误,没有进行备份。关键数据曾经是关键数据,但丢失如此多的非关键数据仍然会令人痛苦。 18TB 的备份量很大,但从备份的角度来看,我的资源有限。无论如何,那里吸取了教训。
任何帮助将不胜感激。
- -更新 - -
我重新启动了系统,因为我无法停止 zpool 导入(我猜是 I/O 锁定)。当我尝试一个简单的 zpool 极点(即 zpool 导入而不指定池名称)时,我得到:
pool: pool_01
id: 346760273105473837
state: UNAVAIL
status: One or more devices are unavailable. action: The pool cannot be imported due to unavailable devices or data. The pool may be active on another system, but can be imported using the '-f' flag. config:
pool_01 UNAVAIL incorrect labeling data
raidz1-0 DEGRADED
c0t5000C500A24AD833d0 ONLINE
c0t5000C500A232AFA6d0 ONLINE
c0t5000C500A24AD833d0 UNAVAIL incorrect labeling data
c0t5000C500A243C8DEd0 ONLINE
logs
mirror-1 ONLINE
c0t5F8DB4C095690612d0s0 ONLINE
c0t5F8DB4C095691282d0s0 ONLINE
device details:
c0t5000C500A24AD833d0 UNAVAIL incorrect labeling data
status: ZFS detected errors on this device.
The device has bad label or disk contents.
请注意 c0t5000C500A24AD833d0 如何显示两次 - 一次显示为“在线”,另一次显示为“不可用”。此外,应该在该列表中的另一个驱动器 (c0t5000C500A22D9330d0) 根本没有列出。
format 命令显示应属于池的所有 4 个驱动器:
16. c0t5000C500A22D9330d0 <ATA-ST6000VN0041-2EL-SC61-5.46TB>
/scsi_vhci/disk@g5000c500a22d9330
17. c0t5000C500A24AD833d0 <ATA-ST6000VN0041-2EL-SC61-5.46TB>
/scsi_vhci/disk@g5000c500a24ad833
18. c0t5000C500A232AFA6d0 <ATA-ST6000VN0041-2EL-SC61-5.46TB>
/scsi_vhci/disk@g5000c500a232afa6
19. c0t5000C500A243C8DEd0 <ATA-ST6000VN0041-2EL-SC61-5.46TB>
/scsi_vhci/disk@g5000c500a243c8de
对它们中的每一个进行“格式验证”都不会返回错误。每个驱动器的“格式验证”输出如下所示:
Volume name = < >
ascii name = <ATA-ST6000VN0041-2EL-SC61-5.46TB>
bytes/sector = 512 sectors = 11721045167
accessible sectors = 11721045134
Part Tag Flag First Sector Size Last Sector
0 usr wm 256 5.46TB 11721028750
1 unassigned wm 0 0 0
2 unassigned wm 0 0 0
3 unassigned wm 0 0 0
4 unassigned wm 0 0 0
5 unassigned wm 0 0 0
6 unassigned wm 0 0 0
8 reserved wm 11721028751 8.00MB 11721045134
fmadm 显示没有故障。
尝试使用 -f、-F、readonly=on 以及这些选项的各种组合进行导入都会失败。大多数失败:无法导入“pool_01”:一个或多个设备当前不可用
不带任何选项的导入尝试(即 zpool import pool_01)会返回以下错误:
cannot import 'pool_01': I/O error Destroy and re-create the pool from a backup source.
如果我删除 D833 驱动器并进行导入,它会返回以下内容:
pool: pool_01
id: 346760273105473837
state: UNAVAIL
status: One or more devices are unavailable. action: The pool cannot be imported due to unavailable devices or data. config:
pool_01 UNAVAIL insufficient replicas
raidz1-0 UNAVAIL insufficient replicas
c0t5000C500A22D9330d0 UNAVAIL incorrect labeling data
c0t5000C500A232AFA6d0 ONLINE
c0t5000C500A24AD833d0 REMOVED
c0t5000C500A243C8DEd0 ONLINE
logs
mirror-1 ONLINE
c0t5F8DB4C095690612d0s0 ONLINE
c0t5F8DB4C095691282d0s0 ONLINE
device details:
c0t5000C500A22D9330d0 UNAVAIL incorrect labeling data
status: ZFS detected errors on this device.
The device has bad label or disk contents.
请注意,两个驱动器都正确显示了各自的设备标识符。
如果我重新插入 D833 驱动器并删除 9330 驱动器,它会显示: pool: pool_01 id: 346760273105473837 state: UNAVAIL status: 一个或多个设备不可用。操作:由于设备或数据不可用,无法导入池。该池可能在另一个系统上处于活动状态,但可以使用“-f”标志导入。配置:
pool_01 UNAVAIL incorrect labeling data
raidz1-0 DEGRADED
c0t5000C500A24AD833d0 ONLINE
c0t5000C500A232AFA6d0 ONLINE
c0t5000C500A24AD833d0 UNAVAIL incorrect labeling data
c0t5000C500A243C8DEd0 ONLINE
logs
mirror-1 ONLINE
c0t5F8DB4C095690612d0s0 ONLINE
c0t5F8DB4C095691282d0s0 ONLINE
设备详细信息:
c0t5000C500A24AD833d0 UNAVAIL incorrect labeling data
status: ZFS detected errors on this device.
The device has bad label or disk contents.
请注意,这里再次显示不正确的设备 ID。我不确定删除 D833 会导致所有设备报告其正确名称,但安装它会导致它和 9330 之间产生混淆,这一事实如何解释。
如果我将它们都删除,则会显示:
pool: pool_01
id: 346760273105473837
state: UNAVAIL
status: One or more devices are unavailable. action: The pool cannot be imported due to unavailable devices or data. The pool may be active on another system, but can be imported using the '-f' flag. config:
pool_01 UNAVAIL incorrect labeling data
raidz1-0 DEGRADED
c0t5000C500A22D9330d0 REMOVED
c0t5000C500A232AFA6d0 ONLINE
c0t5000C500A24AD833d0 REMOVED
c0t5000C500A243C8DEd0 ONLINE
logs
mirror-1 ONLINE
c0t5F8DB4C095690612d0s0 ONLINE
c0t5F8DB4C095691282d0s0 ONLINE
据我所知,所有磁盘都可以完美运行。某处似乎是 ZFS 标签问题。至少这是我的猜测,因为“格式验证”没有报告任何磁盘级标签问题。
就好像 zpool 元数据弄乱了,它将两个不同的设备(c0t5000C500A24AD833d0 和 c0t5000C500A22D9330d0)识别为同一设备(c0t5000C500A24AD833d0),即使系统清楚地将它们视为两个单独的设备。
有没有办法修复 zpool 元数据?我尝试了 zdb,但由于无法打开池,它只是退出: zdb: can't open pool 'pool_01': I/O error
--- 更新 2 ---
我在周末进行了更深入的研究,并比较了每个驱动器的 zpool 标签。
我用过(例如):
zdb -ll /dev/dsk/c0t5000C500A24AD833d0s0
请注意,在 Solaris 上,您在查看 zpool 标签时必须指定 slice-0 (d0s0),如果您只指定设备(即 ...d0 与 ...d0s0),它会告诉您它不能“拆开标签”
我的发现有点出乎我的意料。除一个标签外,所有标签都是一致的,但不一致的标签位于未注册任何投诉的驱动器之一上 - 驱动器 c0t5000C500A232AFA6d0。该驱动器始终报告“在线”。因此,我突发奇想,从阵列中删除了该驱动器,并以 DEGRADED 状态导入了池。我用“zpool import -R /mnt/x -o readonly=on -f pool_01”导入它,这看起来很有希望,但这些希望很快就破灭了。当我尝试从阵列中读取文件、快照等时,几乎所有内容都返回“/path/to/my/file: I/O error”,并且阵列上的 CKSUM 数字开始飙升。
现在的泳池是这样的……
pool: pool_01
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.
Run 'zpool status -v' to see device specific details.
see: http://support.oracle.com/msg/ZFS-8000-8A
scan: resilvered 0 in 2m16s with 1 errors on Fri Feb 16 06:32:18 2024
config:
NAME STATE READ WRITE CKSUM
pool_01 DEGRADED 0 0 59K
raidz1-0 DEGRADED 0 0 118K
c0t5000C500A24AD833d0 DEGRADED 0 0 128K
c0t5000C500A22D9330d0 DEGRADED 0 0 118K
3743539469189005045 UNAVAIL 0 0 0
c0t5000C500A243C8DEd0 DEGRADED 0 0 116K
logs
mirror-1 ONLINE 0 0 0
c0t5F8DB4C095690612d0s0 ONLINE 0 0 0
c0t5F8DB4C095691282d0s0 ONLINE 0 0 0
errors: 32790 data errors, use '-v' for a list
这有点令人沮丧,因为我一直非常关注报告 UNAVAIL 或 REMOVED 的驱动器,结果发现导致导入失败的驱动器是没有显示错误或投诉的驱动器之一。
我现在的问题是,损坏的数据是使用“import -FX”并让它运行两周的结果吗? IE。当我运行 -X 时,我是否认为我没有其他选择而搬起石头砸自己的脚?或者它不会损坏数据,问题出在驱动器本身......即使它们没有报告硬件级错误?而且......如果它是-X 的结果,有什么方法可以从中恢复吗?