先日より NAS の構築を行っているのですが、安全のために導入した UPS (無停電電源装置) が Synology の NAS に非対応でした…。
確認して買ったつもりで、品番を読み間違える (正 BN100T ↔ 誤 BW100T) という初歩的なミスを犯しました!
いやいいんです、供給電力が大きな UPS が欲しかったというのは事実ですし。
しかし、やはり大事なデータが急な停電などで破壊されたら困ります。そこで、なんとかして自動でシャットダウンできるようにしたので紹介します。
(2022-01-28 追記) DSM7.0 では、BW100T も認識されるようになりました!
Cronでルータを監視して異常発生時にシャットダウンさせる
実現できそうな手段はいくつか考えられます。
その中で現実的で仕組み的にどんな環境でも再現性良く動くであろう方法が見出しにもある通り、Cron でルータを監視するスクリプトを定時実行して、異常検出時に NAS を正規の手段でシャットダウンさせる、というものです。
以下の手順通りに行えば停電時に自動的に NAS がシャットダウンされます。
ただし、電源復旧時に自動復帰するような機能はありませんので停電が解消されたら自分で電源を入れて下さい。
ルータをUPSに接続しない
まず、環境構築としてルータは UPS に接続せず普通のコンセントに接続して下さい。
この時に停電が検出できるように UPS を接続するコンセントと同系統の回線にします。一つの延長コードに UPS とルータを接続すると確実ですね。
このように接続すると停電時、UPS に繋がれた NAS は電源が落ちず、ルータの電源だけが落ちることになります。
DSMでSSHを有効にする
続いて、Synology の NAS で SSH が使えるように有効化していきます。
Synology の NAS 専用 OS の DSM (DiskStation Manager) は殆ど普通の Linux なので SSH で接続すれば様々なコマンドで操作ができてしまいます!
ブラウザから NAS に接続してログインしておきます。
するとデスクトップにコントロールパネルがあると思いますのでこちらを開きます。
(ない場合は左上のメニューを開くとあるはずです)
コントロールパネルを開くと最後の方に「端末と SNMP」というアイコンがあるのでこちらを開きます。
ターミナルというタブに「SSH サービスを有効にする。」①にチェックを入れます。
ポート②は接続する際に使うので適当に設定して下さい。デフォルトは22番です。
デフォルト以外のポート番号を使う場合、変更したポートが他のサービスと競合しないように10,000番台を良く使います。
今回は SSH を LAN 外 (= WAN 空間、インターネット空間) に開放する必要がないのでデフォルトのままでも良いです。
設定出来たら右下の「適応」ボタンで設定を反映させます。
これで SSH クライアントから接続できます。個人的にはインストールなどが不要な PuTTY を良く使います。
接続・ログイン方法はそれぞれの SSH クライアントのソフトで確認して下さい。
ルータを監視するShellスクリプトを用意する
Shell スクリプトで適当にルータを監視するスクリプトを作成します。
Shell 内で使用するコマンドでパスが通っているか怪しそうならフルパスで書いた方が安全です。
私はルータに対してping
を行い、返答がなければその後1分間連続でping
が通らないことを確認してshutdown
させる仕様にしました。
面倒な方は、自己責任で以下コードを使用しても良いです。フルパスだったりそうじゃなかったり汚いですが。。
(2021/03/28 追記)
DSM (Synology NAS の専用 OS) を更新するとシステムドライブのデータは保持されないようなので保存場所を /volume1 (ボリュームが複数ある場合は任意のボリュームでOK) に変更しました。/etc/crontab
の設定はそのまま残ります。
#!/bin/sh
today=$(date '+%Y-%m-%d')
# Your Router IP
IP=192.168.0.1
# Log & Temporary Files
LOG_FILE="/volume1/etc/power-failure/log/${today}.log"
TMP_FILE='/volume1/etc/power-failure/ping.tmp'
start_date=$(date)
ping -w 5 $IP > $TMP_FILE
echo "Checking Start at $start_date" >> $LOG_FILE
ping_single=$(grep '100% packet loss' $TMP_FILE)
shutdown_pid=$(/bin/pidof shutdown)
if [[ -z $ping_single ]] && [[ -s $TMP_FILE ]]; then
echo " --> Router Active (1): $IP" >> $LOG_FILE
if [[ -n $shutdown_pid ]]; then
shutdown -c
echo " --> Router Restored, Shutdown is Canceled (PID: $shutdown_pid)" >> $LOG_FILE
fi
echo ' ' >> $LOG_FILE
else
echo " --> Checking Down?" >> $LOG_FILE
ping -c 6 -i 10 $IP > $TMP_FILE
ping_result=$(grep '100% packet loss' $TMP_FILE)
if [[ -n $ping_result ]] || [[ ! -s $TMP_FILE ]]; then
date=$(date)
echo " --> Router Inactive: $IP $date" >> $LOG_FILE
echo ' --> Shutdown NAS after 120sec...' >> $LOG_FILE
echo ' ' >> $LOG_FILE
/sbin/shutdown -hP 2
else
date=$(date)
echo " --> Router Active (2): $IP $date" >> $LOG_FILE
echo ' ' >> $LOG_FILE
fi
fi
DSM ではshutdown
コマンドの時間設定は分単位のようなので上記のようにshutdown -hP 2
にすると2分後にシャットダウン処理を行い停止して電源を落とします。
以下、上記のような Shell スクリプトを/volume1/etc/power-failure/router-chk.sh
に保存したものとして進めます。
違うディレクトリに保存した場合は適宜読み替えて進めて下さい。
また、ログファイルの保存ディレクトリも予め作成しておいて下さい。デフォルトでroot
ユーザは読み書き可能なパーミッションだと思いますが、書き込み権限がなければ追加して下さい。
ディレクトリ作成はsudo mkdir /volume1/etc/power-failure/log
です。(相対パスでもOK)
パーミッションの設定はsudo chmod 644 /volume1/etc/power-failure/log
です。644
が権限でroot
は読書可能で、その他ユーザは読取専用となります。(こちらも相対パスで指定してもOK)
CronにShellスクリプトを登録する
続いて Cron という Linux などの Unix 系 OS でよく使われているスケジューラを用いて決まった時間にルータが正常に動いているか確認します。
この確認には Shell スクリプトと呼ばれるコマンドを自動的に実行するものを使って処理を行います。
Cron への登録は GUI からも行えますが、私が試したところ実行時間が長いとタイムアウトされてしまうようなので直接設定ファイルに記述します。
もしかしたら普通にできるかもしれません。試す場合は、コントロールパネル → タイムスケジューラ → 作成 → 予約タスク → ユーザ指定のスクリプト、から以下の設定を行って下さい。
※ここで設定したタスクは DSM で管理されるようです。
SSH で Synology NAS にログインしたら以下のコマンドを打って下さい。
パスワード入力を求められるので管理者のパスワードを入力します。(DSM のインストール時に設定したパスワード)
sudo vi /etc/crontab
内容は人それぞれで異なると思います。こんな感じの画面が出ればOKです。
4行目以降がスケージュールされた処理になります。最後の2行が DSM のタイムスケジューラで管理された処理です。(S.M.A.R.T など)
上記画像には既に追加してしまっていますが、以下の設定を追記して下さい。
設定の順番は特に関係ないので最後に追加すれば良いでしょう。(GUI のタイムスケジューラを変更すると勝手に順番は変わります)
vi
で編集する際はキーボードの “i” で文字入力可能になります。(INSERT モード)
*/5 * * * * root /usr/bin/timeout 240 /volume1/etc/power-failure/router-chk.sh
左から分、時、日、月、曜日のいつに実行するかを指定します。その次は実行ユーザ名と実行するコマンドです。
時間の細かい指定方法はググってもらえればすぐに出てきますので検索してみ下さい。
上記の場合は */5 で5分おきに実行します。(毎日、毎時です)
/etc/crontab の2行目でパスを通していますが、念のためにコマンドのtimeout
もフルパスで書いています。
このように書くとタイムアウト時間240秒で/volume1/etc/power-failure/router-chk.sh
を実行しろ、という意味になります。
以上のように設定が追加できたので Esc キーを押して編集モードを抜けて保存コマンド:wq
と打って Enter します。
(正確には:w
で上書き保存、:q
でエディタを閉じる、を同時に行っています)
Cronを再起動する
設定が保存出来たら Cron を再起動して設定を読み直しておきましょう。
再起動しないと設定が反映されないことがありますので以下コマンドで必ず再起動して下さい。
sudo synoservice -restart crond
普通の Linux だともう少し違うコマンドで再起動しますが、Synology の NAS はsynoservice
というものが管理しているようです。
※このコマンドを打っても画面上に再起動完了のメッセージなど表示されません。エラーがなければ正常です。
これで Cron による自動監視機能が設定できました。おつかれさまです。
動作を確認する
最後に本当に電源が切れるのかを確認しておきましょう。
有事の際に設定ミスでうまく動かなかった……ということにならないように確認は大事です。
確認といってもルータの電源を切ってみて、しばらくした後に NAS の電源が落ちることを確認するだけです。
私の Shell スクリプトを流用する場合は、ログファイルも生成しているのでログを見てちゃんと処理が進んでいるか見ておくと良いです。/volume1/etc/power-failure/log/YYYY-mm-dd.log
に保存してあります。
その他のボツ案
ボツ案と書いてますが、本当は実際に試してダメだった案です。
今回使った UPS (Omron BW100T) は、Cent OS 7.x 向けに管理用ソフトを提供しています。
このソフトを使うとネットワーク越しで複数の NAS やサーバ、PC などをシャットダウンできるという代物です。
DSM は、仮想マシン (Virtual Machin Manager) がインストールできるので仮想マシン上に Cent OS 7.x をインストールして上記ソフトを使って異常を受信しようという作戦です。
仮想マシンはホストマシン (この場合は Synology の NAS) の USB を使うことができるのでホストマシンが認識して仮想マシンにマウントできれば仮想マシン上で BW100T を USB 接続が実現できます。幸い、非対応の UPS でしたが USB 上はちゃんと認識されて仮想マシンにマウントまではできました。
しかし、BW100T を仮想マシンにマウントした状態で仮想マシンを起動させると USB のマウントが解除されてしまいました。
色々と設定を変えてやってみたのですが、起動と同時に解除されてしまう現象を解決できませんでした。
※普通の USB メモリは解除されず Cent OS 上からアクセスできました。
Cent OS がダメなのかと思って Windows を入れてみたんですが、こちらでもやはり解除されてしまい使えません。LiveDVD 対応の Ubuntu や Kona Linux を試してみたのですが同じくダメでしたのでゲスト OS の問題ではないようです。
(そもそも Windows だと重いし、長期起動には適さないのでうまくいっても仕方ないのですが)
というわけで、仮想マシンで USB 接続してネットワーク経由で NAS 本体をシャットダウンする作戦は失敗に終わりました。
うまくいったよ、という方はどんな方法だったかぜひ教えて下さい!
ちなみにですが、このソフト、普通の Windows 機 (Windows 10 Home) に入れてみてもうまく動きませんでした。。。
まとめ
以上、間違えて NAS に非対応の UPS を買っちゃった場合になんとかして停電時に自動シャットダウンさせる方法でした。
参考になる方は殆どいないと思いましが、NAS は Linux で出来ているんだよ~ということがなんとなく伝われば活用方法が広がるということで!
Synology は、ほぼ Linux みたいなので色々といじりたい方は Synology の NAS を選びましょう。
QNAP はまた少し違った感じみたいです。
コメントを残す