2010/03/07

hostapdをdaemontoolsで管理する

いままでプロトタイプ状態で動かしていたhostapdですが、ちゃんと安定して動かすためのサーバにmini-PCIカード(XG-601)の引っ越しをしました。 IPv6やらNIC周りの設定は/etc/network/interfacesのpost-up辺りに書けば良いんですけどね。 稼働し続けるサーバプロセスを動かすための仕組みは、一度起動して終りというわけにはいかないのが難しいところです。

アクセスのたびに起動すれば良い場合にはinetdやxinetdが使えるのですが、今回はずっと起動し続けるdaemonなのでrc.local辺りで一回起動して終りになってしまいそうです。 ALIXに入れたdebian lennyには、いずれも準備されていなかったのでdjbさん作成のdaemontoolsを入れてみました。

「DAEMON Tools」というとWindows用のISOイメージのマウントツールが検索でかなりヒットしますが、qmailで有名なdjbのツールの方が思い浮ぶのは歳を取り過ぎたのでしょうか。

daemontoolsを選んだ理由

hostapdは常に起動し続けるタイプのサーバプロセスなので、inetdやxinetdでは対応する事ができません。 inetdやxinetdはアクセスの都度プロセスを起動して処理が終ったら消えていくプロセスだけで、あまり一般的ではないですがsendmailやhttpdに対応できる応用範囲の広い仕組みです。

他にinetd, xinetで対応できないサーバプロセスは、OSとして必須のものを除くとfreeradius、ntpdぐらいでしょうか。 freeradiusやntpdはパッケージが起動スクリプトを/etc/rc.d/に配置してくれるので便利ですが、監視はされていないので異常停止した場合には手動で起動するまではサービスが提供できない時間帯(outage)が発生することになります。

気になるのであとで、freeradiusもdaemontoolsの

daemontoolsの情報源

本家のdaemontoolsページがまとまっていて、日本語だと本家の翻訳などはありますが、実用的な解説サイトはざっとみたところ見つかりませんでした。 かといってここで包括的な説明をしていくのは難しいので、hostapd + debian lennyを対象にしていきます。

hostapdをdaemontoolsで動かしていく

daemontoolsの導入

とりあえずdaemontoolsを導入します。 daemontools-runは/etc/inittabなども編集して、導入直後から管理プロセスを起動してくれます。

$ sudo apt-get install daemontools daemontools-run
別ディレクトリへの設定ファイルの配置

daemontoolsは導入した直後から/etc/serviceディレクトリをトップディレクトリとして既に稼働しています。 まずは/usr/local/serviceディレクトリを作成して、その中にhostapdディレクトリとrunという名前の起動用スクリプトを配置します。

$ sudo mkdir -p /usr/local/service/hostapd
$ sudo vi /usr/local/service/hostapd/run
$ sudo chmod +x /usr/local/service/hostapd/run

runファイル内容

#!/bin/bash

exec /usr/local/sbin/hostapd /usr/local/etc/hostapd.conf
/etc/serviceディレクトリへの配置

準備が終ったら、daemontoolsが監視している/etc/servicesディレクトリにシンボリックリンクを貼る事でhostapdを起動させます。 もし事前にhostapdが起動しているようであれば、killコマンドなどで停止させてください。

$ sudo ln -s /usr/local/service/hostapd /etc/service

ファイルを作成すると、5秒以内にhostapdプロセスが起動するはずです。 ひと呼吸置いてからプロセスが起動しているか確認しましょう。

$ ps auxww| egrep 'supervise|hostapd'

コマンド実行後の出力結果

root      1798  0.0  0.1   1492   276 ?        S    12:48   0:00 readproctitle service errors: ...ed to set Short Slot Time option in kernel driver?Could not set preamble for kernel driver?Failed to remove interface (ifidx=6).??starting?Configuration file: /usr/local/etc/hostapd.conf?Using interface wlan0 with hwaddr 00:60:b3:xx:xx:xx and ssid 'XXXXXXXX'?starting?Configuration file: /usr/local/etc/hostapd.conf?Using interface wlan0 with hwaddr 00:60:b3:xx:xx:xx and ssid 'XXXXXXXX'?starting?
root      2317  0.0  0.1   1504   328 ?        S    16:17   0:00 supervise hostapd
root      2895  0.0  0.6   4200  1764 ?        S    16:18   0:00 /usr/local/sbin/hostapd /usr/local/etc/hostapd.conf
...

/usr/local/serviceディレクトリを作成した理由は、次のセクションにまとめました。

稼働中のsuperviseプロセスを停止する際の注意点

最初は/etc/serviceディレクトリの直下にサブディレクトリを作成していたのですが、プロセスを停止する段階になって困ってしまいました。 本家のFAQには次のような記述があります。

http://cr.yp.to/daemontools/faq/create.html#remove

How do I remove a service? I want to eliminate /service/telnetd.
Answer:

     cd /service/telnetd
     rm /service/telnetd
     svc -dx . log

debian lennyでは"/service"は"/etc/service"に、"telnetd"は今回"hostapd"になるわけですが、直接"telnetd"(あるいは"hostapd")ディレクトリを作成しているとこの手順を実施する事はできません。 そしてどうやら代替手段もなく、手動でsuperviseプロセスをkillするしかなさそうです。

そんなわけで"/etc/service"直下はシンボリックリンクだけを集めるようにしましょう。

さいごに

djbさんが作成したツール群は非常に素晴しいのですが、作り手の個性が強烈に伝わってくる仕上りになっています。 良くも悪くも従来の概念の延長線上の斜め上ぐらいにあるので、使い手が、自身が対応できないために、使いづらく感じるのは事実だと思います。 まぁ機能が限定されすぎていて現状に合っていないとか、いろいろ全うな不満はあるとは思いますけどね。

それでも、しばらく前にコードの改変を許すようになったので、不満があるなら改造して使い易くするのは使い手の責任になっていますね。 うーんちょっとコードを変更するぐらいじゃだめだし、これと同等に安定した成果物を作れる自信はないです。

ちなみにqmailを題材にdjbさんが書かれた論文「Some thoughts on security after ten years of qmail 1.0」ではどのようにセキュアな(サーバ)アプリを作成するかが解説されています。

閑話休題:djbがパブリックドメインを宣言したというけれど

原文は本家のサイト「Placing documents into the public domain」にあります。

まぁ日本でパブリックドメインという概念は著作権上の財産権の放棄ぐらいでしか実現できなさそうだから、勝手にコードを取り込んだとしても名前を明記するなどの著作者人格権の尊重はしないといけないんだろうなぁ。

0 件のコメント: