久々に技術寄りの記事であるな。
QNAP TS-121に、外付けHDDケース(WD Red 4TB入り)をeSATAで接続して、Q-RAID1とかいう怪しいブツでミラーリングを始めたのであるが。
どうも外部接続ドライブに対するSMARTの監視方法が見当たらないのだ。それ困るじゃん?
SMARTで寿命の予測なんか出来ないけど、壊れた時にSMART監視ソフトで気付くということは結構あるからなあ。
つーかQ-RAID1とかいう変なのを使うくらいなら素直に2ベイのQNAP買ってRAID1で良かったんじゃね、って思う人がそろそろ多数かもしんないけど、「RAID1で二台まとめて死にました」の記憶が哀しすぎるので、まだまだ我が道を行くのである。普通は2ベイの方がいい気もしますが。
元々、Q-RAID1なんて仕様不明のブツ使わんで、QNAPもう一台買ってホットスタンバイだぜー、とか思ってたんだけどさ。高いので。ここは過渡的な環境ってことで一つ。使ってる人が少なそうな機能に依存するのは危険な気もするのだが。
まあ、ベイの数はどうでもいいや。本題に進もう。
QNAP使ってたら、smartmontoolsを使いたい人も多いと思うんですよ。CrystalDiskInfoみたいに、代替処理が入ったら即警告するレベルならいいんだけど、QNAPの報告機能がどんな基準なのか分からんしさー。SMARTの標準だとすげー緩い基準だし。
なので、ipkg版smartmontoolsを試してみたけど、
[~] # ipkg install smartmontools
Installing smartmontools (5.40-3) to root...
Downloading http://ipkg.nslu2-linux.org/feeds/optware/cs08q1armel/cross/unstable/smartmontools_5.40-3_arm.ipk
Configuring smartmontools
#################################################################
#
# To automatically start smartd on bootup, edit
#
# /opt/etc/init.d/S20smartmontools
#
# and follow the instructions in this file. smartd can be
# configured in /opt/etc/smartd.conf
#
#################################################################
Successfully terminated.
[~] # smartctl -i /dev/sda3
smartctl 5.40 2010-10-16 r3189 [arm-none-linux-gnueabi] (local build)
Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net
Segmentation fault
[~] # ipkg remove smartmontools
Removing package smartmontools from root...
smartd: no process found
Successfully terminated.
[~] #
こんな感じでセグフォするので消した。
原因はどうやら、smartmontoolsが5.39でC++の新しい機能を使うようになって、GCC 4.2.3がARMだとダイヤモンド継承絡みの最適化でバグるとか何とか。でもダイヤモンド継承は必要だから使ってるらしい。GCCを-fno-toplevel-reorder
で走らせれば動くぜ、と。なるほど。このipkg版の存在する意味が分からんな。
つまりあれだな、QNAPでGCC使えるようにしないと駄目か。めんどくせえ予感。Debian化しちゃう人の気持ちが少し分かる気もした。
調べてるうちに、QNAPにデフォで入ってる/sbin/nasutil
にsymlinkしてるget_hd_smartinfo
でSMART情報が取れる、と判明。
[~] # get_hd_smartinfo
Usage: get_hd_smartinfo [OPTION]...
Print HardDisk SMART Information.
-h, Display this help and exit.
-d, NUM Set disk number. (NUM > 0)
-i, Timer Interval.(sec)
-o, When -i exist,save to output File.(default save to /tmp/sd[a-g]_smart_xxxx)
-m, When -i exist,mask attribute ID number(e.g -m 194,131)
[~] # get_hd_smartinfo -d 1
001 Raw_Read_Error_Rate 0 200 200 051 OK
003 Spin_Up_Time 6008 219 219 021 OK
004 Start_Stop_Count 7 100 100 000 OK
005 Reallocated_Sector_Ct 0 200 200 140 OK
007 Seek_Error_Rate 0 200 200 000 OK
009 Power_On_Hours 334 100 100 000 OK
010 Spin_Retry_Count 0 100 253 000 OK
011 Calibration_Retry_Count 0 100 253 000 OK
012 Power_Cycle_Count 2 100 100 000 OK
192 Power-Off_Retract_Count 1 200 200 000 OK
193 Load_Cycle_Count 2509 200 200 000 OK
194 Temperature_Celsius 37 115 113 000 OK
196 Reallocated_Event_Count 0 200 200 000 OK
197 Current_Pending_Sector 0 200 200 000 OK
198 Offline_Uncorrectable 0 100 253 000 OK
199 UDMA_CRC_Error_Count 0 200 200 000 OK
200 Multi_Zone_Error_Rate 0 100 253 000 OK
[~] #
なるほど。193のLoad_Cycle_Count
が凄いけど気にしないぜ。005と196と197と198が0ならいいのよ。
こいつにPythonでも組み合わせれば自動監視も楽勝かなーと思ったけど、eSATAとかUSBとかに接続したドライブを指定出来ない模様。外部ドライブにも対応してくれよーとか、外部ドライブのSMART情報取る方法どこにも無いんだけどーとか、フォーラムで要望出した人はいたんだけど、中の人に「NASに何を求めてるんすか」みたいな感じで切り捨てられてた。うむ。QNAP買ったの間違いだったろうか、という気分に少しなったな。安いPC買った方が良かった説も。
その要望のところに、smartmontoolsでも取れなかった、みたいに書いてあるのが不吉だけど、まあ試してみよう。
えーと、QNAPでsmartmontoolsを動かせた人の話は、と。Projekt Qnap(追記:多分閉鎖?)ってとこにあるな。
割とそのまま素直な内容に見えるので、必要最小限っぽいところを切り出して軽くアレンジ。
cd /tmp
ipkg install make
ipkg install gcc
ipkg install grep
ipkg install gawk
ipkg install optware-devel
export PATH=/opt/bin:$PATH
wget 最新版URL
# http://sourceforge.net/projects/smartmontools/files/ の中に最新版がある筈
tar zxf smartmontools-バージョン番号.tar.gz
cd smartmontools-バージョン番号
./configure CXXFLAGS='-g -O2 -fno-toplevel-reorder -Wall -W'
make
make install
update-smart-drivedb
ってとこか。ipkg install
は一行にまとめられそうな気もするけど。
なお、この記事を書いた時点では、smartmontoolsは6.2が最新版である。
んで、インストール実行。
あっさり完了。
んじゃー走らすか。df
した感じだと、eSATAは/dev/sdz
みたいだから、
[~] # smartctl -d marvell -a /dev/sdz
と。-d marvell
は重要。(追記:QTSとsmartmontoolsを両方更新したら、/dev/sdz
→/dev/sdza
、-d marvell
→-d sat
にそれぞれ変更しないと駄目になった)
で、行けた。ちゃんと情報表示されてるじゃーん。良かった良かった。
でもさー、こんくらいnasutil
で対応させらんないのかね。いいけどさ。
次は、監視させる訳だが、smartd
で行けるかどうか。
監視基準は、CrystalDiskInfoと同等でいいや。監視対象は/dev/sda
と/dev/sdz
の両方にしよう。となると、どうすればいいのかな。えーと。
QNAPで任意のアプリケーションを自動的に起動させる方法から調べてみようか。QNAPedia Community Wikiの記事を参考に、なるべく素直に真似する感じで。
今のファームでも通用するやり方は、QPKGでパッケージがインストールされてるフリをする方法っぽい。
サンプルを真似して、/etc/config/qpkg.conf
の下の方に、以下の内容を追加してみる。
[autorunSmartmontools]
Name = Autorun Smartmontools
Version = 6.2
Author = autorun
Date = 2013-12-03
Shell = /share/HDA_DATA/.qpkg/autorun/smartd.sh
Install_Path = /share/HDA_DATA/.qpkg/autorun
QPKG_File = autorun_smartmontools.qpkg
Enable = TRUE
ブラウザでApp Centerを開くと、おー、マイアプリに登録されてる。あとはこの内容通りに/share/HDA_DATA/.qpkg/autorun
ディレクトリを作成して、その中に必要なファイル一式を作れば良さそうだな。
なお、このシステムはRAMディスクにマウントされてる場所が非常に多いので、HDD上に実体のあるディレクトリに置かないと再起動で何も無かったことになる。TS-121だと/share/HDA_DATA
が良さげだけど、機種によって場所は変わる模様。
あと、QPKG_File
の指定は、どうせ存在しないので適当な名前にした。平気かどうか知らんけど。
上のShell
ってとこに指定したのが起動スクリプトらしいので、今度はそのsmartd.sh
を書く。
#!/bin/sh
/usr/local/sbin/smartd -c /share/HDA_DATA/.qpkg/autorun/smartd.conf --interval=600 -p /var/run/smartd.pid
ってとこか。
インターバルは、まあ、デフォの30分でいい気もするけど、何となく10分に。別に固まったりもしないようだし、1分くらいでもいいかもなあ。
smartd.conf
は、デフォの/usr/local/etc/smartd.conf
は変更せず、起動スクリプトと同じ場所に一から作ることに。
PIDファイルは、まあ、あって困ることも無いから指定しておく。
次は、smartd.conf
。飽きてきたが適当に頑張ろう。
DEFAULT -d marvell -n standby,q -a -R 5! -s S/../.././02 -s L/../01/./08 -m foo@example.com -M exec /share/HDA_DATA/.qpkg/autorun/smartd-mailer.sh
/dev/sda
/dev/sdz
こんな感じかねー。
-n standby,q
は、スタンバイモードで止まってる時にSMART読みでスピンアップさせない為に指定。まあ、スピンダウンしない設定にしてる筈だけど一応。
-R 5!
は、代替セクタが出た時に致命的と判定させたいので指定。
まあ、何かやたらと色々指定出来るので便利そうだ。後で不都合なことがあったらまた設定を弄ってみよう。
と、説明を端折ったけれども、最後の-M
の指定は説明せんとくん。
これは、smartdのエラー報告をメールでやらせたい時に、どうやって送るかを指定するオプションなんだけど、無指定だとmail
経由で送るらしい。QNAPには存在しません。うむ。
QNAPでスクリプトからメールを送る方法をフォーラムで探すと、sendmail -t
を使ったら行けた、とのこと。一方、送信者であるsmartdの仕様は、mail
が駄目な場合はスクリプトに渡すのが一番楽っぽい。
以上により、-M exec /share/HDA_DATA/.qpkg/autorun/smartd-mailer.sh
という指定が入っているのであった。
ということで、smartd-mailer.sh
を書こう。
#!/bin/sh
{ echo -n -e "To: $SMARTD_ADDRESS\nSubject: $SMARTD_SUBJECT\n\n"; cat; } | /usr/sbin/sendmail -t
これでどうだ。
んで、忘れずにまとめてchmod u+x *.sh
をしておく。
最後に、メールテストの為にsmartd.conf
の一行目の末尾に-M test
を追加して、
[~] # /share/HDA_DATA/.qpkg/autorun/smartd.sh
で起動。よし、テストメールが正常に届いた。メールクライアント側で迷惑メールに入らないように設定して(重要)、さっき追加した-M test
を消して、起動し直して、終わりー。うへー。疲れたわー。
でも、実際にSMARTエラーが発生した時にちゃんと動くのか不明。一見動きそうに見えるけど、「これじゃ動かねーよバーカ」とかあったら是非コメントを。
そして、Q-RAID1とやらのミラーリングは糞遅かった。eSATAなんだし、もーちょい何とかならんのかな。ps
で見る限り、rsync 3.0.7を改造して動いてるっぽい雰囲気ではあるけど、何でこんなに遅いんだろう。
いつまでも終わらないし、終わるまでは再起動もしたくないんで、smartdが自動で起動するかのテストも出来ないのだが。失敗したら報告の記事書いて、ここに追記もすればいいか。
Q-RAID1がハードリンクをちゃんと処理するかとかも確認するつもりだったけど、こっちは特に異様なことが起きなければ報告の記事は書かなくて良さそうかなー。
追記:
Q-RAID1はハードリンクを理解しなかった。フォーラムでも六年以上前に「-H
付けて」「検討しとくわ」ってやり取りがあったんで、分かってるけど放置っぽい。これも「所詮NASですから」ってことかね。
まあ、データ置き場にハードリンクなんて普通使わないだろ、って言われればそれまでだが。世代管理出来ないなーどうしよう。
追記2:
再起動したらsmartdは自動起動しなかった。ぐぬぬ。Q-RAID1は頭から同期し直しだけど10分くらいで完了。まあただのローカルrsyncみたいだしな。
自動起動は、調べても今一つ良く分からんし、もうめんどくせーから多重起動対策した起動スクリプトをcronで毎時間起動とかで誤魔化すかなー。
追記3:
ファームを更新(QTS4.0.6→4.1.0)したらsmartmontoolsのtarball取ってくるとこからやり直しになった。毎回必要かは分からんけど。若干めんどくせー。インストール先をHDA_DATAの中にした方が良かったかも?
で、smartmontoolsも6.2→6.3.1になって、QTSとsmartmontoolsのどっちのせいか分からんけどややこしい問題多発。対応した設定は本文中に追記。
更にVLANとかGmailセキュリティ強化とかの都合でうまくメールも届かず、面倒なのでPythonでemailとsmtplibを使ってsmartd-mailer.py
とか書いて解決。SMTP認証をスクリプトで書くと何か気持ち悪いが。実に色々と面倒であった。
つーことで、元から不親切な記事だったけど、いよいよ使いにくい記事になった。俺だって「これコピペすりゃ大体使えるぜー」って記事にしたい気はするんだけども何だかだるくてもー。