macOSでsmartdを用いてS.M.A.R.T.情報を監視する方法(改訂版)

[主題]
macOSでsmartmontoolsのdaemon(常駐プログラム)であるsmartdを用いてドライブのS.M.A.R.T.情報を監視する方法を説明したい。

[背景]
筆者はこれまで、DriveDxを使ってきた。smartmontoolsもインストールしていたが、その使い方が十分理解できていなかった。
そんな時、いくつかある外付けドライブのうち2個が同時にissue(課題)があると、DriveDxがレポートしてきた。本当なのかも知れないが、両方ともSSDなので、ちょっと信じがたいと思った。
そこで、DriveDxの代わりになる手段はないものかと考え、元々インストールしていたsmartmontoolsについて調査したところ、smartdというdaemon(常駐プログラム)を用いれば良さそうなことが分かった。
しかし、Macでsmartdをdaemon(常駐プログラム)として動かす方法は、筆者が検索した限りでは見つからなかった。そこで、今更ながら、macOSでsmartdを動かす方法を、備忘録も兼ねて記述してみることにした。

[環境]
参考までに、筆者の環境を記載しておく
MacBook Air 2023 15.3inch(Apple Silicon M2)
macOS Sonoma 14.1.2

[手順]

  1. SAT Smart Driverのインストール
    外付け(リムーバブル)ドライブを監視する場合に必要となる。DriveDxのリリース元であるBinaryFruit社の以下のブログ記事からダウンロードして、インストールする。インストール時、リムーバブルドライブは、物理的にMacと切り離しておくこと。

    その際、Apple Siliconを搭載したMacは、カーネル機能拡張(kext)が無効になっているので、許可する。(macOS復旧での作業が必要)

  2. smartmontoolsのインストール
    macOS用のインストーラーパッケージが用意されているので、ダウンロードしてインストールする。間違っても、ソースからビルドしようとは、考えない事。
    なお、インストーラーパッケージは署名されていないので、右クリックから開くを選択する。

  3. smartmontoolsについて
    smartmontoolsは、起動後、所定の処理を実施後コマンドが自動的に終了するsmartctlと、起動後、自動的に終了しない、daemon(常駐プログラム)であるsmartdの二つで構成される。
    smartdは、起動されると、30分に1回(デフォルト値。可変)、接続された全(または指定された)ドライブにアクセスして、ドライブのS.M.A.R.T.情報を監視してくれる。(smartd manページより)

  4. smartd.confの設定(筆者の例)
    smartdは、smartd.confと呼ばれる設定ファイルを記述することにより、その動作を設定できる。以下に筆者の設定を例として示す。

    1. オリジナルのsmartd.confをリネームして保存

                              cd /private/etc/
                              sudo mv smartd.conf smartd.conf.orig
                          
    2. 自分のsmartd.confを作成

                              cd /private/etc/
                              sudo vim smartd.conf
                          

      記述する内容

      # This is configuration for smartd on my MacBook Air 2023 15
      
      # /dev/disk0 -M test -m roushi@localhost # For E-Mail test
      
      # /dev/disk0(Startup Disk) is NVMe, so excluded from DEVICESCAN. Thus I
      # intentionally add as diffrent device.
      #
      # See https://bugs.launchpad.net/ubuntu/+source/smartmontools/+bug/1685332
      #
      /dev/disk0 -d nvme \                 # Disk is NVMe
                 -H \                      # Check NVMe device health
                 -l error \                # Check NVMe error count
                 -m roushi@localhost       # Send E-Mail to this address
      
      DEVICESCAN -d removable \            # Disk is removable
                 -o on \                   # Automatic test when smartd starts
                 -m roushi@localhost       # Send E-Mail to this address
                          

      簡単な解説

      • 3行目。#がついているのは、E-Mailのテスト用。テスト時にコメント(#)を外し、テスト後はコメントアウトする。

      • 10行目。-dディレクティブは、デバイスのタイプを指定する。
        起動ディスクはNVMeデバイスのため、それを指定する。

      • 11, 12行目。NVMeデバイスでサポートされるのは、この2項目のみ。

      • 16行目。DEVICESCANは、接続された全ドライブを監視対象にするという意味。

      • 同16行目。この-dディレクティブは、DEVICESCAN対象デバイスのタイプが、リムーバブルであることを指定する。
        これがないと、smartdは、ドライブが取り外されて見つからない時にFailedOpenDeviceというメールを送ってくる。

      • 17行目。-oディレクティブは、onにしておくと、smartdが起動して以降4時間毎にSMART自動オフラインテストを実行する。

      • 14, 18行目。-mディレクティブは、送信したいメールアドレスを指定する。

      • あえて削ったもの

        -aディレクティブ
        ググって良く目にする-aディレクティブはない。理由は、ATAデバイスではデフォルトのため。(smartd.conf manページによる)

        -sディレクティブ
        セルフテストのスケジューリングを指定する。筆者は、smartdデフォルトのスキャンで十分と考えたので外した。
        ショートテストを毎日2-3時に、ロングテストを毎週土曜日3-4時に実行する場合、以下のようにする。

                                        -s (S/../.././02|L/../../6/03)
                                    
  5. launchd plistの作成とロード
    smartdは、起動されれば、daemon(常駐プログラム)として動作するが、システム(OS)の起動・再起動や、ユーザーのログイン・ログアウトなどで終了した際、自動起動させる必要がある。Macでは、launchdを使えば、これを実現できる。

    1. launchd plistの作成

                          cd ~/Library/LaunchAgents
                          vim jp.xxxx.smartd.plist
                      

      xxxxには、自分の名字をローマ字で入れる。(リバースドメイン名)

      記述する内容

                          <?xml version="1.0" encoding="UTF-8"?>
                          <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" 
                          "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
                          <plist version="1.0">
                              <dict>
                                  <key>Label</key>
                                  <string>jp.xxxx.smartd</string>
                                  <key>ProgramArguments</key>
                                  <array>
                                      <string>/Path/To/executeSmartd.sh</string>
                                  <key>RunAtLoad</key>
                                  <true/>
                              </dict>
                          </plist>
                      

      10行目、samartd起動用シェルスクリプトのパスは、次項で作成するシェルスクリプトの絶対パスを記入する。

    2. samartd起動用シェルスクリプト
      筆者はユーザレベルのLibraryフォルダにLaunchAgentsScriptsというフォルダを設け、そこにスクリプトを保存している。

                          cd ~/Library
                          mkdir -p LaunchAgentsScripts
                          cd LaunchAgentsScripts
                          vim executeSmartd.sh
                      

      記述内容

                          #!/bin/sh
                          #
                          # Execute smartd when it is not running
                          # 2022.11.13 桃源老師
                          #
      
                          # To get command exit status itself, command 
                          # result should be redirected to /dev/null
                          smartd_status=`ps aux | grep smartd | grep -v grep > /dev/null 2>&1 ; echo $?`
      
                          if [ $smartd_status -eq 1 ]; then
                              eval /usr/local/sbin/smartd
                              echo `ps aux | grep smartd | grep -v grep` >> $HOME/Library/Logs/smartd_status.log
                          fi
                      

      スクリプト実行権の付与

                          chmod +x executeSmartd.sh
                      
    3. launchd plistのロード

                          cd ~/Library/LaunchAgents
                          launchctl load -w jp.xxxx.smartd.plist
                      
    4. smartd設定ファイルの再読み込み
      ひとたびlaunchdにより起動されたsmartd設定ファイルを再読み込みするには、以下のコマンドを用いる。

                          killall -HUP smartd
                      

[補足]
smartdの挙動について以下を確認した。

  • 外付けデバイスを、smartd稼働中に接続しても、監視対象にはならない事を確認した。(デバッグモード=’smartd -d’で確認)

    これは推測だが、DEVICESCAN機能が働くのは、smartdの設定ファイルであるsmartd.confを再読み込みした場合のみと思われる。

    つまり、ポータブルMacなどで、外付けデバイスの構成が変わったら、smartd.confの再読み込みが必要と思われる。

  • 外付けデバイスをマウントしていなくても、接続されていれば監視しに行く事を確認した。

  • 物理的に切断した場合、’removed ATA device: No such file or directory’となる。

  • 再接続すると、’reconnected ATA device’となる。

  • 上記smartd.conf設定にて、smartdを起動/再起動すると、Macの内蔵SSDからのS.M.A.R.T.情報取得に失敗した旨のメールが1度だけ届く。

[参考サイト]

以上。

この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL