前のエントリーに書いたように、東京電力の計画停電に組み込まれた自宅は頻繁に停電するようになってしまったのでWebサーバーはさくらVPSに移動した。ただ、他にもファイルサーバーなど自宅サーバーはあるわけで、問題は自宅サーバーのシャットダウンである。いくら気を付けていても、仕事でミーティングに出てたりするとあっさり停電の直前のシャットダウンを忘れてしまう。その結果次に起動したときにRAIDのResyncなどが走り、精神衛生上よろしくないことこの上ない。UPSを検討したが2,3時間も給電するとすると結構な金額になる。しかもフレッツ・マンションタイプなので停電になったら自分だけ給電してもマンション内の電気系統は動かなくなるので自分の家だけ電源があってもダメだろう。
他にも一週間分の停電スケジュールを見てcronでシャットダウンを仕掛けるという方法も考えられるが、その日の電力使用量によって直前にあっさり停電がスキップされたりするのでこれまた難しく停電の有無は直前まで分からない。で、調べてみると計画停電カレンダーなる有り難いサイトがあるのを発見。しかも計画停電中止などの情報もタイムリーに更新されているようだ。
というわけで、まずこのGoogle カレンダーからRSSで情報を取ってきて、停電情報を提供するWebサービスを作ってGoogle Application Engineで公開してみました。ポイントはこのカレンダーに「中止」か「CANCELED」と書かれてたらキャンセルとみなしリアルタイムで反映されること。で、使い方は以下。たとえばグループ5で今後30分以内に計画停電があるかどうかはhttp://nextteiden.appspot.com/tokyo/g5/nextteiden/inminutes/30で判定することができる。
Base URL: http://nextteiden.appspot.com■nextteiden指定電力会社の指定グループの現時刻から次回の計画停電の開始の時刻を返す入力:書式: /(電力会社)/(グループ)/nextteiden電力会社:’tokyo’`もしくは’tohoku’(現状の対応はtokyoの東京電力のみ)グループ:g1〜g5例: /tokyo/g1/nextteiden出力:plain/textにて次回の停電の開始の時刻。存在しない場合は”None”例:’2011/03/27 14:24:46′エラー時には”ERROR: <理由>”を返す■nextteiden/inseconds指定電力会社の指定グループの現時刻から指定秒数以内に計画停電が予定されているかどうかを返す入力:書式: /(電力会社)/(グループ)/nextteiden/inseconds/(秒数)電力会社:’tokyo’`もしくは’tohoku’(現状の対応はtokyoの東京電力のみ)グループ:g1〜g5例: /tokyo/g1/nextteiden/inseconds/3600出力:plain/textにて指定した現時刻から秒数以内に計画停電が予定の有無を’Yes’と’No’で返す例:Yesエラー時には”ERROR: <理由>”を返す■nextteiden/inminutes上記nextteiden_insecondsと同様。指定は分単位■nextteiden/inhours上記nextteiden_inhoursと同様。指定は時間単位
そんでもって、10分おきに起動するシェル(teiden_shutdown.sh)を作ってみた。
#!/bin/sh
URL=’http://nextteiden.appspot.com/tokyo/g5/nextteiden/inminutes/20′
OUTFILE=/tmp/$$.teiden_shutdown.tmp
LOGFILE=/var/log/teiden_shutdown.logwget -q -t 3 -O $OUTFILE $URL
RET=$?if [ $RET -ne '0' ]
then
echo `date`’ FETCH ERROR’ >> $LOGFILE
exit 1
fiecho `date`’ ‘`cat $OUTFILE` >> $LOGFILE
if [ `cat $OUTFILE` = 'Yes' ]
then
echo ‘date” SHUTDOWN NOW’ >> $LOGFILE
shutdown -h now
firm $OUTFILE
今、このシェルを手持ちのVMのcronに設定して10分おきにcron起動するようにしてみた。10分おきに最大20分先の停電の有無を答えるので停電の10~20分前に自動でシャットダウンされるはずである。
というわけで計画停電の範囲でUPSもないような方で「これは使える」と思った方は遠慮無く使ってくださいな。
このブログをホスティングしているサーバーは2000年以降11年間いわゆる自宅サーバーで運用してきた。これも安定して電気が提供されていたからであって、この度の地震に伴う計画停電はどうしようもない。最近は頻度が減ってきたものの頻繁に発生する計画停電はどうしようもなくクラウドに避難。引越し先としてはいろいろ考えられるが、以下の条件で調べてみた。
その結果、さくらのVPSに決定。上のスペックで月々980円という約牛丼2杯分という無理のないプライス。とはいえ、3番目の条件である既存VMの引越しはサポートされておらず通常はプリインストールのCentOSである。普通はこれをセットアップして使う。
既存VMの引越しはサポートされていないが、さくらVPSは完全仮想化なのでOSが起動してしまえばまあどうにでもなる。というわけで2段階でVMを移植した。方法としてはまず、上に書いた「カスタムOSインストール」でDebianをミニマムインストール(1GB)して起動し、そこからSWAPパーティションを除く残りの18Gにファイルシステムを作成し既存VMのルートファイルシステムをコピー。そのあと、/boot/grub/menu.lstを書き換えておもむろに再起動。図にするとこんな感じ。
この再起動後がこの移植作業の最大の難所である。だいたい最初の起動ではinitrdが無効とかrootファイルシステムがマウントできないとかで起動に失敗する。しかしこのさくらのVPSが秀逸なのがVGAコンソールが使えることだ。KVMには詳しくないが、Webの管理画面からJava Appletで管理画面であるVGAのコンソールが使えるので、Grubの画面操作や起動に失敗した画面でエラー内容を確認できる。これによりいくつか試行錯誤があったが無事に手持ちのVMを起動することができた。その他にも仮想のシリアルポートもサポートされておりこれもWebの管理画面から利用することができる。
ルートファイルシステムのコピーはパイプでsshに送ってssh経由で転送。コマンド例はVPSで新パーティションを/mnt/tmpにマウントしておき。以下を実行。
tar zcpf – . | ssh root@<VPSのサーバー> “(cd /mnt/tmp ; tar zxpvf -)”
注意点としてはお試し期間中は無料だけど外向けのSMTPポートが使えないこととネットワークの帯域宣言がされていることか。正式申し込みに1日ぐらい必要なので使うのを決めたら本申し込みをしましょう。
このVMのイメージは2002年くらいになんとなくインストールしたDebianをひたすらバージョンアップしたもので、今まで3.0→3.1→4.0→5.0→6.0とメジャーバージョンアップもapt-getコマンドでアップグレードしただけに感慨深い。また稼働VMもVMware Server→Xen→VMware ESX→KVM(さくらVPS)と渡り歩いてきた。今回の地震で自宅での運用は途切れたが、このDebianのメジャーバージョンアップは続けていきたいと決意を新たにする今日この頃です。