見出し画像

S.M.A.R.TをAIで全自動分析&通知! ~不調を自動検出してSSDの故障に備えろ! Linux&Windows対応!~

こんにちはRcatです。
前回、Linuxのデータ用SSDが故障しいくつかのデータが飛びましたが、転んでもタダでは起きません!
もう壊れてしまったので遅いですが、もしかしたらS.M.A.R.Tを見ていれば何か気づけたのかもしれません。
というわけで今回は、S.M.A.R.Tの取得から分析までを全自動化して、何かあれば通知が来るようにします!



はじめに

利用規約

情報や作品の活用時は事前に利用規約をご確認ください。

コメントについて

利用規約のガイドラインを確認の上コメントしてください


概要

冒頭で書いた通り、今回はS.M.A.R.Tの自動取得と分析を行います。
Windows & Linuxで対応します。

S.M.A.R.Tって?

S.M.A.R.TとはHDDやSSDのパラメーターを取得して健康状態をチェックできる機能です。
Windowsで有名なチェックソフトだとCrystalDiskInfoなんかがあります。

こんな感じで使用時間や総書き込み量(SSDには書き込み限界がある)をチェックできます。

HDDだとこんな感じ。
2.5万時間。これ2013年製ですw
電源いれっぱで3年弱程度の使用時間ですね。


S.M.A.R.T自動監視! 実行結果

まずはいきなり実行結果からお見せします。
こんな感じで、健康状態が注意か危険な場合はDiscordに通知が来ます。

※テストの為AIに健康状態を注意レベルで出力するように指示してある

仕組み

仕組みは簡単です。
最初にお見せした健康状態の生の値を生成AIに分析させているだけです。
Linuxではsmartctlコマンドを、WindowsではCrystalDiskInfoを使い分析します。


使い方

ここでは今回作成した自動監視システムの導入と使い方を解説します。
まずはLinuxを前提に解説します。
なお、共通と書いてるのはWindowsでもLinuxでも同じ準備が必要です。

【共通】ツールの取得と設定

末尾で配布してますので取得してください
中身はこんな感じで、Windowsの場合はstart.bat。LinuxではStart.shを実行するだけでOK。

Smartchk.pyの中の設定を更新します。
下記Difyの導入でAPIキーを作成したら、そのキーを入れましょう。
Difyのサーバーはオンライン版が書き込み済みです。ローカルの場合はIPアドレスに書き換えてください。

また、Windowsの場合はDiskInfo64のパスを書き込みます。
本ツールをCrystalDiskInfoのフォルダに直に入れてしまうなら書き換えなくてOK。

追記:Ver2ではローカルLLM設定に変更されています

【共通】GeminiAPIキーの取得

※Ver2では不要です。代わりに以下を導入してください

今回は文章生成AIとしてGeminiを使います。こちらをAPI経由で使うにはキーが必要です。
取得方法は下記Difyの準備で紹介している記事で解説しています。
違うモデルを使うという方はスキップしてOK。

【共通】Difyの準備

※Ver2では不要

生成AI(Gemini)への踏み台にDifyを使っています。
ローカル版とオンライン版がありますので、導入が難しい場合はオンライン版をお勧めします。

導入したら空のテキストジェネレーターを作成してAPIキーを作成してください。
ここを空にすることでなんでも用にできます。
※オンライン版では5個しか作れないため、ワークフローを使わないならこういうやり方も手。
※モデルを柔軟に変更できるので踏み台として使っています。

【共通】DiscordロギングBOT&クライアント

冒頭で説明したように、異常があった際にDiscordに通知するには以下のログ専用BOTとそのクライアントを用いています。
なくても動きますが、通知が必要なら導入してください。

BOTを作成/運用後、loggingbot_client.pyを本ツールと同じフォルダに入れることで認識されます。

【Linux】smartctlのインストール

LinuxでS.M.A.R.Tをチェックするにはsmartctlコマンドを使っています。
下記でインストールしましょう。

sudo apt install smartmontools

試しに実行するとこんな感じ

$ sudo smartctl -a /dev/nvme0n1
smartctl 7.2 2020-12-30 r5155 [x86_64-linux-6.8.0-59-generic] (local build)
Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Number:                       PCIe SSD
Serial Number:                      
Firmware Version:                   EHFM90.1
PCI Vendor/Subsystem ID:            0x1987
IEEE OUI Identifier:                0x6479a7
Total NVM Capacity:                 512,110,190,592 [512 GB]
Unallocated NVM Capacity:           0
Controller ID:                      0
NVMe Version:                       1.4
Number of Namespaces:               1
Namespace 1 Size/Capacity:          512,110,190,592 [512 GB]
Namespace 1 Formatted LBA Size:     512
Namespace 1 IEEE EUI-64:            6479a7 7f7a3055d0
Local Time is:                      Thu May 29 23:29:37 2025 JST
Firmware Updates (0x12):            1 Slot, no Reset required
Optional Admin Commands (0x0017):   Security Format Frmw_DL Self_Test
Optional NVM Commands (0x005f):     Comp Wr_Unc DS_Mngmt Wr_Zero Sav/Sel_Feat Timestmp
Log Page Attributes (0x1e):         Cmd_Eff_Lg Ext_Get_Lg Telmtry_Lg Pers_Ev_Lg
Maximum Data Transfer Size:         64 Pages
Warning  Comp. Temp. Threshold:     83 Celsius
Critical Comp. Temp. Threshold:     85 Celsius

Supported Power States
St Op     Max   Active     Idle   RL RT WL WT  Ent_Lat  Ex_Lat
 0 +     5.00W    5.00W       -    0  0  0  0        0       0
 1 +     2.40W    2.50W       -    1  1  1  1        0    1000
 2 +     1.90W    1.80W       -    2  2  2  2        0       0
 3 -   0.0500W       -        -    3  3  3  3     5000   10000
 4 -   0.0050W       -        -    4  4  4  4    10000   45000

Supported LBA Sizes (NSID 0x1)
Id Fmt  Data  Metadt  Rel_Perf
 0 +     512       0         1
 1 -    4096       0         0

=== START OF SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

SMART/Health Information (NVMe Log 0x02)
Critical Warning:                   0x00
Temperature:                        27 Celsius
Available Spare:                    100%
Available Spare Threshold:          50%
Percentage Used:                    1%
Data Units Read:                    4,737,978 [2.42 TB]
Data Units Written:                 7,578,245 [3.88 TB]
Host Read Commands:                 52,485,618
Host Write Commands:                222,986,588
Controller Busy Time:               2,780
Power Cycles:                       42
Power On Hours:                     13,715
Unsafe Shutdowns:                   5
Media and Data Integrity Errors:    0
Error Information Log Entries:      120
Warning  Comp. Temperature Time:    0
Critical Comp. Temperature Time:    0
Temperature Sensor 1:               41 Celsius

Error Information (NVMe Log 0x01, 16 of 63 entries)
Num   ErrCount  SQId   CmdId  Status  PELoc          LBA  NSID    VS
  0        120     0  0x0018  0x4005  0x028            0     0     -

うん! よくわかんない☆

ここまでで準備は完了です


実行する(Linux)

SMART 分析実行

Linuxで実行するには、ツール一式を転送し、start.shをrootで実行します。
これはsmartctlコマンドがroot権限を要求するためです。

実行結果がこちら
すべて正常に動作すると、AIのコメントが表示されます。
なお、初回は環境構築とライブラリのインストールが入るので少し時間がかかります。

$ sudo ./start.sh
[sudo] rcat のパスワード:
/dev/sda
全体的に良好な状態です。稼働時間が短く、エラーや再割り当てセクタも見られません。温度も問題ありません。SSDの基本的な健康状態は良好と言えます。

/dev/nvme0n1
全体的に良好な状態です。摩耗レベルが低く、温度も正常範囲内です。ただし、エラーログが120件存在するため、今後の注意が必要です。ファームウェアの更新も検討すると良いでしょう。

全体の情報はログファイルに出力されており、異常がない場合も結果は保存されています。

Ver2 RAID監視対応

Ver2では、mdadmを使って作成したRAID情報"/proc/mdstat"を読み取り、RAIDのステータスの監視も同時に行います。
こちらは参加しているデバイスがダウンしている際は異常として判断するように指示しています

{
	"md0": {
		"comment": "RAID5デバイスmd0はすべてのディスクが正常に参加しており、冗長性も維持されています。特に異常は確認されません。",
		"device": "/dev/md0",
		"capacity": 5587,
		"description": "",
		"status": 0,
		"level": 5
	}
}

ちなみに手動で異常っぽい感じにするとこんな返事をします

Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sde1[3] sdd1[2] sdc1[1] sdb1[0]
      5860144128 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/4] [UU_U]
      bitmap: 0/15 pages [0KB], 65536KB chunk
{
	"md0": {
		"comment": "RAID5アレイmd0は3/4のデバイスで構成されており、1つのディスクが障害状態です。継続的な運用はリスクが高いため、早急なディスク交換が推奨されます。",
		"device": "/dev/md0",
		"capacity": 5587,
		"description": "RAID5アレイで1つのディスク(sde1)が未構成(U)状態です。冗長性が損なわれており、追加障害時にデータ損失のリスクがあります。",
		"status": 1,
		"level": 5
	}
}

Linuxで定期実行する

systemdを使えば定期的に自動実行できます。
配布の中に参考用にユニットファイルとタイマーファイルを入れておくのでご自由に書き換えてください。

支援スクリプト実行

昔作ったサービスファイル作成スクリプトを改造して、サービスファイル作成後にタイマーファイルも作成できるようにしてみました。
※末尾で配布

前半にサービスファイルを作り、後半に時刻や曜日を設定してタイマーを作ります。

$ CreateService-sh
###サービス作成###

操作を選択
[1] 新規作成
[2] タイマーだけ作成

※本スクリプトはroot権限で実行してください


実行するSHスクリプトは?
フルパスで入力してください

このディレクトリにある以下を使う場合は空欄
/Rcat_Service/Script/SMART/start.sh

引数があれば入力

サービス名は?
ファイル名と同じ場合は空欄
※英数字のみ
R_SMART_Check
ネットワークがオンラインであることを条件とする
(y/n)
y
標準出力をログに出力しますか?
(y/n)
n

以下の内容で作成します

--------------------------------------------
[Unit]
Description=R_SMART_Check
After=network-online.target

[Service]
User=rcat
Type=simple
WorkingDirectory=/Rcat_Service/Script/SMART
ExecStart=/Rcat_Service/Script/SMART/start.sh
StandardOutput=null

[Install]
WantedBy=multi-user.target network-online.target

--------------------------------------------
(y/n)


サービスファイル作成完了


続けてタイマーを作成しますか?
(y/n)y
R_SMART_Check.serviceのタイマーを作成します

入力順序
時刻->日付->曜日
実行時刻を入力
フォーマットHH:MM
20:00
実行する日付を入力
フォーマット1-31 or *
*

曜日を選択
[0]Mon:X
[1]Tue:X
[2]Wed:X
[3]Thu:X
[4]Fri:O
[5]Sat:X
[6]Sun:X
数値+Enterでフラグ変更。空Enterで確定。全部空でALL



以下の内容で作成します

--------------------------------------------
[Unit]
Description=R_AutoBackUP Timer
Requires=R_AutoBackUP.service

[Timer]
OnCalendar=Fri *-*-0* 20:00:00
Unit=R_AutoBackUP.service
Persistent=true

[Install]
WantedBy=timers.target

--------------------------------------------
(y/n)
y

サービスファイル作成完了

曜日は数値で何度でも受け付け、空入力で抜ける仕組み。
今回は毎週金曜日の20:00分に実行にした。金曜日が何日か分からないので、日付は"*"にしておく。

サービス

[Service]セクションに実行しているユーザー名が入る仕様ですが、今回はrootでないといけないので消します。

[Unit]
Description=R_SMART_Check
After=network-online.target

[Service]
Type=simple
WorkingDirectory=/Rcat_Service/Script/SMART
ExecStart=/Rcat_Service/Script/SMART/start.sh 
StandardOutput=null

[Install]
WantedBy=multi-user.target network-online.target

タイマー

[Unit]
Description=R_SMART_Check
Requires=R_SMART_Check.service

[Timer]
OnCalendar=Fri *-*-* 20:00:00
Unit=R_SMART_Check.service
Persistent=true

[Install]
WantedBy=timers.target

システムに適用

支援スクリプトを使っていなくてもこの作業は必要です。
タイマーを使わない場合はserviceの方をenableにすればPC起動時に1回だけ実行されます。
※起動時だとネットワークが間に合わないなどした場合落ちるかも。

$ServiceAdd R_SMART_Check.service
$ServiceAdd R_SMART_Check.timer
$sudo systemctl enable  R_SMART_Check.timer
$sudo systemctl start  R_SMART_Check.timer

$ systemctl status R_SMART_Check.service
● R_SMART_Check.service - R_SMART_Check
     Loaded: loaded (/etc/systemd/system/R_SMART_Check.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2025-05-28 23:50:18 JST; 2s ago
TriggeredBy: ● R_SMART_Check.timer
   Main PID: 3991002 (start.sh)
      Tasks: 2 (limit: 18828)
     Memory: 18.0M
        CPU: 174ms
     CGroup: /system.slice/R_SMART_Check.service
             tq3991002 /bin/bash /Rcat_Service/Script/SMART/start.sh
             mq3991003 python3 Smartchk.py

Windowsで実行する

本ツールはせっかくなのでWindowsにも対応させています。
まぁこの辺は周辺ツール様々って感じなんですけどね。

CrystalDiskInfoの用意

Windowsでは有名なCrystalDiskInfoを監視に用いています。
公式サイトから最新のものをZIP形式でダウンロードします。

ツールの実行

DLが終わったら、本ツールをCrystalDiskInfoのフォルダに入れてください。
ツール内の設定をフルパスで書き換えた場合はどこにおいてもOK。

実行するにはstart.batを使います。
実行すると初回は自動で環境構築が行われ、その後分析を行います。
※黒い画面が消えてしまうので、結果はログを見るようにしてください。もちろんBOT導入時は通知が行きます。

Windowsで定期実行する

定期実行の方法

Windowsでも定期実行が可能です。
タスクスケジューラを使います

右の基本タスクを作成をクリック。
その前にライブラリに新しいフォルダを作っておくと整理できる。

好きな名前を付ける

今回は毎週。毎日とかも可能なのでお好きに選ぶ

プログラムの開始を選択し、start.batを選ぶ
※これをやると移動できなくなるので、移動させないフォルダにあることを確認すること。

作成後、出来上がったタスクのプロパティを開き、ユーザーがログオンしているかどうかかかわらずに実行するに変更する←これ大事

以降時間が来たら勝手に実行します。


まとめ

今回はSMARTの全自動監視&分析システムを作成しました。
SSDが突然の死を迎えたならどうしようもないですが、何か前兆があったならばこれで検出が出来そうです。
それではまたお会いしましょう。


配布情報

サービス支援スクリプト及びSMART監視ツールを配布します

以下のURLより配布しています。
利用規約に同意の上ご利用ください。

SMART監視ツール

https://script.google.com/macros/s/AKfycbxdcr8pnazR7RbjaSICTtaNWfN7h_rjQrKlZ3h9CZpPRFzRILk1OGc8mZqKbF-NXNO9/exec?name=SMART自動監視システム

サービス支援スクリプト

https://script.google.com/macros/s/AKfycbxdcr8pnazR7RbjaSICTtaNWfN7h_rjQrKlZ3h9CZpPRFzRILk1OGc8mZqKbF-NXNO9/exec?name=Linux_サービス系

Discord ロギングBOT


いいなと思ったら応援しよう!

Rcat999 情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。