aboutsummaryrefslogtreecommitdiffstats
path: root/cmd/zpool/zpool.d
diff options
context:
space:
mode:
authorGiuseppe Di Natale <[email protected]>2017-06-05 13:52:15 -0400
committerBrian Behlendorf <[email protected]>2017-06-05 10:52:15 -0700
commit099700d9dff46309cdd16f4c4331daddb70d8570 (patch)
tree13383ee2af7cc69b0f790b3c3f70fbc61ae074fb /cmd/zpool/zpool.d
parent92aceb2a7ee8c9367fdc901fed933f6f258173e0 (diff)
zpool iostat/status -c improvements
Users can now provide their own scripts to be run with 'zpool iostat/status -c'. User scripts should be placed in ~/.zpool.d to be included in zpool's default search path. Provide a script which can be used with 'zpool iostat|status -c' that will return the type of device (hdd, sdd, file). Provide a script to get various values from smartctl when using 'zpool iostat/status -c'. Allow users to define the ZPOOL_SCRIPTS_PATH environment variable which can be used to override the default 'zpool iostat/status -c' search path. Allow the ZPOOL_SCRIPTS_ENABLED environment variable to enable or disable 'zpool status/iostat -c' functionality. Use the new smart script to provide the serial command. Install /etc/sudoers.d/zfs file which contains the sudoer rule for smartctl as a sample. Allow 'zpool iostat/status -c' tests to run in tree. Reviewed-by: Tony Hutter <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Giuseppe Di Natale <[email protected]> Closes #6121 Closes #6153
Diffstat (limited to 'cmd/zpool/zpool.d')
l---------cmd/zpool/zpool.d/ata_err1
l---------cmd/zpool/zpool.d/cmd_to1
l---------cmd/zpool/zpool.d/defect1
l---------cmd/zpool/zpool.d/health1
l---------cmd/zpool/zpool.d/hours_on1
-rwxr-xr-xcmd/zpool/zpool.d/lsblk7
-rwxr-xr-xcmd/zpool/zpool.d/media27
l---------cmd/zpool/zpool.d/nonmed1
l---------cmd/zpool/zpool.d/off_ucor1
l---------cmd/zpool/zpool.d/pend_sec1
l---------cmd/zpool/zpool.d/pwr_cyc1
l---------cmd/zpool/zpool.d/r_proc1
l---------cmd/zpool/zpool.d/r_ucor1
l---------cmd/zpool/zpool.d/realloc1
l---------cmd/zpool/zpool.d/rep_ucor1
l---------cmd/zpool/zpool.d/serial2
-rwxr-xr-xcmd/zpool/zpool.d/ses8
-rwxr-xr-xcmd/zpool/zpool.d/smart123
l---------cmd/zpool/zpool.d/smartx1
l---------cmd/zpool/zpool.d/temp1
l---------cmd/zpool/zpool.d/w_proc1
l---------cmd/zpool/zpool.d/w_ucor1
22 files changed, 175 insertions, 9 deletions
diff --git a/cmd/zpool/zpool.d/ata_err b/cmd/zpool/zpool.d/ata_err
new file mode 120000
index 000000000..94f22861f
--- /dev/null
+++ b/cmd/zpool/zpool.d/ata_err
@@ -0,0 +1 @@
+smart \ No newline at end of file
diff --git a/cmd/zpool/zpool.d/cmd_to b/cmd/zpool/zpool.d/cmd_to
new file mode 120000
index 000000000..94f22861f
--- /dev/null
+++ b/cmd/zpool/zpool.d/cmd_to
@@ -0,0 +1 @@
+smart \ No newline at end of file
diff --git a/cmd/zpool/zpool.d/defect b/cmd/zpool/zpool.d/defect
new file mode 120000
index 000000000..94f22861f
--- /dev/null
+++ b/cmd/zpool/zpool.d/defect
@@ -0,0 +1 @@
+smart \ No newline at end of file
diff --git a/cmd/zpool/zpool.d/health b/cmd/zpool/zpool.d/health
new file mode 120000
index 000000000..94f22861f
--- /dev/null
+++ b/cmd/zpool/zpool.d/health
@@ -0,0 +1 @@
+smart \ No newline at end of file
diff --git a/cmd/zpool/zpool.d/hours_on b/cmd/zpool/zpool.d/hours_on
new file mode 120000
index 000000000..94f22861f
--- /dev/null
+++ b/cmd/zpool/zpool.d/hours_on
@@ -0,0 +1 @@
+smart \ No newline at end of file
diff --git a/cmd/zpool/zpool.d/lsblk b/cmd/zpool/zpool.d/lsblk
index fc0394a3d..1cdef4049 100755
--- a/cmd/zpool/zpool.d/lsblk
+++ b/cmd/zpool/zpool.d/lsblk
@@ -38,16 +38,15 @@
# DISC-ZERO discard zeroes data
#
# If the script is run as just 'lsblk' then print out disk size, vendor,
-# model number and serial number.
+# and model number.
helpstr="
label: Show filesystem label.
model: Show disk model number.
-serial: Show disk serial number.
size: Show the disk capacity.
vendor: Show the disk vendor.
-lsblk: Show the disk size, vendor, model number, and serial number."
+lsblk: Show the disk size, vendor, and model number."
script=$(basename "$0")
@@ -57,7 +56,7 @@ if [ "$1" = "-h" ] ; then
fi
if [ "$script" = "lsblk" ] ; then
- list="size vendor model serial"
+ list="size vendor model"
else
list=$(echo "$script" | tr '[:upper:]' '[:lower:]')
fi
diff --git a/cmd/zpool/zpool.d/media b/cmd/zpool/zpool.d/media
new file mode 100755
index 000000000..05bc15918
--- /dev/null
+++ b/cmd/zpool/zpool.d/media
@@ -0,0 +1,27 @@
+#!/bin/sh
+#
+# Print out the type of device
+#
+
+if [ "$1" = "-h" ] ; then
+ echo "Show whether a vdev is a file, hdd, or ssd."
+ exit
+fi
+
+if [ -b "$VDEV_UPATH" ]; then
+ device=$(basename "$VDEV_UPATH")
+ val=$(cat "/sys/block/$device/queue/rotational" 2>/dev/null)
+ if [ "$val" = "0" ]; then
+ MEDIA="ssd"
+ fi
+
+ if [ "$val" = "1" ]; then
+ MEDIA="hdd"
+ fi
+else
+ if [ -f "$VDEV_UPATH" ]; then
+ MEDIA="file"
+ fi
+fi
+
+echo "media=$MEDIA"
diff --git a/cmd/zpool/zpool.d/nonmed b/cmd/zpool/zpool.d/nonmed
new file mode 120000
index 000000000..94f22861f
--- /dev/null
+++ b/cmd/zpool/zpool.d/nonmed
@@ -0,0 +1 @@
+smart \ No newline at end of file
diff --git a/cmd/zpool/zpool.d/off_ucor b/cmd/zpool/zpool.d/off_ucor
new file mode 120000
index 000000000..94f22861f
--- /dev/null
+++ b/cmd/zpool/zpool.d/off_ucor
@@ -0,0 +1 @@
+smart \ No newline at end of file
diff --git a/cmd/zpool/zpool.d/pend_sec b/cmd/zpool/zpool.d/pend_sec
new file mode 120000
index 000000000..94f22861f
--- /dev/null
+++ b/cmd/zpool/zpool.d/pend_sec
@@ -0,0 +1 @@
+smart \ No newline at end of file
diff --git a/cmd/zpool/zpool.d/pwr_cyc b/cmd/zpool/zpool.d/pwr_cyc
new file mode 120000
index 000000000..94f22861f
--- /dev/null
+++ b/cmd/zpool/zpool.d/pwr_cyc
@@ -0,0 +1 @@
+smart \ No newline at end of file
diff --git a/cmd/zpool/zpool.d/r_proc b/cmd/zpool/zpool.d/r_proc
new file mode 120000
index 000000000..94f22861f
--- /dev/null
+++ b/cmd/zpool/zpool.d/r_proc
@@ -0,0 +1 @@
+smart \ No newline at end of file
diff --git a/cmd/zpool/zpool.d/r_ucor b/cmd/zpool/zpool.d/r_ucor
new file mode 120000
index 000000000..94f22861f
--- /dev/null
+++ b/cmd/zpool/zpool.d/r_ucor
@@ -0,0 +1 @@
+smart \ No newline at end of file
diff --git a/cmd/zpool/zpool.d/realloc b/cmd/zpool/zpool.d/realloc
new file mode 120000
index 000000000..94f22861f
--- /dev/null
+++ b/cmd/zpool/zpool.d/realloc
@@ -0,0 +1 @@
+smart \ No newline at end of file
diff --git a/cmd/zpool/zpool.d/rep_ucor b/cmd/zpool/zpool.d/rep_ucor
new file mode 120000
index 000000000..94f22861f
--- /dev/null
+++ b/cmd/zpool/zpool.d/rep_ucor
@@ -0,0 +1 @@
+smart \ No newline at end of file
diff --git a/cmd/zpool/zpool.d/serial b/cmd/zpool/zpool.d/serial
index 7d1e766ad..94f22861f 120000
--- a/cmd/zpool/zpool.d/serial
+++ b/cmd/zpool/zpool.d/serial
@@ -1 +1 @@
-lsblk \ No newline at end of file
+smart \ No newline at end of file
diff --git a/cmd/zpool/zpool.d/ses b/cmd/zpool/zpool.d/ses
index 10d5dcfd3..f6b7520df 100755
--- a/cmd/zpool/zpool.d/ses
+++ b/cmd/zpool/zpool.d/ses
@@ -6,10 +6,10 @@
helpstr="
enc: Show disk enclosure w:x:y:z value.
slot: Show disk slot number as reported by the enclosure.
-encdev: Show the /dev/sg* device for the enclosure associated with the disk slot.
-fault_led: Show the value of the disk enclosure slot fault LED.
-locate_led: Show the value of the disk enclosure slot locate LED.
-ses: Show disk's enclosure, enclosure dev, slot number, and fault/locate LED values."
+encdev: Show /dev/sg* device associated with the enclosure disk slot.
+fault_led: Show value of the disk enclosure slot fault LED.
+locate_led: Show value of the disk enclosure slot locate LED.
+ses: Show disk's enc, enc device, slot, and fault/locate LED values."
script=$(basename "$0")
if [ "$1" = "-h" ] ; then
diff --git a/cmd/zpool/zpool.d/smart b/cmd/zpool/zpool.d/smart
new file mode 100755
index 000000000..3721f30ed
--- /dev/null
+++ b/cmd/zpool/zpool.d/smart
@@ -0,0 +1,123 @@
+#!/bin/sh
+#
+# Show SMART stats
+#
+
+helpstr="
+smart: Show SMART temperature and error stats (specific to drive type)
+smartx: Show SMART extended drive stats (specific to drive type).
+temp: Show SMART drive temperature in celsius (all drives).
+health: Show reported SMART status (all drives).
+r_proc: Show SMART read GBytes processed over drive lifetime (SAS).
+w_proc: Show SMART write GBytes processed over drive lifetime (SAS).
+r_ucor: Show SMART read uncorrectable errors (SAS).
+w_ucor: Show SMART write uncorrectable errors (SAS).
+nonmed: Show SMART non-medium errors (SAS).
+defect: Show SMART grown defect list (SAS).
+hours_on: Show number of hours drive powered on (all drives).
+realloc: Show SMART reallocated sectors count (ATA).
+rep_ucor: Show SMART reported uncorrectable count (ATA).
+cmd_to: Show SMART command timeout count (ATA).
+pend_sec: Show SMART current pending sector count (ATA).
+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.
+"
+
+script=$(basename "$0")
+
+if [ "$1" = "-h" ] ; then
+ echo "$helpstr" | grep "$script:" | tr -s '\t' | cut -f 2-
+ exit
+fi
+
+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:
+ #
+ # SAS:
+ # Transport protocol: SAS
+ #
+ # SATA:
+ # ATA Version is: 8
+ #
+ type=$(echo "$raw_out" | grep -m 1 -Eo '^ATA|SAS$')
+ out=$(echo "$raw_out" | awk '
+# SAS specific
+/read:/{print "rrd="$4"\nr_cor="$5"\nr_proc="$7"\nr_ucor="$8}
+/write:/{print "rwr="$4"\nw_cor="$5"\nw_proc="$7"\nw_ucor="$8}
+/Non-medium error count/{print "nonmed="$4}
+/Elements in grown defect list/{print "defect="$6}
+
+# SAS common
+/Drive Temperature:/{print "temp="$4}
+# Status can be a long string, substitute spaces for '_'
+/SMART Health Status:/{printf "health="; for(i=4;i<=NF-1;i++){printf "%s_", $i}; printf "%s\n", $i}
+/number of hours powered up/{print "hours_on="$7}
+/Serial number:/{print "serial="$3}
+
+# SATA specific
+/Reallocated_Sector_Ct/{print "realloc="$10}
+/Reported_Uncorrect/{print "rep_ucor="$10}
+/Command_Timeout/{print "cmd_to="$10}
+/Current_Pending_Sector/{print "pend_sec="$10}
+/Offline_Uncorrectable/{print "off_ucor="$10}
+/ATA Error Count:/{print "ata_err="$4}
+/Power_Cycle_Count/{print "pwr_cyc="$10}
+
+# SATA common
+/Temperature_Celsius/{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}
+
+END {ORS="\n"; print ""}
+');
+fi
+
+# if type is not set by now, either we don't have a block device
+# or smartctl failed. Either way, default to ATA and set out to
+# nothing
+if [ -z "$type" ]; then
+ type="ATA"
+ out=
+fi
+
+case $script in
+smart)
+ # Print temperature plus common predictors of drive failure
+ if [ "$type" = "SAS" ] ; then
+ 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"
+ fi
+ ;;
+smartx)
+ # Print some other interesting stats
+ if [ "$type" = "SAS" ] ; then
+ scripts="hours_on|defect|nonmed|r_proc|w_proc"
+ elif [ "$type" = "ATA" ] ; then
+ scripts="hours_on|pwr_cyc"
+ fi
+ ;;
+*)
+ scripts="$script"
+esac
+
+with_vals=$(echo "$out" | grep -E "$scripts")
+if [ ! -z "$with_vals" ]; then
+ echo "$with_vals"
+ without_vals=$(echo "$scripts" | tr "|" "\n" |
+ grep -v -E "$(echo "$with_vals" |
+ awk -F "=" '{print $1}')" | awk '{print $0"="}')
+else
+ without_vals=$(echo "$scripts" | tr "|" "\n" | awk '{print $0"="}')
+fi
+
+if [ ! -z "$without_vals" ]; then
+ echo "$without_vals"
+fi
diff --git a/cmd/zpool/zpool.d/smartx b/cmd/zpool/zpool.d/smartx
new file mode 120000
index 000000000..94f22861f
--- /dev/null
+++ b/cmd/zpool/zpool.d/smartx
@@ -0,0 +1 @@
+smart \ No newline at end of file
diff --git a/cmd/zpool/zpool.d/temp b/cmd/zpool/zpool.d/temp
new file mode 120000
index 000000000..94f22861f
--- /dev/null
+++ b/cmd/zpool/zpool.d/temp
@@ -0,0 +1 @@
+smart \ No newline at end of file
diff --git a/cmd/zpool/zpool.d/w_proc b/cmd/zpool/zpool.d/w_proc
new file mode 120000
index 000000000..94f22861f
--- /dev/null
+++ b/cmd/zpool/zpool.d/w_proc
@@ -0,0 +1 @@
+smart \ No newline at end of file
diff --git a/cmd/zpool/zpool.d/w_ucor b/cmd/zpool/zpool.d/w_ucor
new file mode 120000
index 000000000..94f22861f
--- /dev/null
+++ b/cmd/zpool/zpool.d/w_ucor
@@ -0,0 +1 @@
+smart \ No newline at end of file