自宅サーバー用にMac mini Serverを導入

現在のdo-gugan.comサーバーは4,5年前に購入した激安サーバーhp ML115をCPU換装、HDD増設しつつ使っています。最初についてた160GBのHDD(OSが入ってるパーティション)がそろそろ心配になってくる頃です。HDDも合計4台となり消費電力、発熱、騒音面でもイケてない状態。LVMなので古いドライブから新しい大容量ドライブにパーティションを移動していけばいいんですが、仮想環境とあいまってややこしい状態になってて恐くて手を出せない(^^;)。また先日でたCentOS6は結構あれこれ変わっていて今までのようなアップグレードインストールは難しいっぽい。

ならいっそ、ということでLion入りのMac mini Server (MC936J/A)を購入しました。省電力、静音、省スペースと三拍子揃ったハード。光学ドライブがなく密閉度が高いのも好感度高いです。吊しの4GBメモリ、500GB HDDx2台モデルを購入し、メモリを8GBに増設(置換)、HDDの1台をSSD(Crucial m4 128GB)に換装しました。本体はLABIで3,000円引き、13%ポイント、メモリも爆安とはいえ、トータルで10万超え。ベース価格がアフォみたいに安かったML115(Lights-Out入れて5万弱だったような?)に比べると割高感がありますが、上記三拍子や我が家ですっかりメインになったMacとの相性や連携機能を考えればアリかなと。

内蔵ストレージは2.5inchなので弱いですが、FireWire800、Thunderbolt等インターフェイスは充実してますし、近々iSCSI対応のNASが手に入りそうなのでそれと連携してもいいかなとか。

ML115が一昨年くらいから夏に不調を来すようになってて、今年も予防策として扇風機の風あてっぱなしで運用してるくらいなので、とっとと移行したいと思っています。

予定では、メール、Webといった基本サービスはOSX Server、Linuxでないと動かせそうにないサービスはVMWare上のCentOSで。あとWHS2011も一緒に購入して来たのでこちらも移行するつもりです。

■ハード面

光学ドライブスロットがないのでとてもスッキリしていて良いです。デスクトップ用としてはポートやスイッチ類が全て背面にあるのはユーザビリティ的に不利ですが、サーバー用であれば無問題。

片方SSDにしたせいもあるんでしょうが、セットアップ作業厨、アイドリング状態では耳を近づけてもほぼ無音。ぴったり耳をつけるとモーター音がかすかにしてるかな、って位。2chで天板の熱が指摘されてましたがいまんとこ気になりません。エンコードやトランスコードをしない限りまったく心配はなさそうです(ちなみに天板よりにHDD、その下にSSDという配置)。

Thunderbolt I/FのついたRAID箱の登場が待たれます。

■換装作業

購入後一度も電源を入れずに換装作業実施w。換装作業はこちらのブログを参考にさせていただきました。工具としてトルクスドライバーのT6とT8が必要。またm4が厚み的に微妙に入らないのでケースの片側を外すのにプラスドライバーを使いました。試してないですが、ケースが干渉するのは入れる時だけなのでもう少し深くまで分解して入れるのであればそのままでも入るんじゃないかって印象でした。まぁSSDだし据え置き機なんであまり気にせず、元のHDDについてた絶縁シートだけ基板剥き出しの側に貼っておきました。

ちなみに2台のHDDは縦に積まれるように入っており、底面側からアプローチする形なのですが最初に見える下側のドライブにOSが入っていて、SSD換装には便利な作りになっていました。もう1台も換装する場合はさらにバラす必要があるっぽいです。あと元から1台しか入ってないモデルだとスペースはあるもののケーブルが内蔵されていないので現状追加は難しいようです。

難易度としてはMBPよりは面倒だけどメチャクチャ難しいという点はないです。普通の自作erならできるでしょう。唯一気をつけるべきなのは上記ブログにもあるように金属メッシュパネルを取り外す時。円形の窓の奥の方に若干刺さっているので、それを引き出してから持ち上げないと簡単にひん曲がってしまいます。

いまんとこ6Gbpsでリンクしてるようです。

■インターネット経由リカバリ

OSと共にリカバリ領域の入った下側のドライブを換装してしまってもLion世代のマシンはインターネットからリカバリできます。スゴい時代になったものです。電源投入時にCommand + Rを押すとリカバリーモードに入るとのことですが2点ハマりました。

1つはたまたま使ったUSBキーボードにCommandキーに相当するWinキーがついてなかった(^^;)。サーバー用ということで純正キーボードを用意せずに一時的にそこら辺に余ってるキーボードで済ますケースも多いと思いますが地味にハマります。またBluetoothキーボードはリカバリーモード前には上手くペアリングできませんでした。

あと「Command + Rを押しながら電源ON」とあちこちに書かれてますが、本当にCommand + R押さえてから電源入れるとうまくリカバリーモードになってくれませんでした(?マーク入りのフォルダアイコンが点滅する状態に)。先に電源を押して「ジャーン」が鳴った直後くらいに押したら行けました。

ちなみに電源ボタンは正面から見て右側背面にあります。

リカバリーツールのDLが3分程度。SSDにパーティションがないとリカバリーしようとしても指定できないので先にディスクユーティリティを選んで領域確保するのもポイントです。ディスクイメージのダウンロードは予測で3時間弱と出たので放置してテレビ見てたんですが実際には1時間かからないで完了しました。勝手に再起動してインストール。こちらも最初19分と出ますが実際にはもっと短い時間で完了。こっちはSSDのお陰もあるでしょう。

純正SSDではないので当然Trimは「いいえ」。Trim Enablerで強制オンにしてみました。いっそ問題が出るなら早め(移行作業中)に出てくれってことで。

 

そんなこんなで2時間弱くらいで初期設定が完了しました。これからサーバー設定を少しずつ進めてい
きます。

Poptopを使ったPPTP接続でブロードキャストを有効にする

前エントリでVPN(PPTP)経由でWake-On-LAN(以下WOL)を使おうとしたら上手くいきませんでした。WOLでは相手のMACアドレスを使って宛先指定をしていますが、実際にはブロードキャストを使うみたいで、これは通常PPTPでは中継されません。

我が家のサーバーで使っているPPTP実装はPoptopで、ググってみると設定ファイルで1行変更するだけでブロードキャストパケットを転送することができました。具体的には、/etc/pptpd.confで

bcrelay eth0

のようにします。eth0の部分はサーバーのLAN側に使っているネットワークデバイスを指定します。これが受けたブロードキャストパケットをVPN側に丸投げしてくれるようになります。デフォルトでオフなのは、大量のブロードキャストが流れるLANにつないだ場合、VPNの帯域が圧迫されるからでしょう。すばらく様子をみて実際に問題なようだったらオフに戻して、WOLはサーバー経由で運用しようかと。

あと残念ながらこのオプションを有効にしてもiTunes共有などのBonjourは機能しませんでした。

サーバー類のリモート電源操作環境を整備

計画停電や節電の関係で24時間稼働していたサーバーをスリープ運用に切り替えたり、停電空けの自動復帰が上手くいかなくて遠隔でリモート起動させないとならない場合があります。iPhoneアプリの活用も含めて、ここ最近やった準備をまとめておきます。同じことを考えてる方の参考になれば幸いです。

■我が家の構成

我が家はメインのサーバーがhpのML115G1でUPS(無停電電源装置)を使って保護しています。このLinuxサーバーがVPN(PPTP)サーバーも兼ねているので、これが落ちていると基本的に他の全てのマシンにもアクセスできません。Webサーバー、メールサーバーも稼働しているので、最低限このPCの稼働状態を保つことが最優先です。残念なことにこのマシンはBIOSでAC電源断後の自動起動を設定しても、UPS等による正常シャットダウンの場合は「不意の電源断」と見なされず自動起動してくれないようなのですが、幸いこの激安サーバーのBTOオプションでLights-Out 100cという遠隔管理ボードをつけてあり、これを利用すれば遠隔再起動できました。

2番目に重要なのはテレビ録画用の自作Windowsマシン。今までは安定性重視で24時間稼働だったのを節電時間帯はスリープに切り替えました(でもまだ録画完了後に自動でスリープに落ちないとか課題あり)。しかしこのPCはHDD容量の余裕もあることから、一時ファイル置き場にもなっていて、スリープしてるのを外から起こして中のファイルを取り出したくなったりします。これは仕事用PCなども同様ですが、これらはメインサーバーが生きていてPPTPで自宅内LANに入ることができれば、後はWake-On-Lan(LANケーブルからの特殊パケットによってPCを起動させる機能)を使って起こすことは可能です。

ついでに、先日買ったMacBook Proと同Airを「どこでもMy Mac」機能で相互に遠隔操作できるようにしたので、据え置きでスリープしているMBPを、外出先のMBAから利用できるようこちらも設定してみました。

■ML115 + Lights-Out 100cを遠隔操作で起こす

Lights-Out 100cはML115のPCIバスに装着されたボードで、本体が通電されてる限りは起動している独立したプロセッサをもつ簡易サーバーです。本体とは別のEthernetポートをもっていて、IPアドレスも独立です。Webブラウザやtelnet/SSHターミナルからアクセスして、本体のハードウェア状況(温度やファンの回転数など)を監視したり、電源のON/OFFができます(例えばOSがフリーズして全く操作を受け付けなくなっても、こちらからブチッとやれる)。また本体のグラフィック出力やキーボード入力に割り込め、ブラウザ画面から物理モニタ、キーボードの前にいるのと同じ操作が行えます(ネットワーク的に死んでいてもコンソールで操作したりエラーメッセージを読み取るなどの余地が残る)。ハードウェアレベルで画面共有付きの遠隔操作できる訳ですね。

IMG_0865 IMG_0866

今回の場合、画面共有までは不要で、電源投入操作が行えればOK。WebやSSHでもできるんですが、出先からなるべく簡単に行いたいということで、先日教えていただいたiPhoneアプリを導入しました。IPMI touchというものです。IPMIとはこうした遠隔管理システムのためのプロトコルで、Lights-Out 100cはIPMI 2.0の設定でいけます。

画面写真、左がハードの各種数値を表示した状態、右が電源操作画面です。ナウいですね。

今回のケースではLights-OutのもつIPアドレスはプライベートで、このPCが落ちてるとPPTPでも入れないという状況なので、ルーターの設定をいじってポートをリダイレクトしてやる必要がありました。セキュリティの為、必ずパスワードやユーザ名を変更しておきます。

余談ですが、このパスワード変更を失敗してしまい、Lights-Outにアクセスできなくなり焦りました。BIOS画面辺りでリセットできるかと思ったんですがそう簡単でもなく、結局と海外の掲示板で調べ、あるツールとDOSをUSBメモリにインストールし、おまじないのような長い16進数パラメーターをつけたコマンドを実行する必要がありました。これあんまりおおっぴらにするのもなんだなということで覚え書きは自粛。個人的なメモに留めておきます。

■その他のPCをWake-On-LANで起こす

Wake-On-LANは今時のEthernetボード(マザーにオンボードのものも含む)ならまず対応しているみたいなので、起こされる側は特になにも設定の必要はないと思います。ただWindowsやMacではオフにする設定項目もあるので、もし起きないようならチェックしてみると良いでしょう。

Windowsの場合、デバイスマネージャーから該当するネットワークアダプタのプロパティを開き、「電源の管理」タブで「このデバイスで、コンピューターのスタンバイ状態を解除できるようにする(O)」のチェックを確認します(細かい文言はWindowsのバージョンによって違うかも知れません)。

MacOSXの場合、システム環境設定の「省エネルギー」で「ネットワークアクセスによってスリープを解除」でいいと思います。

さて、Wake-On-LANといえど、どんなパケットにも反応して起きてしまっては困りますので、マジックパケットと呼ばれる一定のルールに沿ったパケットを受信した時だけ復帰を実行するようになっています(モノによってはそれ以外のも反応するよう設定できるみたいです)。つまり起こす側はこのマジックパケットを出力できる必要があります。あと、PCが起動していない以上、IPアドレスは不定なので、マジックパケット送信のための宛先指定はMACアドレス(全てのネットワーク機器がもつ個別の識別番号)を使います。起こしたいマシンの有線LANポートがもつMACアドレスを予め調べておいて下さい。

・Linuxで起こす

ウチの場合、どのみちPPTPサーバーであるメインサーバーが起きていることが前提なのでそこにSSHでログインしてコマンドを叩くのが簡単です。CentOSの場合、net-toolsというパッケージに含まれるether-wakeというコマンドが使えます。ウチの場合は最初からインストール済みでしたが、もしない場合は、

yum install net-tools

でインストールできると思います。

使い方はシンプルで、

/sbin/ether-wake 00:5c:a9:21:55:ff

のようにMACアドレスを指定してやるだけ。root権限が必要みたいです。

σ(^^)はマシン毎のMACアドレスを覚えるのが大変なので、rootの.bashrcに

alias wake_pc1=’/sbin/ether-wake 00:5c:a9:21:55:ff’

のように書いておきました。これで次回ログイン時からは単にwake_pc1で実行できます。

・iPhoneアプリで起こす
IMG_0867

iPhoneからでもSSHアプリを使えば上記手順でできる訳ですが、アプリで簡単にできるものはそっちを使う主義なので、専用アプリを導入しました。iNet Proというアプリで700円です。これはスキャナーなどのネットワークツールの詰め合わせアプリなのでちと高いですが、同じところが出しているWake-On-LAN専用アプリiNet WOLなら230円です。

前者のみかも知れませんが、LAN内で稼働中のマシン一覧を取得してそこからリスト登録ができるので、一台ずつMACアドレスを調べて手打ちする手間も省けてGoodでした。

また相手がMacの場合、設定画面でIDとパスワードを保存しておけば、スリープ移行やシャットダウンもできるようです。ただウチでスリープを試した限り、画面は消えるものの、スリープランプが点滅にならないという感じでした。

(iPhoneのようにVPN経由で接続した端末からマジックパケットを送る場合、PPTPサーバー側でブロードキャストパケット中継を行う設定が必要でした。これは別エントリで説明します。)

・ルーター管理画面から起こす

BUFFALOの一部のブロードバンドルーターでは管理画面からLAN内の各マシンにマジックパケットを送る機能があるみたいです。該当機種をお使いの場合、それも簡単で良いかも知れません。

サーバーと一緒にUPS非対応なTeraStationをシャットダウンする

ウチのやや古いTeraStation(HS-DHTGL/R5)はUPSに対応してませんが、どこかで先人がハックしていないかとググったところ、「Tera Stationをremoteからshutdownする方法」というブログ記事を発見しました。なるほど、wgetコマンドを使ってWeb管理インターフェイスのシャットダウンを実行する訳ですね。早速試してみたところ、ウチのDHTGLちゃんWeb管理インターフェイスの仕様が変わったらしく上記記事のスクリプトは使用できませんでした。そこで基本アプローチを拝借しつつ、DHTGL用に改変を試みました(以下、ファームウェアは1.15での情報です)。

■解析編

まずそもそも元スクリプトはwgetのBASIC認証用のパラメーターで認証を突破してますが、DHTGLはBACIS認証ですらない。結構苦労しましたが、まとめると、

  • /cgi-bin/top.cgiにPOSTでパラメーターを送ることで動作している(元スクリプトではts.cgi)
  • gPage、gMode、gType、gKeyといったhidden値で実際の表示ページや動作を規定している
  • ログインページから送られるhidden値はgPage=top、gMode=authでID、PWはそれぞれtxtAuthLoginUser、txtAuthLoginPasswordというフィールド名で送られる
  • 一旦認証が通ると、gSSSとgRRRというhidden値が生成されセッション管理に用いられる
  • シャットダウンの時は認証情報の代わりにgSSS、gRRRをつけ、gPage=maintenance、gMode=shutdown、gType=shutdownを送る

といった感じ。gSSSはセッション毎、gRRRはページ遷移毎にユニークに生成されてるっぽいです。gSSSは「07ae46da8acb13a7ba9c99acf3ef66f9」のような16進数値、gRRRは「463273411635750418」のような10進数値です。

つまり認証(gSSS、gRRR取得)とシャットダウン実行でwgetを2回実行する必要があるみたいでした。

■実装編

シェルスクリプトやsedに使い慣れてないのであまり綺麗な実装ではないですが晒してみます。うまいことすればTMPファイルを減らしたり無くしたりできそうなもんですが、よくわからなくて2つほど生成してます。もっとエレガントな方法があれば是非教えて下さい。

#!/bin/sh
#
# rc script to shutdown Tera Station by knakao
#

#REQUIRE LOGIN

WGET=/usr/bin/wget
SERVER=192.168.0.***
USER=admin
ADMIN_PASSWD=**********
URL="http://$SERVER/cgi-bin/top.cgi"
TMPFILE="/tmp/ts_shutdown.tmp"
TMPFILE2="/tmp/ts_shutdown2.tmp"

ts_down()
{
    # Loging in as administrator
    OPT="–post-data=txtAuthLoginUser=$USER&txtAuthLoginPassword=$ADMIN_PASSWD&gPage=top&gMode=auth -O $TMPFILE -q -T 5"
    $WGET $OPT $URL

    cat $TMPFILE | grep gSSS > $TMPFILE2

    gSSS=sed 's/.*name="gSSS"  value="\([^"]*\).*/\1/g' $TMPFILE2
    #echo ‘Current gSSS is ‘$gSSS

    gRRR=sed 's/.*name="gRRR"  value="\([^"]*\).*/\1/g' $TMPFILE2
    #echo ‘Current gRRR is ‘$gRRR

    OPT="–post-data=gPage=maintenance&gMode=shutdown&gType=shutdown&gSSS=$gSSS&gRRR=$gRRR -o /dev/null -q -T 5"
    $WGET $OPT $URL

    rm -f $TMPFILE
    rm -f $TMPFILE2
}

case $1 in
start)
;;

stop)
ts_down;
;;
esac

このファイルを実行可能にして/etc/init.d/terastation等として置きます(RedHat系)。赤字部分は適宜書き換えて下さい。

手動で実行するには

/etc/inin.d/terastation stop

などとします(なお当たり前ですがstartオプションは無視されます)。せっかくrcスクリプト形式なので適当な/etc/rc*.dディレクトリにシンボリックリンクを張るとか、/etc/rc.d/init.d/haltに書いておけば自動実行されるんですが、通常のメンテナンス時にも一緒にTeraStationまで落ちるのが難点ですね。UPSによるシャットダウンの時だけに実行できる仕組みがある場合はそちらを利用するのが良いでしょう。

あとTeraStation自体と途中のハブもUPSでまかなっていないと意味がないのでご注意を。

OS再起動後にPostfixがエラーでメール送受信できなくなる時の覚え書き

我が家のCentOS + Postfix + SpamAssassinで運用しているSMTPサーバーが、OS再起動後にエラーを出してクライアントからの送信や外部からのメール受け取りができなくなる現象が発生していました。原因究明は簡単で/var/log/maillogをみると、迷惑メールフィルタSpamAssassinが使用する/var/run/spamass.sockにパーミッションがないせいだとわかります。このファイルのオーナーをpostfixにしてやれば解決します。実はもうずっと前からこの現象が起きてたのですが、OSを再起動する機会自体が少ないので、都度手動で対応していました。

ですが最近の計画停電で発生頻度があがってきたので、まじめに対応をしようと。

で、このファイルを作成するのが/etc/init.d/spamass-milterです。このファイルの中に下記のようなブロックがあります。

start() {
        echo -n $"Starting $desc ($prog): "
        daemon $prog -p $SOCKET -f $EXTRA_FLAGS
        RETVAL=$?
        [ ! -s $SOCKET ] || sleep 30
        chown postfix $SOCKET
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
        return $RETVAL
}

ちゃんと6行目で同じことしてるんですね。ただタイミングが早くて実際にこのファイルが作られる前に実行されてしまい、結果としてオーナー変更ができてなかったっぽいです。直前の行にあるsleepコマンドによる待ち時間を長めにとってみたところ解決できたっぽいです。ちなみに確か最初は5だったんですが、10にしてもダメでした。どれくらいの時間が適切かはお使いの環境によると思います。

OS再起動後、/var/run/spamass.sockのオーナーが最初からpostfixになっていれば成功です。