서버의 모든 디스크에서 smartctl을 실행하십시오.

서버의 모든 디스크에서 smartctl을 실행하십시오.

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

3피스 컨트롤러

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 컨트롤러 포함/미포함)에 따라 모든 디스크를 스캔하고 명령을 실행합니다 . Destructive 명령을 실행하도록 선택하면 스크립트에서 이 작업을 수행할 디스크 번호를 묻습니다.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

관련 정보