データ保存のために、使っていなかったパソコンでFREENASを稼働させました。
パワーのない旧型機でも大丈夫という触れ込みだったけど、ZSFで稼働させようとすると大量メモリを食うし、のめりこむとすごく高くつくんですね。
のめりこまないけど。
手動で電源のオンオフをするのは面倒くさいので、NAS専用機のようにメイン機と連動する形で運用したいと考えたが、さて、その方法は?
いろいろと難しく考えて、ネットで情報を検索したけれども見つからず、でもあきらめて自力でやってみると簡単にできてしまいました。
1.FREENASの起動
メイン機はWindows8.1。
フリーソフトの Wol.exe を タスクスケジューラで走らせると簡単に実現。
トリガーとして、ログオン時とスリープから復帰時を指定。
操作としてWol.exeを指定。
プログラム "D:\MyProgram Files\wol193\wol.exe"
引数の追加 /open=wol.ini /wake=1 FreeNAS
開始(オプション)D:\MyProgram Files\wol193
設定内容は、自分の環境にあわせてくださいね。
タスクスケジューラの登録方法を知っていれば簡単ですね。
2.FREENASの停止
難しいかなと思っていたところ意外と簡単。
PuttyでSSH接続してから、root配下に適当にフォルダを作り、そこに実行ファイルを作成。
(追記)SSH接続しなくてもSHELLから操作できます。
実行ファイルの内容は、PINGでメイン機が活きているかどうかをチェック。停止していたらshutdownを走らせる。
これをCron Jobに登録して一定間隔で実行するだけ。
実行ファイルの名前を onoffcheck として、 /root/masa/ 配下に配置。
onoffcheck や masa は任意の名前で良いのはもちろん。
実行ファイルの内容は、
*2015/1/30 Function で動作するように改良(末尾に追記)
------------------------------------------------
#!/bin/bash
onoff=0
ping -c 4 192.168.0.2
if [ $? = 0 ]
then
onoff=10
fi
if [ $onoff = 0 ]
then
shutdown -p now
fi
-----------------------------------------------
FreeBSDの場合、-c 4 のオプションがIPアドレスの前に来るので注意。
ちなみに、このオプションは pingチェックを4回繰り返す という意味。
もちろん、192.168.0.2 の部分は、自分のメイン機のIPアドレスで。
メイン機が複数ある場合は、 ping if then fi の部分を複数記述。
関数で記述する方法もあるでしょうが、ベタの方がわかりやすいかも。
Viコマンドなどで作り、chmodで実行権限を付与すればOK。
FREENASへは、WEBから、Tasks->Cron Jobで登録します。
User : root
Commmand : masa/onoffcheck > /dev/null
Every N minute : 5
Every N hour : 1
以下は、全チェック(デフォルト)
これで、5分毎にメイン機のオンオフをチェックする。
余計な画面出力を省くために、 > /den/null を付け加えています。
こんなに簡単だから、だれもネット上に載せていなかったのかも。
(追記)上記の実行ファイルをPytonで記述したコードもありらしい。
FileName shutdown.py で保存。
------------------------------------------------
#!/usr/bin/env python
from subprocess import Popen, PIPE
import os, sys
ip_list = []
###### IP addresses #####
# IP addresses go underneath this line, one on each line in the format: ip_list.append('x.x.x.x')
ip_list.append('192.168.0.2')
ip_list.append('192.168.0.3')
###### End IP addresses
shutdown = True
for ip in ip_list:
cmd = ['/sbin/ping', '-s 0', '-W 1', '-q', '-n' , '-c 1', ip]
p1 = Popen(cmd, stdout=PIPE, stderr=PIPE)
p1.wait()
statusText = p1.communicate()[0].split('\n')[3].strip()
if statusText.find(', 0.0% packet loss') > 0:
shutdown = False
if shutdown:
cmd = ['/sbin/shutdown', '-p', 'now']
p1 = Popen(cmd)
------------------------------------------------
(引用元)ttp://blog.graceabundant.com/2012/08/24/automatic-shutdownwake-up-on-freenas/
<追記> 2015/1/30
メイン機をリスタートして、UEFIを少しいじくっている間に、すぐにシャットダウンしてしまう事があった。5分ごとのイベントとメイン機の状態が同期していないため。
このため、メイン機が動作していない事を感知した後で2分間待機し、それでもメイン機が動作していなければシャットダウンするように改良した。
これに伴って、PINGチェックの部分は関数で記述した。
実行ファイルの内容は、
------------------------------------------------
#!/bin/bash
chkpings() {
chkping '192.168.0.71' '192.168.0.55'
return 0
}
chkping() {
while [ $# -ne 0 ]
do
ping -c 4 $1
if [ $? = 0 ]
then
onoff=10
fi
shift
done
return 0
}
onoff=0
chkpings
if [ $onoff = 0 ]
then
sleep 120
chkpings
if [ $onoff = 0 ]
then
shutdown -p now
fi
fi
exit 0
-----------------------------------------------