# 不良セクタチェック
lsblk -d -I 8 -n -o NAME,TYPE,TRAN -p | grep -E ' disk ' | grep -E ' (sata|sas)$' | while read LINE; do
HDD=$(echo $LINE | cut -d' ' -f1)
SMART=$(sudo smartctl --all $HDD)
echo $HDD $(echo -e "$SMART" | grep -E '^(Device Model:|Serial Number:) ')
echo -e "$SMART" | grep -E '^( 5|187|188|197|198) ' | sed -E 's/^ *(.+)$/\1/g' | sed 's/\s\{1,\}/ /g' | cut -d' ' -f 1,2,8,10
done
# 005 代替処理済のセクタ数
# 187 ハードウェアECCで回復できなかったエラー
# 188 コマンドタイムアウト回数
# 197 代替処理保留中のセクタ数
# 198 代替不可能セクタ数
# 温度チェック
lsblk -d -I 8 -n -o NAME,TYPE,TRAN -p | grep -E ' disk ' | grep -E ' (sata|sas)$' | while read LINE; do
HDD=$(echo $LINE | cut -d' ' -f1)
SMART=$(sudo smartctl --all $HDD)
echo $HDD $(echo -e "$SMART" | grep -E '^(Device Model:|Serial Number:) ')
echo -e "$SMART" | grep -E '^(190|194) ' | sed -E 's/^ *(.+)$/\1/g' | sed 's/\s\{1,\}/ /g' | cut -d' ' -f 1,2,8,10
done
# 190 エアフロー温度
# 194 温度
smartctlで取得したSMARTデータのうち必要なものを抽出して表示する。smartctlではIDが0埋めではなくスペース埋めで出てくるため先頭のスペースを削除。続いて連続したスペースを削除。これらの下処理を経てcutコマンドでID#、ATTRIBUTE_NAME、UPDATED、およびRAW_VALUE列を抽出。
lsblkでHDDを列挙する際はIオプションで8を指定してスワップやループバックデバイスなどを排除した。また、grepでTRANがsataのデバイスに絞り込みUSBメモリーなどを排除。TYPEも一応diskで絞り込んでいるが、SSDでもdiskになるためあまり意味がなく、現状SSDを排除できていない。pオプションでsdaではなく/dev/sdaという完全なデバイスパスを表示。
# smartctlが入っていない場合はインストール(Debian系)
sudo apt-get install -y smartmontools