更换 ZFS 池中出现故障的磁盘

更换 ZFS 池中出现故障的磁盘

我有一个很大的 ZFS 磁盘池; 3 个嵌套 RAIDZ2 vdev。

我正在为同事记录更换故障磁盘的过程,因此通过从主机中删除磁盘来模拟磁盘故障。

果然,该磁盘所属的vdev降级,磁盘不可用。

我像这样使磁盘脱机...

zpool offline diskpool sdo

快速的“zpool 状态”显示磁盘处于脱机状态...到目前为止一切顺利。

我更换了磁盘并确认在我的 SATA 控制器上检测到了新磁盘,确实如此。然后我试图让linux重新扫描scsi总线来检测磁盘。这是我的第一个问题出现的地方。

据我所知,以下命令用于找到正确的主机总线以重新扫描...

grep mpt /sys/class/scsi_host/host?/proc_name

然而在我的 Centos 7.2 系统上,这个命令没有输出。它没有错误,它只是给我空输出并等待我的下一个命令。

我使用了几张专用卡,可以连接许多SATA 设备。我通常会重新扫描公交车

echo "- - -" > /sys/class/scsi_host/hostX/scan

其中 hostX 是正确的主机总线,但由于我找不到主机总线,因此无法完成此步骤。

有没有其他方法可以获取此信息,或者 Centos 7.2 中的命令是否已更改或其他?

此外,我选择重新启动机器以继续测试。重新启动后,ZFS 池未附加。我必须使用“zpool import diskpool”手动导入它。效果很好,但奇怪的是,一旦导入,如果我执行“zpool status”,我将不再看到像之前那样显示的设备 ID...

 raidz2-2                            ONLINE       0     0     0
        /dev/sdd                     ONLINE       0     0     0
        /dev/sde                     ONLINE       0     0     0
        /dev/sdf                     ONLINE       0     0     0
        /dev/sdg                     ONLINE       0     0     0

相反,它似乎有驱动器序列号......

      raidz2-2                            ONLINE       0     0     0
        ata-ST8000AS0002-1NA17Z_Z840DG66  ONLINE       0     0     0
        ata-ST8000AS0002-1NA17Z_Z840DVE0  ONLINE       0     0     0
        ata-ST8000AS0002-1NA17Z_Z840CQFB  ONLINE       0     0     0
        ata-ST8000AS0002-1NA17Z_Z840DP2V  ONLINE       0     0     0

这将在将来引起问题,就像另一个磁盘出现故障一样,我将很难确定要更换的正确磁盘。

有没有办法可以将其切换回来,以便再次显示设备 ID?

提前致谢!

答案1

ZFS 不是通过文件系统中的名称来检测磁盘,而是通过写入磁盘上的 UUID(或者至少是类似的东西 — 不能 100% 确定它实际上是 UUID)来检测磁盘。运行时zpool import,会枚举磁盘,ZFS 会重建所有池,然后在输出中使用设备名称(实际上不包含任何目录 IME,通常类似于sda而不是/dev/sdazpool status。因此,如果您移动驱动器(或者如果核心移动驱动器(这可能发生在现代硬件上的现代内核中),zpool 仍将按照与以前相同的顺序检测磁盘;最先出现在输出中的磁盘将再次出现在最先出现在输出中的磁盘,即使内核不再在该输出中枚举它们。

这里发生的事情可能是由于原始版本zpool import不起作用,内核可以完成启动,udev做了很多工作,然后当您执行手册时zpool import,所有磁盘的默认枚举结果首先是基于序列号的,而不是sdX基于 的。最有可能的是,下次重新启动计算机时,使用的名称将恢复为该sdX方案。

幸运的是,将名称从一种命名方案解析为另一种命名方案相当简单:

wouter@gangtai:/dev/disk/by-id$ ls -l
total 0
lrwxrwxrwx. 1 root root  9 Mar 31 18:15 ata-SAMSUNG_MZ7TE256HMHP-00004_S1RKNSAFC04685 -> ../../sda
lrwxrwxrwx. 1 root root 10 Mar 31 18:15 ata-SAMSUNG_MZ7TE256HMHP-00004_S1RKNSAFC04685-part1 -> ../../sda1
lrwxrwxrwx. 1 root root  9 Mar 31 18:15 wwn-0x50025388a089e89c -> ../../sda
lrwxrwxrwx. 1 root root 10 Mar 31 18:15 wwn-0x50025388a089e89c-part1 -> ../../sda1

有多种命名方案(by-idby-uuidby-path),所有这些都可以在 下找到/dev/disk

说了这么多,我必须说我不同意你的说法,即通过查看名称更容易找出哪个磁盘是哪个磁盘sdX。现代内核不再为特定设备分配静态设备名称;这就是为什么现代发行版使用基于 UUID 的fstab文件,而不是sdX基于 的文件。序列号实际上是一个远的更可靠的方法来确定哪个磁盘损坏;毕竟是这样写的在实际磁盘上,与名称相反sdX,不同的启动可能会有所不同(我实际上在具有 16 个硬盘的 ZFS 机器上遇到过这种情况)。任何一种其他方法(by-uuidby-id,特别是by-path在企业级多磁盘机箱中)是很多比那更可靠。

相关内容