ホーム » 技術 » 自宅NASをSMARTで監視する

自宅NASをSMARTで監視する

最近在宅ワークにシフトした結果、オフィスで提供されてきた共有ファイルサーバが利用できなくなり、自分でファイルストレージを何とかしなければならないという相談を受けるケースが増えてきた。これに対する答えはいろいろあって、クラウドサービスを使って外部に置くなんていうのもアリだが、自分は5年ほど自宅でNASを運用しているのでこれをオススメしている。ただNASの運用はそれなりに面倒だ。特にディスクドライブを複数搭載し、RAID構成にしている場合の監視はいろいろテクニックを要する。

本稿ではSMARTによるディスクドライブ監視を中心に、NASの運用手法について説明する。

NASの選択と運用ポリシーの決定

最初にお断りしておくが、本稿ではバックアップについては何も説明しない。絶対に失いたくない大切なデータをどうしたらよいかは、ぜひ自分で考えていただきたい。本稿で示すNASのRAID運用と監視は「壊れやすいディスクドライブを相手に、できるだけ素早く復旧を目指す方法」を説明するものであって、データをロストする可能性はゼロではない。自分はバックアップを別の方法で取っているが、本稿の趣旨と外れるので説明しない。

さて、どんなNAS製品を選ぶかは、だいたい以下のような基準になる。

  • RAIDが利用できること。自分はRAID5が使いたいのでこれをサポートしていること。搭載ディスク数は4ぐらいが妥当だが、ぼちぼち6ぐらいのを買ってもよいかも
  • ディスクドライブの故障を検知できなければならない。予知できればなおよい
    • 具体的にはモニタリングに対応していて、検知・発報の仕組みが作れる
    • 検知・予知としてはSMART対応(情報を読み取り外部に発信できる機能)が欲しい
  • ディスクドライブを交換し、復帰できなければならない
    • ディスクが故障したとかRAIDがdegradeしたとき、新しいディスクに交換したとして、ちゃんとrebuildできるかなど、基本的な機能が正しく動くこと。以外にこれが動かないNAS製品が存在する
    • rebuildに法外な時間がかかるという製品もあるようだ
    • hotswapとか、ダウンタイムゼロとか、そういう機能は求めない(高くつく)

書いてみるとシンプルだが、これを本当に確実にできるか、それを選択できるかというのが問題になる。つまり信頼の話になってしまう。

経験から言えば業務用のメーカーや製品を選びたいが、そんなものを自宅に置くコストもスペースもない。自家用となると経験やノウハウが乏しくなって選択肢が狭まってしまうのだが、幸いQNAP製品については業務上のお付き合いと運用実績があったため、5年ほど前からTS-451、去年からTS-453Beの2台を自宅で使っている。

NASにはディスクドライブを複数搭載し、RAIDを構成して障害に備える。RAIDにはさまざまなタイプがあるが、自分は4ドライブのRAID5構成にしている。これは1台のドライブ故障ならば許容される。故障した1台を交換して再構築できればデータをロストせずに復旧できる。これは言い換えれば、2台のドライブが同時に壊れる可能性はそれほど高くないという仮定に基づいている。

「2台のディスクドライブは同時に壊れない」という仮定は、言い換えれば「2台目が壊れる前に故障したディスクを交換して復旧できるはずだ」という仮定を含んでいる。実はこういう仮定は単なる確率論なので非常に甘い。だが可能性を言い出したらきりがないので、この議論もあまり突き詰めないことにする。いずれにせよRAIDはデータを100%保証する技術ではない。「故障時したストレージを素早く復旧させる技術」と思っておいた方がよく、データをロストしない技術と考えるのは完全な誤解だ。なのでバックアップ手段はまったく別の手段を検討しなければならない。繰り返すが、本稿ではバックアップについては議論しない。大事なことなので二度書いた。

ここでのポイントは、1台が壊れたらすぐに検知して、急いで交換する必要があるということだ。そのための検知・感知システムを構築する必要がある。

QNAPの監視と検知

QNAPの標準のSMART情報確認機能は、GUIから見られるこんな画面だ。

QNAPの「健康状態」ダイアログの例

本来SMART情報は多数のパラメータを採取しているはずだが、不良セクタ数と温度以外は「良好」という言葉で要約されてしまっている。もっと多くの情報に基づいて故障予知をしたいのだが、それができない状況なのだ。

しかしQNAPはLinuxで動作するソフトウェアRAIDマシンなので、コンソールからログインして情報を取ることは可能である。自分はおおむね以下のようなことをやっている。

  • Zabbix agentのインストール
  • smartmontoolsのインストール
    標準のget_hd_smartinfoは利用できないため別途導入した
    • これを用いたZabbix agent経由の監視

順番に説明していこう。

QNAP Clubからツールをインストール

QNAPでのアプリケーションのインストールは、GUIのApp Centerから行うのが無難だ。パッケージ化されたミドルウェアやアプリケーションをここからインストールすることができる。今回インストールしたいZabbixとsmartmontoolsはQnap Clubというパッケージrepoからインストールできるので、これを導入する。手順は……1年前のことで忘れてしまったので示せない。デフォルトで使えるんだっけな?

Zabbix-agentとsmartmontoolsは検索すればイッパツで見つかるので、さっさとインストールしてしまうとよい。ほかにもいろいろ便利なツールがあるので、お好みで入れればよいと思う。

App CenterとQnap Club

Zabbix-agentの設定

App CenterからインストールしたZabbix-agentは/opt/ZabbixAgentに格納される。この配下のetcディレクトリにいつも通りの.confが配置されているので、これを編集すればよい。一応列挙すると

  • Server=
  • ServerActive=
  • Hostname=

ぐらいか。ひとつ注意するべきなのは、Includeが設定されていないので次の一行を追加しておくべきであるということだ。

Include=/opt/ZabbixAgent/etc/zabbix_agentd.conf.d/

これでZabbix監視ができるようになる。

余談だが、/opt/ZabbixAgentのシンボリックリンクはZabbix-agentサービスを停止すると削除される(起動すると作成される)ので注意してほしい。

SMART情報の引き出しと監視

さて続いてSMART情報の引っ張り出し方だ。QNAP関連の情報を検索しているとget_hd_smartinfoを使えば簡単だというページがいくつも見つかる。ところが自宅で導入した製品では、これがマトモに動作しない。サポートしていない機種があるようなのだ。仕方がないのでQNAP Club経由でsmartmontoolsをインストールし、smartctlコマンドを使おうということになる。

smartctlを使うと、こんな感じでデータを引っ張り出せる。

[admin@oliphaunt ~]# smartctl -d ata -A -i /dev/sda
smartctl 6.5 (build date Oct 22 2017) [x86_64-linux-4.14.24-qnap] (local build)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Device Model:     WDC WD80EFAX-68KNBN0
Serial Number:    VAHX6RHL
LU WWN Device Id: 5 000cca 099daeb24
Firmware Version: 81.00A81
User Capacity:    8,001,563,222,016 bytes [8.00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    5400 rpm
Form Factor:      3.5 inches
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   ACS-2, ATA8-ACS T13/1699-D revision 4
SATA Version is:  SATA 3.2, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is:    Fri Aug 21 15:07:04 2020 JST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000b   100   100   016    Pre-fail  Always       -       0
  2 Throughput_Performance  0x0004   128   128   054    Old_age   Offline      -       108
  3 Spin_Up_Time            0x0007   208   208   024    Pre-fail  Always       -       368 (Average 414)
  4 Start_Stop_Count        0x0012   100   100   000    Old_age   Always       -       182
  5 Reallocated_Sector_Ct   0x0033   100   100   005    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000a   100   100   067    Old_age   Always       -       0
  8 Seek_Time_Performance   0x0004   128   128   020    Old_age   Offline      -       18
  9 Power_On_Hours          0x0012   099   099   000    Old_age   Always       -       12352
 10 Spin_Retry_Count        0x0012   100   100   060    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       4
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       679
193 Load_Cycle_Count        0x0012   100   100   000    Old_age   Always       -       679
194 Temperature_Celsius     0x0002   135   135   000    Old_age   Always       -       48 (Min/Max 22/54)
196 Reallocated_Event_Count 0x0032   100   100   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0022   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0008   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x000a   200   200   000    Old_age   Always       -       0

SMARTの出力結果の見方には俗説がいろいろ流れているが、自分は基本的にRAW VALUEしか見ない。理由は後半を見ると分かる。というわけで17項目の情報が無事に引き出せた。ドライブ名を指定していけば、それぞれのドライブのデータが個別に見られる。

Zabbix-agentでこれをモニタリングしたいので、UserParameterで設定する。まず最初に、/opt/ZabbixAgent/etc/zabbix_agentd.conf.d/smart.confファイルを用意する。内容はこんな感じ。

UserParameter=hdd.smart[*],sudo /usr/sbin/smartctl -d ata -A /dev/$1 | grep $2 | awk '{ print $$10 }'

解説すると、Zabbixにhdd.smart[dev,name]というキーを作成する。デバイス名で引いたSMART情報からnameでgrepし、その10番目のカラムを返せばよいというわけだ。

コマンドラインを見ると分かるが、smartctlはsudoしなければならない。というのもadmin(QNAPでのroot)権限がないとドライブ情報が読めないのだが、Zabbix-agentはzabbixユーザで動作しているからだ。そこで/usr/etc/sudoersに次の行を追加する。

zabbix ALL=(ALL) NOPASSWD: /usr/sbin/smartctl -d ata -A /dev/sd?

これでパスワードなしの特権でこのコマンドだけ使えるようになる。

こうしておいて、Zabbix-agentを再起動する。再起動は(めんどうだが)QNAPのGUIからボタンをポチポチして行う。再起動できたらサーバからテストする。

[north@xorn ~]$ zabbix_get -s oliphaunt -k hdd.smart[sda,Temp]
48
[north@xorn ~]$ zabbix_get -s oliphaunt -k hdd.smart[sda,Raw_Read_Error_Rate]
0

あとはSMART情報を監視し、トリガを設定すればよい。

SMARTをどう見たらよいのか

さて17項目のSMART情報が引き出せた、と書いた。ではそれをどのように評価したらよいのか。どのパラメータは、どこまで許容できるのか。

ここで参考になるのがGoogleの論文だ。

これを乱暴に要約するとこうなる。

  • Googleがサービスで利用している10万台以上に及ぶディスクからデータを収集
    • そのうち故障したディスクを分析し、原因を調査
  • SMARTの以下のパラメータのうち、1つでも0を超えたら、60日後の故障確率は14倍から39倍になる
    • 1 Raw_Read_Error_Rate
    • 5 Reallocated_Sector_Ct
    • 196 Reallocated_Event_Count
    • 197 Current_Pending_Sector
    • 198 Offline_Uncorrectable
  • ただし、故障ディスクの56%は上記のカウントが0だったにも関わらず壊れていた
  • 温度を除くすべてのSMARTパラメータを考慮に入れても、36%以上のドライブがカウント0で壊れた

つまりSMART情報のみに頼っていてはドライブが故障するか否かを予知できない。SMARTで異常値を検知したらすぐに交換するべきだが、SMARTが正常だからといって安心することはできない。

以上から言えるのは、ひとまず代表的な5つのSMART指標について監視トリガを作成し、ひとつでも0を超えたら発報するようにするべきということだ。

degradeを検知する

さて、ドライブは突然故障しうるのだから、SMART監視とは別にRAIDが維持されているかを別に監視しなければならない。そこでRAIDのdegradeをトラップしたい。この目的にはmdadmコマンドが利用できる。正常時にはこのような応答になる。

[admin@oliphaunt ~]# mdadm -D /dev/md1
/dev/md1:
        Version : 1.0
  Creation Time : Mon Mar 25 23:27:18 2019
     Raid Level : raid5
     Array Size : 23412214272 (22327.63 GiB 23974.11 GB)
  Used Dev Size : 7804071424 (7442.54 GiB 7991.37 GB)
   Raid Devices : 4
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Fri Aug 21 18:03:06 2020
          State : clean
 Active Devices : 4
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 512K

           Name : 1
           UUID : a1aa5fb6:f3210212:403c6c9d:b4178e3d
         Events : 3025

    Number   Major   Minor   RaidDevice State
       0       8       35        0      active sync   /dev/sdc3
       1       8       51        1      active sync   /dev/sdd3
       2       8        3        2      active sync   /dev/sda3
       3       8       19        3      active sync   /dev/sdb3

RAIDがdegradeすると「State」のところに「degraded」と表示される。これを検知できれば良い。そのほかに役立つ情報として、Active|Working|Failed Devicesの数を記録しておけば故障履歴が取れるだろう。

これに基づいてUserParameterを定義してみる。次のような内容の/opt/ZabbixAgent/etc/zabbix_agentd.conf.d/raid.confファイルを用意する。

UserParameter=raid.state[*],if sudo mdadm -D /dev/$1 | grep -q 'State :.*degrade'; then echo 0; else echo 1; fi
UserParameter=raid.failed[*],sudo mdadm -D /dev/$1 | awk '/Failed Devices/ { print $$NF }'
UserParameter=raid.active[*],sudo mdadm -D /dev/$1 | awk '/Active Devices/ { print $$NF }'
UserParameter=raid.working[*],sudo mdadm -D /dev/$1 | awk '/Working Devices/ { print $$NF }'

mdadmを利用するにあたっては、こちらもsudoが必要なので、/usr/etc/sudoersに次の行を追加する。

zabbix ALL=(ALL) NOPASSWD: /sbin/mdadm -D /dev/md*

RAIDが正常であれば、以下のパラメータは0を返す。

[north@xorn ~]$ zabbix_get -s oliphaunt -k raid.state[md1]
1

もしdegradeすると0になるので、これをトリガにしておく。他のパラメータについてはdegradeしたドライブ数をカウントするのに使えそうだ。少なくともActive Devicesは減るが、Failed Devicesは増えないようなので注意が必要のようだ。これらのパラメータはグラフ化して履歴としておくとよいと思う。

監視間隔だが、SMARTは1時間程度、RAIDのdegradeは15分間隔ぐらいでよいと思う。なぜこんな時間間隔かというと、ディスク故障を検知しても交換部品の買い付けにAmazonでオーダーするところから始めるので24時間以上かかるからだ。ちなみに過去5年間の運用でdegradeしたことが1度あり、その時は交換作業で無事に復旧させることができた。そういう意味でQNAPの機能は信頼している。

いずれにしてもエラーを検知したらすぐに対応が必要だ。発報についてはすぐに気づけるようにしておきたい。

オマケ:どのディスクドライブを買うべきか

まあお好きなメーカのを買えばいいんじゃないすか。これも当たり外れが大きいし、結局買ったディスクが壊れるか否かの問題なので……。ただテックニュースは一通りチェックしておいた方がいいですよ。トンデモない製品が出回っているんで。

参考リンク