
smartctl -i -A
내 질문은 매우 간단합니다. 서버에 있는 모든 디스크에서 명령을 실행하고 싶습니다 . 디스크와 RAID 컨트롤러 수가 다른 서버가 너무 많다고 생각하면 진단을 위해 모든 드라이버를 스캔해야 합니다. 을(를) 실행할 생각 smartctl --scan | awk '{print $1}' >> test.log
이므로 test.log를 열면 그 안에 모든 드라이브 정보가 있을 것입니다.
그런 다음 모든 드라이버를 스캔하기 위해 일부 if 또는 구성을 실행해야 합니다 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
3ware 컨트롤러
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…
굽기(스트레스 테스트(데이터 파괴)):
/opt/systems/bin/vs-burnin --destructive --time=<hours> /tmp/burninlog.txt
메시지(&K) 오류:
tail /var/log/kernerrors
dmesg |grep –i –E “”ata”|”fault”|”error”
그래서 제가 하려는 것은 이러한 명령을 자동화하는 것입니다. 스크립트가 호스트에 있는 모든 디스크를 확인하고 사례에
적합한 명령을 실행하기를 원합니다 . 실행하려는 경우 선택할 수 있는 몇 가지 옵션이 있는 메뉴와 같은 것 또는 일부 파괴적인 명령을 실행하도록 선택하면 스크립트를 실행하도록 선택하면 호스트 구성(RAID 컨트롤러 포함/없음)에 따라 명령이 실행됩니다. 파괴적인 명령을 실행하기로 선택하면 스크립트는 이 작업을 수행하려는 디스크 번호를 입력하라는 메시지를 표시합니다.smartctl
smartctl
smartctl
편집 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