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

我在一个ZPool中有6个磁盘的SuperMicro 2U服务器上运行。 我想用FreeBSD中的一个工具运行命令来识别每个驱动器托架。 有没有办法做到这一点?

我知道如果驱动器在RAID卡上运行,我可以使用RAID卡实用程序来识别每个磁盘,但在我的情况下,没有硬件RAID。

有没有在FreeBSD或Linux中执行此操作的工具?

对于我的大多数ZFS解决scheme,最好打赌,我有一张表和一组通过其部分SAS WWN标识驱动器的标签。 这是我使用的LSI控制器的function,其内容如下所示:

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和集成商使用。 它利用外部JBOD单元中的SCSI机箱服务(SES)function,但对于内部磁盘也有一些魔力。

您也可以根据您使用的控制器select一个选项。 您是仅使用主板控制器还是专用的非RAID SAS HBA?

穷人识别磁盘的方法是发出一个dd if=/dev/daX of=/dev/null ,看看哪个磁盘的活动LED闪烁最快。 这当然需要系统中其他磁盘的活动时间较短,但是非常通用。

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

我知道这是一个古老的问题,但它给了我几件我放在一起,我认为我会拍摄我想出的剧本,因为这是一个几乎完全匹配我的情况:它需要sas2ircu : http : //www.avagotech.com/docs-and-downloads/host-bus-adapters/host-bus-adapters-common-files/sas_sata_6g_p20/SAS2IRCU_P20.zip并从端口,bash和sg3_utils

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

它将检查选定的池(通过zpool状态)。 如果没有错误,它会:

  • 使用设备名称到机箱插槽的映射来保存文件(位于/root/.sas2ircu/drives)
  • closures以前由这个脚本激活的任何LED(这存储在/root/.sas2ircu/locs)

如果有错误,它会:

  • 发送完整的zpool状态输出的电子邮件
  • 激活任何发生故障的驱动器的LED(并将位置激活到/root/.sas2ircu locs中,以便稍后停用)

无论如何这里是脚本。 我把它作为一个小时工作。

 #! /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 

我不知道FreeBSD,但是在Linux中,有一个名为ledmon(8)http://sourceforge.net/projects/ledmon/ )的软件集合,我使用的用户空间程序ledctl(8)我的SuperMicro SC847E26-RJBOD1中具有由LSI SAS3008 HBA(而非MegaRAID)控制驱动器的特定驱动器上的“定位”指示灯:

$ sudo letctl locate = / dev / sdce

然后,一旦我find它,我关掉了“定位”LED:

$ sudo letctl locate_off = / dev / sdce

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

没有标准化的抽象软件界面来照亮驱动器载体LED(不是活动LED) – 这是高度依赖于硬件的。 这意味着您仍然需要存储控制器工具(您正在使用的RAID卡实用程序)将相应的命令发送到控制器。 如何调用或实现此软件当然取决于存储控制器的制造商/供应商。

(没有关系,你有SW袭击,因为你显然仍然需要一个存储控制器与你的背板,球童和驱动器谈话。)

如果你用廉价的控制器来使用企业级的驱动器,那么你可能会倒霉。