linux-igd(upnpd) runs on daemontools
2004/09/27 このページの内容は linux-igd 0.92 を対象としており、古いです。
本ページの内容(upnpd を daemontools で動かす)を含んだ、CVS における最新版の linux-igd を元にしたページを掲載しましたので、そちらをご覧下さい。(そのページ: linux-igd-0.99, libupnp-1.2.1a パッケージの利用方法)
linux-igdの必要性
linux-igd(Linux UPnP Internet Gateway Device)は、Linux上でUPnPサービスを行うためのデーモンです。
linux-igd自体の説明はgoogleで調べればたくさん出てきますので、ここではしません。
だけど、なぜ必要か位は書いておきます。(わたし的に)
実は、うちではLinuxがルータ代りになっています。これは、kernel-mode PPPoEを使ってるくらいだからわかると思います。
そこで、最近IP電話をやろうと思い、VoIPアダプタをレンタルしました。
もちろん、Linuxの配下に接続されています。
VoIPアダプタはUPnPルータを必要としますと書いてありましたが、ほんとかなぁ?と思いシカト。
導入する前の考えとしては、
- 内部からの発信はiptablesでMASQUERADEを使用してOK。
- 外部からの着信はiptablesでDNATを使って静的NATに行うのでOK。
と思っていました。
が、しかし、VoIPアダプタは本当にUPnPのリクエストをLAN内に飛ばし、その応答がかえってくるまでずっと、VoIPのサーバに接続しに行こうとすらしなかったのです。(※VoIPのサーバにRegistするまでIP電話は使用できません)
で、結局UPnPをLinuxに実装する必要性があると感じられたためlinux-igdを導入しました。
upnpdをコンパイルして動かしてみた
linux-igdのソースをとってきてコンパイルすると、upnpdというのがインストールされます。
これが、UPnPサービスを行うデーモンなわけです。
まぁ簡単に、upnpd ppp0 eth?とかやって動くわけです。
IP電話もしっかりと動くし問題ないと思ったんですが、こいつはfork()してバックグラウンドで動くため、daemontoolsで監視できないでわないか!
Don't fork upnpd
というわけで、forkの部分を消したわけです。
それ用のパッチ(for linux-igd 0.92)(コメントアウトするだけ)。
$ tar -zvxf linuxigd-0.92.tgz
$ cd linux-igd
$ patch < hogehoge/linuxigd-0.92.dontfork.patch
$ make
$ su
# make install
upnpd ppp0 eth?とやって、フォアグラウンドで動作すればOKです。
upnpd runs on daemontools
最後は、daemontools上で動かせば終了です。
スクリプト例としては、exec env - "/usr/bin" upnpd ppp0 eth? 2>&1
とかやって置けば動作するでしょう。
ログはmultilogではなくて、syslogに吐かれます(そこまでソース変えるのは嫌ですし)。
まぁ、とにかく、これでupnpdがダウンしたりしても、自動で再起動しますし、マシンをリブートしても自動でupnpdが立ち上がります。
2003/11/17注記 linux-igdの現行のリリース版にはメモリリークを起こすバグがあるようですので、新しいバージョンをインストールするか、定期的にupnpdを再起動した方がいいと思います。(svc -t /service/upnpdみたいな)