我的问题非常简单,我想smartctl -i -A
在服务器拥有的所有磁盘上运行该命令。认为我有太多具有不同数量的磁盘和 RAID 控制器的服务器,那么我需要扫描所有驱动程序进行诊断。我正在考虑运行smartctl --scan | awk '{print $1}' >> test.log
,所以如果我打开 test.log,我将在其中包含所有驱动器信息。
之后,我需要运行一些 if 或 do 结构来扫描smartctl
所有驱动程序。我不知道这是否是最好的方法,因为我也需要识别 RAID 控制器。正朝着正确的方向前进吗?
编辑:
我习惯使用这些命令来排除故障:
不带 RAID 控制器
for i in {c..d}; do
echo "Disk sd$i" $SN $MD
smartctl -i -A /dev/sd$i |grep -E "^ "5"|^"197"|^"198"|"FAILING_NOW"|"SERIAL""
done
PERC控制器
for i in {0..12}; do
echo "$i" $SN $MD
smartctl -i -A -T permissive /dev/sda -d megaraid,$i |grep -E "^ "5"|^"197"|^"198"|"FAILING_NOW"|"SERIAL""
done
/usr/sbin/megastatus –physical
/usr/sbin/megastatus --logical
三件控制器
for i in {0..10}; do
echo "Disk $i" $SN $MD
smartctl -i -A /dev/twa0 -d 3ware,$i |grep -E "^ "5"|^"197"|^"198"|"FAILING_NOW"|"SERIAL""
done
SmartArray 和 Megaraid 控制器:
smartctl –a –d cciss,0 /dev/cciss/c0d0
/opt/3ware/9500/tw_cli show
cd /tmp
DD(重写磁盘块(销毁数据)):
dd if=/dev/zero of=/dev/HD* bs=4M
HD*: sda, sdb…
烧录(压力测试(DESTROY DATA)):
/opt/systems/bin/vs-burnin --destructive --time=<hours> /tmp/burninlog.txt
Dmesg&kernerrors:
tail /var/log/kernerrors
dmesg |grep –i –E “”ata”|”fault”|”error”
所以我想做的就是自动化这些命令。
我希望脚本验证主机拥有的所有磁盘并smartctl
针对该情况运行适当的命令。
类似带有一些选项的菜单,让我选择是否要运行一个smartctl
或一些破坏性命令,如果我选择运行smartctl
脚本将扫描所有磁盘并根据主机配置运行命令(带/不带 RAID 控制器),
如果我选择运行破坏性命令,脚本会要求我输入要执行此操作的磁盘号。
编辑2:
我用以下脚本解决了我的问题:
#!/bin/bash
# Troubleshoot.sh
# A more elaborate version of Troubleshoot.sh.
SUCCESS=0
E_DB=99 # Error code for missing entry.
declare -A address
# -A option declares associative array.
if [ -f Troubleshoot.log ]
then
rm Troubleshoot.log
fi
if [ -f HDs.log ]
then
rm HDs.log
fi
smartctl --scan | awk '{print $1}' >> HDs.log
lspci | grep -i raid >> HDs.log
getArray ()
{
i=0
while read line # Read a line
do
array[i]=$line # Put it into the array
i=$(($i + 1))
done < $1
}
getArray "HDs.log"
for e in "${array[@]}"
do
if [[ $e =~ /dev/sd* || $e =~ /dev/hd* ]]
then
echo "smartctl -i -A $e" >> Troubleshoot.log
smartctl -i -A $e >> Troubleshoot.log # Run smartctl into all disks that the host have
fi
done
exit $? # In this case, exit code = 99, since that is function return.
我不知道这个解决方案是正确的还是最好的,但对我有用!
感谢所有帮助!
答案1
所以我想做的就是自动化这些命令。
这已经存在并体现在smartd
.
您通常需要在中配置您想要的行为
/etc/smartd.conf
例子:
# DEVICESCAN: tells smartd to scan for all ATA and SCSI devices
# Alternative setting to report more useful raw temperature in syslog.
DEVICESCAN -I 194 -I 231 -I 9
您也可以明确地放置磁盘,例如
/dev/sdc -d 3ware,0 -a -s L/../../7/01
如果smartd
发现错误,您将收到一封电子邮件:
/dev/hdc -a -I 194 -W 4,45,55 -R 5 -m [email protected]
还有许多其他选项和开关,您需要阅读 的联机帮助页smartd.conf
。
答案2
@xeruf。我在自己的工作中时不时地遇到这个问题,并且我一直不得不重做我的工作,哈哈。为了让我和其他人可以找到基本的智能输出命令,我运行以下命令:
for i in $(ls /dev/sd?); do
echo "$i"
sudo smartctl -a $i
done