Tim*_*inn 8 freebsd zfs storage supermicro
我在 ZPool 中有 6 个磁盘的 SuperMicro 2U 服务器上运行。我想通过从 FreeBSD 中的工具运行命令来使用驱动器托架 LED 识别每个驱动器托架。有没有办法做到这一点?
我知道如果驱动器在 Raid 卡上运行,我可以使用 raid 卡实用程序来识别每个磁盘,但在我的情况下,没有硬件 raid。
在 FreeBSD 或 Linux 中是否有工具可以做到这一点?
我知道这是一个老问题,但它给了我一些我放在一起的部分,我想我会回击我想出的脚本,因为这几乎与我的情况完全匹配:它需要 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 status)。如果没有错误,它将:
如果有错误,它将:
无论如何这里是脚本。我将它作为每小时的 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
Run Code Online (Sandbox Code Playgroud)
小智 5
我知道这是一个老问题,但是对于搜索此问题的搜索者来说,在 FreeBSD >= 10.3 上,您可以使用sesutil locate da2 on打开 da2 的 LED,前提是它位于提供 /dev/sesN 设备的外壳中。
对于我的大多数 ZFS 解决方案,您最好相信我有一个表和一组标签,通过驱动器的部分SAS WWN来识别驱动器。这是我使用的 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
Run Code Online (Sandbox Code Playgroud)

有几个选项可以使其发挥作用。其中之一是商业SanTools SMARTmon 实用程序,可供 OEM 和集成商使用。它利用外部 JBOD 单元中的SCSI 存储服务 (SES)功能,但对内部磁盘也有一些魔力。
您可能还可以根据您使用的控制器进行选择。您只是使用主板控制器还是专用的非 RAID SAS HBA?
| 归档时间: |
|
| 查看次数: |
23471 次 |
| 最近记录: |