서버의 모든 디스크에서 smartctl 실행

서버의 모든 디스크에서 smartctl 실행

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
smartctlsmartctl


편집 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

관련 정보