识别运行 FreeBSD 的 SuperMicro 服务器上的磁盘

识别运行 FreeBSD 的 SuperMicro 服务器上的磁盘

我在 SuperMicro 2U 服务器上运行,该服务器在 ZPool 中有 6 个磁盘。我想通过运行 FreeBSD 中某个工具的命令,使用驱动器托架 LED 来识别每个驱动器托架。有办法吗?

我知道如果驱动器在 Raid 卡上运行,我可以使用 raid 卡实用程序来识别每个磁盘,但就我而言,没有硬件 raid。

在 FreeBSD 或 Linux 中是否有可以执行此操作的工具?

答案1

对于我的大多数 ZFS 解决方案,你最好打赌我有一个表和一组标签,通过它们的部分SAS 全球网络号这是我使用的LSI控制器的一个功能,其内容如下:

    NAME                        STATE     READ WRITE CKSUM
    vol1                        ONLINE       0     0     0
      mirror-0                  ONLINE       0     0     0
        c10t50000393482B340Cd0  ONLINE       0     0     0
        c10t50000393482B4CF0d0  ONLINE       0     0     0
      mirror-1                  ONLINE       0     0     0
        c10t50000393482B4DB4d0  ONLINE       0     0     0
        c10t50000393482BAB48d0  ONLINE       0     0     0
      mirror-2                  ONLINE       0     0     0
        c10t50000393482BDA68d0  ONLINE       0     0     0
        c10t500003935803910Cd0  ONLINE       0     0     0

在此处输入图片描述

有几个方法可以实现这一点。一个是商业SanTools SMARTmon 实用程序适用于 OEM 和集成商。它利用SCSI 外壳服务 (SES)具有外部 JBOD 单元的功能,但对于内部磁盘也有一些魔力。

根据您使用的控制器,您可能还会有一个选项。您只是使用主板控制器还是专用的非 RAID SAS HBA?

答案2

穷人识别磁盘的方法是发出一个命令,dd if=/dev/daX of=/dev/null然后查看哪个磁盘的活动 LED 闪烁得最快。这当然需要系统中其他磁盘处于低活动状态,但非常通用。

如果你有一个 (LSI) SAS 控制器,可以与sas2ircu然后您可以使用它来发出“display”命令来列出可用的驱动器及其序列号,然后运行“LOCATE”命令来使外壳上的灯闪烁。

答案3

我知道这是一个老问题,但是它给了我一些我拼凑起来的碎片,我想我会反驳我想出的脚本,因为这几乎与我的情况完全匹配:它需要 sas2ircu:http://www.avagotech.com/docs-and-downloads/host-bus-adapters/host-bus-adapters-common-files/sas_sata_6g_p20/SAS2IRCU_P20.zip 以及来自 ports、bash 和 sg3_utils

它确实做了一些假设,我认为主要的假设是它连接到控制器 0。您可以用它sas2ircu list来识别您的控制器编号。

它将检查所选池(通过 zpool status)。如果没有错误,它将:

  • 保存一个文件(位于 /root/.sas2ircu/drives),其中包含设备名称到机箱插槽的映射
  • 关闭此脚本先前激活的所有 LED(存储在 /root/.sas2ircu/locs 中)

如果有错误它将:

  • 发送包含 zpool status 完整输出的电子邮件
  • 激活任何故障驱动器的 LED(并将激活位置存储在 /root/.sas2ircu locs 中,以便以后可以停用它们)

无论如何,这是脚本。我将其作为每小时的 cron 作业运行。

#! /usr/local/bin/bash
if [ ! "$1" ]; then
  echo "Usage: zpscan.sh pool [email]"
  echo "Scan a pool, send email notification and activate leds of failed drives"
  exit
fi
if [ ! -d /root/.sas2ircu ]; then
  mkdir /root/.sas2ircu
  touch /root/.sas2ircu/drives
  touch /root/.sas2ircu/locs
fi
if [ "$2" ]; then
  email="$2"
else
  email="root"
fi
condition=$(/sbin/zpool status $1 | egrep -i '(DEGRADED|FAULTED|OFFLINE|UNAVAIL|REMOVED|FAIL|DESTROYED|corrupt|cannot|unrecover)')
if [ "${condition}" ]; then
  emailSubject="`hostname` - ZFS pool - HEALTH fault"
  mailbody=$(zpool status $1)
  echo "Sending email notification of degraded zpool $1"
  echo "$mailbody" | mail -s "Degraded Zpool $1 on hostname" $email
  drivelist=$(zpool status $1 | grep -E "(DEGRADED|FAULTED|OFFLINE|UNAVAIL|REMOVED|FAIL|DESTROYED)" | grep -vE "^\W+($1|NAME|mirror|logs|spares)" | sed -E $'s/.*was \/dev\/([0-9a-z]+)/\\1/;s/^[\t  ]+([0-9a-z]+)[\t ]+.*$/\\1/')
  echo "Locating failed drives."
  for drive in $drivelist;
  do
  record=$(grep -E "^$drive" /root/.sas2ircu/drives)
  location=$(echo $record | cut -f 3 -d " ")
  echo Locating: $record
  sas2ircu 0 locate $location ON
  if [ ! "$(egrep $location /root/.sas2ircu/locs)" ]; then
  echo $location >> /root/.sas2ircu/locs
  fi
  done
else
  echo "Saving drive list."
  drivelist=$(zpool status $1 | grep -E $'^\t  ' | grep -vE "^\W+($1|NAME|mirror|logs|spares)" | sed -E $'s/^[\t ]+//;s/([a-z0-9]+).*/\\1/')
  saslist=$(sas2ircu 0 display)
  printf "" > /root/.sas2ircu/drives
  for drive in $drivelist;
  do
  sasaddr=$(sg_vpd -i -q $drive 2>/dev/null | sed -E '2!d;s/,.*//;s/  0x//;s/([0-9a-f]{7})([0-9a-f])([0-9a-f]{4})([0-9a-f]{4})/\1-\2-\3-\4/')
  encaddr=$(echo "$saslist" | grep $sasaddr -B 2 | sed -E 'N;s/^.*: ([0-9]+)\n.*: ([0-9]+)/\1:\2/')
  echo $drive $sasaddr $encaddr >> /root/.sas2ircu/drives
  done

  for loc in $(cat /root/.sas2ircu/locs);
  do
  sas2ircu 0 locate $loc OFF
  done
  printf "" > /root/.sas2ircu/locs
fi

  for loc in $(cat /root/.sas2ircu/locs);
  do
  sas2ircu 0 locate $loc OFF
  done
  printf "" > /root/.sas2ircu/locs
fi

答案4

我不知道 FreeBSD 的情况,但在 Linux 中,有一组来自英特尔的软件叫做ledmon(8)并且我已经使用用户空间程序ledctl(8)来闪烁 SuperMicro SC847E26-RJBOD1 中某个驱动器上的“定位”LED,该驱动器由 LSI SAS3008 HBA(不是 MegaRAID)控制:

$ sudo ledctl locate=/dev/sdce

然后,一旦我找到它,我就关闭“定位”LED:

$ sudo ledctl locate_off=/dev/sdce

sgpio(1)是 HBA 和背板之间通信所必需的。

相关内容