Skip to content

Commit

Permalink
Add SMART attributes for SSD and NVMe
Browse files Browse the repository at this point in the history
This adds the SMART attributes required to probe Samsung SSD and NVMe
(and possibly others) disks when using the "zpool status -c" command.

Reviewed-by: loli10K <[email protected]>
Reviewed-by: Giuseppe Di Natale <[email protected]>
Reviewed-by: Tony Hutter <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: bunder2015 <[email protected]>
Closes #7183 
Closes #7193
  • Loading branch information
bunder2015 authored and behlendorf committed Feb 21, 2018
1 parent 26cb4b8 commit ca0b376
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 2 deletions.
2 changes: 2 additions & 0 deletions cmd/zpool/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ dist_zpoolexec_SCRIPTS = \
zpool.d/pend_sec \
zpool.d/off_ucor \
zpool.d/ata_err \
zpool.d/nvme_err \
zpool.d/pwr_cyc \
zpool.d/upath \
zpool.d/vendor
Expand Down Expand Up @@ -97,6 +98,7 @@ zpoolconfdefaults = \
pend_sec \
off_ucor \
ata_err \
nvme_err \
pwr_cyc \
upath \
vendor
Expand Down
1 change: 1 addition & 0 deletions cmd/zpool/zpool.d/nvme_err
23 changes: 21 additions & 2 deletions cmd/zpool/zpool.d/smart
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ off_ucor: Show SMART offline uncorrectable errors (ATA).
ata_err: Show SMART ATA errors (ATA).
pwr_cyc: Show SMART power cycle count (ATA).
serial: Show disk serial number.
nvme_err: Show SMART NVMe errors (NVMe).
"

script=$(basename "$0")
Expand All @@ -37,15 +38,18 @@ smartctl_path=$(which smartctl)
if [ -b "$VDEV_UPATH" ] && [ -x "$smartctl_path" ]; then
raw_out=$(eval "sudo $smartctl_path -a $VDEV_UPATH")

# Are we a SAS or ATA drive? Look for the right line in smartctl:
# What kind of drive are we? Look for the right line in smartctl:
#
# SAS:
# Transport protocol: SAS
#
# SATA:
# ATA Version is: 8
#
type=$(echo "$raw_out" | grep -m 1 -Eo '^ATA|SAS$')
# NVMe:
# SMART/Health Information (NVMe Log 0xnn, NSID 0xnn)
#
type=$(echo "$raw_out" | grep -m 1 -Eo '^ATA|NVMe|SAS$')
out=$(echo "$raw_out" | awk '
# SAS specific
/read:/{print "rrd="$4"\nr_cor="$5"\nr_proc="$7"\nr_ucor="$8}
Expand All @@ -71,10 +75,21 @@ if [ -b "$VDEV_UPATH" ] && [ -x "$smartctl_path" ]; then
# SATA common
/Temperature_Celsius/{print "temp="$10}
/Airflow_Temperature_Cel/{print "temp="$10}
/SMART overall-health self-assessment test result:/{print "health="$6}
/Power_On_Hours/{print "hours_on="$10}
/Serial Number:/{print "serial="$3}
# NVMe common
/Temperature:/{print "temp="$2}
/SMART overall-health self-assessment test result:/{print "health="$6}
/Power On Hours:/{gsub("[^0-9]","",$4); print "hours_on="$4}
/Serial Number:/{print "serial="$3}
/Power Cycles:/{print "pwr_cyc="$3}
# NVMe specific
/Media and Data Integrity Errors:/{print "nvme_err="$6}
END {ORS="\n"; print ""}
');
fi
Expand All @@ -94,6 +109,8 @@ smart)
scripts="temp|health|r_ucor|w_ucor"
elif [ "$type" = "ATA" ] ; then
scripts="temp|health|ata_err|realloc|rep_ucor|cmd_to|pend_sec|off_ucor"
elif [ "$type" = "NVMe" ] ; then
scripts="temp|health|nvme_err"
fi
;;
smartx)
Expand All @@ -102,6 +119,8 @@ smartx)
scripts="hours_on|defect|nonmed|r_proc|w_proc"
elif [ "$type" = "ATA" ] ; then
scripts="hours_on|pwr_cyc"
elif [ "$type" = "NVMe" ] ; then
scripts="hours_on|pwr_cyc"
fi
;;
*)
Expand Down

0 comments on commit ca0b376

Please sign in to comment.