SSD SMART Data & Self-Tests

Få igång din maskinvara i Ubuntu
Kategoriregler
I detta forum diskuterar vi Ubunturelaterade hårdvarufrågor. För allmänna frågor om (fysisk) hårdvara se:
Hårdvara som Hårdvara
Användarvisningsbild
anth
Inlägg: 511
Blev medlem: 22 aug 2019, 15:35
OS: Ubuntu
Utgåva: 23.04 Lunar Lobster

SSD SMART Data & Self-Tests

Inlägg av anth »

Jag vill ta reda på hur mina diskar mår.
Jag har inte gjort detta förrut och vill veta om jag gör rätt.
(egentligen: om jag tolkar resultaten korrekt)

Jag har ett grafiskt verktyg installerat: Disks (GNOME Disk-utility)

Om jag öppnar Disks, väljer en disk, klickar på de tre punkterna uppe till höger, väljer SMART Data & Self-Tests..., får jag massor med data.

Jag kan komma åt samma data via terminalen:

Kod: Markera allt

$ sudo apt install smartmontools
$ sudo smartctl --info /dev/sda
$ sudo smartctl --test=short /dev/sda
$ sudo smartctl --all
Observera att den korta testen tar två minuter.

Finns det något annat sätt som man ska känna till?

Problemet är att jag inte vet hur jag ska tolka datan:
Om jag förstått rätt:
ID# och ATTRIBUTE NAME : detta kan skilja sig åt från hårddisk till hårddisk, det finns alltså ingen standard. Alltså ID#9 är alltid Power On Hours, men det är inte säkert att alla diskar har ID#9.
Värdena börjar normalt högt och sjunker när disken blir äldre.
VALUE är nuvarande värde.
WORST är sämsta värdet disken haft.
THRESH är så lågt värdet kan sjunka innan/när disken går sönder.

Inget av mina VALUE eller WORST är i närheten av THRESH, så min disk är i bra skick - har jag förstått rätt?

Kod: Markera allt

ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail  Always       -       0
  9 Power_On_Hours          0x0032   098   098   000    Old_age   Always       -       7091
 12 Power_Cycle_Count       0x0032   099   099   000    Old_age   Always       -       847
177 Wear_Leveling_Count     0x0013   099   099   000    Pre-fail  Always       -       5
179 Used_Rsvd_Blk_Cnt_Tot   0x0013   100   100   010    Pre-fail  Always       -       0
181 Program_Fail_Cnt_Total  0x0032   100   100   010    Old_age   Always       -       0
182 Erase_Fail_Count_Total  0x0032   100   100   010    Old_age   Always       -       0
183 Runtime_Bad_Block       0x0013   100   100   010    Pre-fail  Always       -       0
187 Uncorrectable_Error_Cnt 0x0032   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0032   073   058   000    Old_age   Always       -       27
195 ECC_Error_Rate          0x001a   200   200   000    Old_age   Always       -       0
199 CRC_Error_Count         0x003e   100   100   000    Old_age   Always       -       0
235 POR_Recovery_Count      0x0012   099   099   000    Old_age   Always       -       16
241 Total_LBAs_Written      0x0032   099   099   000    Old_age   Always       -       6356132785
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: SSD SMART Data & Self-Tests

Inlägg av Osprey »

Vad jag vet så är "smartctl" det absolut bästa verktyg som finns, för att hålla koll på diskarna utan att (nämnvärt) lasta ned någonting. Jag skrev en gång i tiden ett enkelt script som avkodar resultatet - ska se om jag hittar det.... :)

[EDIT]
anth skrev:VALUE är nuvarande värde.
WORST är sämsta värdet disken haft.
THRESH är så lågt värdet kan sjunka innan/när disken går sönder.
Disken går inte (nödvändigtvis) sönder bara för att du du nått THRESH. Men det är fara å färde och något måste fixas till omgående. THRESH står ju för "Threshold", eller alltså "Tröskel" och anger nivån för vad som kan vara acceptabelt. Under (eller över) den nivån, beroende på vad det handlar om, indikerar ett allvarligt fel. Och THRESH är alltså tröskelnivån för >>LARM<<....
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: SSD SMART Data & Self-Tests

Inlägg av Osprey »

När det gäller SSD så är nog risken för den typen av fel dessutom väldigt liten. Väldigt många (nästan alla) fel på en gammal HDD, berodde i slutändan på mekaniskt slitage och något sådant finns ju inte på en SSD.

Sedan så håller ju "smartctl" bra koll på "diskarna" ändå och upptäcker även när något inte funkar på grund av elektronikfel. Elektronikfel är dock mer av typen antingen/eller. Genom slitage kan en HDD gradvis bli sämre och sämre, för att till slut funka helt. En SSD är däremot mer av naturen att antingen funkar det, eller också inte (och det går oftast inte att spåra i förväg)....
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: SSD SMART Data & Self-Tests

Inlägg av Osprey »

Inom vissa projekt inom den militära delen av IT som jag jobbat inom, så har man använt Boundary Scan för kontroll av kretsar och diskar. Men civila datorer och diskar, har nog oftast inte stöd för detta....
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: SSD SMART Data & Self-Tests

Inlägg av Osprey »

Man kan väl uttrycka det som att allt mellan VALUE/WORST och THRESH är ok, men når du THRESH eller under det, så är det något du behöver kika på... :)
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: SSD SMART Data & Self-Tests

Inlägg av Osprey »

Här är det gamla scriptet jag hackade ihop en gång i tiden:

Kod: Markera allt

#! /bin/bash
#M
# This script analyzes the status of the currently mounted disks.
#
# To make it possible to get the most information, the system must have executed a scheduled selftest with smartd.
# For this something like the lines below have to be placed in "/etc/smartd.conf" and smartd must then be forced
# to reload the configuration with "killproc -HUP /usr/sbin/smartd"
#
#--------< Cut here >---------------------------------------------------------------------------------------------
##
##                           .--------------- Type of test   (S/L)
##                           |  .------------ Month of year  (1-12)
##                           |  |  .--------- Day of month   (1-31)
##                           |  |  | .------- Day of week    (1-7)
##                           |  |  | |  .---- Hour           (0-23)
##                           |  |  | |  |
##                           |  |  | |  | .--------------- Type of test 
##                           |  |  | |  | |  .------------ Month of year
##                           |  |  | |  | |  |  .--------- Day of month
##                           |  |  | |  | |  |  | .------- Day of week
##                           |  |  | |  | |  |  | |  .---- Hour
##                           |  |  | |  | |  |  | |  |
##                           v  v  v v  v v  v  v v  v
#DEVICESCAN -S on -o off -s (L/../../1/02|S/../.././03)
#--------< Cut here >---------------------------------------------------------------------------------------------
#
# Check thoroughly that ALL other DEVICESCAN directives in this file is commented away, smartd just reads the file
# until it finds an uncommented directive and then uses this.
#
# The DEVICESCAN directive above makes that smartd performs a long (L) selftest on the disks every night between
# sunday and monday at 2 am (02:00) and a short (S) selftest all other days at 3 am (03:00). The reason for 
# running the long test at 2 am and the short at 3 am is to make sure that the long test is ready before the 
# morning. The short test takes only a few minutes, while the long test may take about 3 hours.
#
#################################################################################################################
TRACE=false
export PATH=$PATH:/sbin:/usr/sbin
HOST=$(hostname)
DATE=$(date)
OUTPUT=false
TODAY=$(date +%e" "%b)
_TODAY=$(date +%b" "%e)
TD=$(echo $TODAY | sed 's/ //g')
CD=$(ls -l /var/log/messages | awk '{ print $7$6 }')
DayOfWeek=$(date +%u)
SCSI=$(ls /dev/sd[a-z][0-9] 2> /dev/null 2> /dev/null)
RAID=$(ls /dev/md*p[0-9] 2> /dev/null 2> /dev/null)
if [[ ! -z $SCSI ]]; then
	SCSIS=$(ls /dev/sd[a-z][0-9] | sed 's/[0-9]//g' | sort -u)
	if [[ ! -z $RAID ]]; then
		RAIDS=$(ls /dev/md*p[0-9] | sed 's/p[0-9]//g' | sort -u)
		MDISKS=$(mdadm -D /dev/md126 | grep active | grep [0-9] | awk '{ print $7 }' | sed 's/[0-9]//g')
		DISKS=$SCSIS" "$MDISKS
	else
		DISKS=$SCSIS
	fi
else
	RAIDS=$(ls /dev/md*p[0-9] | sed 's/p[0-9]//g' | sort -u)
	DISKS=$(mdadm -D /dev/md126 | grep active | grep [0-9] | awk '{ print $7 }' | sed 's/[0-9]//g')
fi
if [[ -z $DISKS ]]; then
	echo " ERROR!! No disks found"
	exit
fi
TEST="Normal"
SMARTD=$(ps -ef | grep smartd | grep -v grep | awk '{ print $2 }')
for DISK in $DISKS; do
	LINDISK=$(/sbin/fdisk -l 2> /dev/null | grep $DISK | grep -i Linux)
	if [[ -z $LINDISK ]]; then
		continue
	fi
	smartctl -s on $DISK >> /dev/null
	MODEL=$(smartctl -i $DISK | grep "Device Model" | awk -F : '{ print $2 }' | xargs | sed 's/ /_/g')
	if [[ -z $MODEL ]]; then
		MODEL=$(smartctl -i $DISK | grep "Vendor" | awk -F : '{ print $2 }' | xargs | sed 's/ /_/g')
	fi
	SERIAL=$(smartctl -i $DISK | grep "Serial Number" | awk -F : '{ print $2 }' | sed 's/ //g')
	if [[ -z $SERIAL ]]; then
		SERIAL="0"
	fi
	LOGFILE=$(cat /var/log/messages | grep smartd | grep "state written to" | grep $SERIAL | tail -1 | awk -F "state written to" '{ print $2 }' | sed 's/ //g' | sort -u)
	if [[ $TRACE == true ]]; then
		echo "DISK:     $DISK"
		echo "DISKS:    $DISKS"
		echo "MODEL:    $MODEL"
		echo "SERIAL:   $SERIAL"
		echo "LOGFILE:  $LOGFILE"
	fi
	if [[ -z $LOGFILE ]]; then
		MODEL2=$(echo $MODEL | sed 's/-/_/g')
		SERIAL2=$(echo $SERIAL | sed 's/-/_/g')
		LOGFILE=$(find /var/lib/smartmontools/ -name \*$MODEL2-$SERIAL2\* | grep -v \~)
	fi
	if [[ -z $LOGFILE ]]; then
		LOGDATE="n/a"
	else
		LOGDATE=$(ls -l $LOGFILE | awk '{ print $7" "$6" "$8}')
		LOGDATE2=$(ls -l $LOGFILE | awk '{ print $7" "$6}')
	fi
	temp190=$(grep smartd /var/log/messages | grep $DISK | grep "$_TODAY" | grep -i temperature | grep 190 | tail -5 | awk -F 190 '{ print $2 }' | sed 's/^ //g' | awk '{ print $6 }')
	temp194=$(grep smartd /var/log/messages | grep $DISK | grep "$_TODAY" | grep -i temperature | grep 194 | tail -5 | awk -F 194 '{ print $2 }' | sed 's/^ //g' | awk '{ print $6 }')
	#echo "-Note that the disk temperature is not representative for some vendors, for example Hitachi does not conform to standard"
	LASTDATE=$(grep smartd /var/log/messages | grep -i "starting scheduled" | grep -i "test" | tail -1 | awk '{ print $2" "$1" "$3 }' | rev | cut -c 4- | rev )
	LASTTYPE=$(grep smartd /var/log/messages | grep -i "starting scheduled" | grep -i "test" | tail -1 | awk '{ print $11 }');
	if [[ $TRACE == true ]]; then
		echo "LASTDATE: $LASTDATE"
		echo "LASTTTPE: $LASTTYPE"
	fi
	LD=$(echo $LASTDATE | awk '{ print $1$2 }')
#	HEALTH=$(smartctl -H $DISK | tail -n +5 | head -n +1 | awk '{ print $6 }')
#	if [[ -z $HEALTH ]]; then
#		HEALTH=$(smartctl -H $DISK | tail -n +5 | head -n +1 | awk '{ print $4 }')
#	fi
	HEALTH=$(smartctl -H /dev/sda | grep -v '^$' | tail -n 1 | awk '{ print $6 }')
	if [[ -z $HEALTH ]]; then
		HEALTH=$(smartctl -H /dev/sda | grep -v '^$' | tail -n 1 | awk '{ print $4 }')
	fi
	REMAIN=$(smartctl -l selftest $DISK | grep '# 1' | awk '{ print $8 }')
	TESTLINE=$(smartctl -l selftest $DISK | grep -v '^$' | grep '# 1')
	STATLINE=$(smartctl -l selftest $DISK | grep -A 1 "START OF READ SMART DATA SECTION" | tail -n 1)
	LASTLINE=$(smartctl -l selftest $DISK | grep -v '^$' | tail -n 1)
	STATOK=$(echo $STATLINE | grep 'SMART Self-test log structure revision')
#echo "--STATOK:    >$STATOK<"
#echo "--STATLINE:  >$STATLINE<"
#echo "--TESTLINE:  >$TESTLINE<"
#echo "--LASTLINE:  >$LASTLINE<"
#echo "--HEALTH:    >$HEALTH<"
	ERROR=false
	if [[ -z $STATOK ]]; then
		if [[ -z $STATLINE ]]; then
			STATLINE=$LASTLINE
		fi
	fi
	if [[ ! -z $TESTLINE ]]; then
		COMPLT=$(echo $TESTLINE | awk '{ print $5" "$6" "$7 }')
		if [[ $CD != $TD ]]; then
			if [[ $LD == $TD ]]; then
				STATUS0="Ok"
			else
				STATUS0="Error"
				ERROR=true
			fi
		else
			STATUS0="Ok"
		fi
	else
		STATOK=""
		STATLINE="No self-tests have been logged"
		COMPLT=$STATLINE
		TEST="Minor"
		STATUS0="Ok"
	fi
	if [[ ! -z $HEALTH ]]; then
		if [[ $HEALTH == "PASSED" || $HEALTH == "OK" ]]; then
			STATUS1="Ok"
		else
			STATUS1="Error"
			ERROR=true
		fi
	else
		STATUS1="Ok"
	fi
	if [[ ! -z $TESTLINE ]]; then
		if [[ $COMPLT == "Completed without error" ]]; then
			STATUS2="Ok"
			if [[ $REMAIN == "00%" ]]; then
				STATUS3="Ok"
			else
				STATUS3="Error"
				ERROR=true
			fi
		elif [[ $COMPLT == "Aborted by host" ]]; then
			STATLINE=$COMPLT
			STATUS2="Ok"
			STATUS3="Ok"
		else
			ERROR=true
			STATUS2="Error"
			if [[ $REMAIN == "00%" ]]; then
				STATUS3="Ok"
			else
				STATUS3="Error"
			fi
		fi
	else
		TEST="Minor"
		# Device does not support Self Test logging
		SUPP=$(echo $COMPLT | grep -i does | grep -i not | grep -i support)
		if [[ ! -z $SUPP ]]; then
			STATUS2="Ok"
		else
			STATUS2="Error"
		fi
	fi
	hi190=0
	STATUS4="Ok"
	for temp in $temp190; do
		if [[ $temp -gt $hi190 ]]; then
			hi190=$temp
		fi
	done
	hi194=0
	STATUS5="Ok"
	for temp in $temp194; do
		if [[ $temp -gt $hi194 ]]; then
			hi194=$temp
		fi
	done
	if [[ $ERROR == true ]]; then
		OUTPUT=true
		#echo " Logfile:                    "$LOGFILE
		echo " Hostname:                   "$HOST
		echo " Disk Device Name:           "$DISK
		echo " Disk Device Model:          "$MODEL
		echo " Disk Serial Number:         "$SERIAL
		echo " Latest logfile access:      "$LOGDATE
		echo " Latest test run:            "$LASTDATE
		echo " Latest test type:           "$LASTTYPE
		echo " Highest airflow temp:       "$hi190
		echo " Highest celsius temp:       "$hi194
		if [[ $STATUS0 == "Error" ]]; then
			echo " Selftest has NOT been run TODAY"
		fi
		if [[ $STATUS1 == "Error" ]]; then
			echo " Health check shows that the disk has an error!"
		fi
		if [[ $STATUS2 == "Error" ]]; then
			echo " Smartctl selftest has found an error!"
			echo " -"$COMPLT
		fi
		if [[ $STATUS3 == "Error" ]]; then
			echo " Selftest has not completed to 100%"
		fi
#		if [[ $STATUS4 == "Error" ]]; then
#			echo " Airflow temperature seems too high! ($hi190)"
#		fi
#		if [[ $STATUS5 == "Error" ]]; then
#			echo " Temperature celsius seems too high! ($hi194)"
#		fi
		if [[ -z $STATOK ]]; then
			echo
			echo " "$STATLINE
		fi
		echo
	fi
done
if [[ $OUTPUT == false ]]; then
	if [[ $TEST == "Normal" ]]; then
		echo " Test executed OK"
		if [[ -z $STATOK ]]; then
			echo " -$STATLINE"
			echo " -$COMPLT"
		fi
	else
		echo " Reduced test executed OK"
		if [[ -z $STATOK ]]; then
			echo " -$STATLINE"
		fi
	fi
fi
...använd det som du vill, men jag kan givetvis inte lova att det funkar rakt av.... ;)

Scriptet är inte testat på 3-4 år och ursprungligen skrev jag det för SuSE (SLES) ;D
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
Skriv svar

Återgå till "Hårdvara och drivrutiner"