Tôi biết đây là một câu hỏi cũ, nhưng nó đã cho tôi một vài câu tôi ghép lại và tôi nghĩ tôi sẽ quay lại kịch bản mà tôi đã đưa ra, vì đây là một kết hợp gần như chính xác với tình huống của tôi: nó yêu cầu sas2ircu : http://www.avagotech.com/docs-and-d
Downloads
Nó thực hiện một vài giả định, tôi nghĩ rằng cái chính là nó được gắn vào bộ điều khiển 0. bạn có thể sử dụng sas2ircu list
để xác định số bộ điều khiển của mình.
Nó sẽ kiểm tra nhóm đã chọn (thông qua trạng thái zpool). Nếu không có lỗi, nó sẽ:
- lưu tệp (tại /root/.sas2ircu/drive) với ánh xạ tên thiết bị vào các khe cắm
- tắt bất kỳ đèn led nào được kích hoạt trước đó bởi tập lệnh này (cái này được lưu trong /root/.sas2ircu/locs)
Nếu có lỗi, nó sẽ:
- gửi email với đầu ra đầy đủ của trạng thái zpool
- kích hoạt đèn led của bất kỳ ổ đĩa bị lỗi nào (và lưu trữ các vị trí được kích hoạt trong các vị trí /root/.sas2ircu để sau đó chúng có thể bị vô hiệu hóa)
dù sao đây là kịch bản. Tôi điều hành nó như một công việc định kỳ hàng giờ.
#! /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
/dev/sdX
kiểu. Không có ý tưởng, nếu FreeBSD có một cái gì đó tương tự.