inetd —
インターネット
“スーパーサーバー”
inetd
[
-di]
[
-q
queuelength]
[
configuration file]
inetd
は通常ブート時に
/etc/rc.local
によって起動される
(
rc(8)
を参照)。(訳注:
ディストリビューションによって異なる)。
使用している
init(8)
が任意のデーモンを再起動できる場合、
inetd は (/etc/rc.local
ではなく) init
から実行できる。
そうすれば、クラッシュした場合に再起動できる。
この場合は
inetd
が自身をバックグラウンドに送るのを防ぐために
-i
オプションを使わなければならない。
さもないと init
は混乱してしまう。
実行されている間
inetd
は定められたインターネットソケットを監視し、接続要求を待つ。
監視しているソケットに対して接続要求が出されると、
そのソケットに対応したサービスを判定し、
サービスを提供するプログラムを起動する。
サービスプログラムが完了すると、
inetd
は再びソケットの監視を行なう。
後述するような例外もある。
inetd を用いれば 1
つのデーモンで
複数のサービスプログラムを起動することができるので、
システムの負荷を軽減することができる。
inetd
に指定できるオプションを示す:
- -d
- いくつかのデバッグを有効にして、
inetd
をデバッガから実行されたように動作させる。
暗黙のうちに
-i
も指定される。
- -i
- バックグラウンドにしない。
init(8)
から実行するためにある。
-
-q
queuelength
- ソケットの監視キューの大きさを指定された値に設定する。
デフォルトは 128。
inetd
は実行時に設定情報を設定ファイルから読み込む。
デフォルトでは設定ファイルは
/etc/inetd.conf である。
設定ファイルの各フィールドにはエントリが
1
つなければならない。
各フィールドのエントリはタブやスペースで区切る。
コメントは行頭に ``#''
をつける。
設定ファイルのフィールドは次の通り:
サービス名[@ホスト名]
ソケットタイプ
プロトコル
wait/nowait[.max]
ユーザー名[.グループ名]
サーバープログラム名
サーバープログラム引き数
Sun-RPC
ベースのサービスを記述する場合には、次のエントリを記述する。
サービス名/バージョン[@ホスト名]
ソケットタイプ
RPC/プロトコル
wait/nowait[.max]
ユーザー名[.グループ名]
サーバープログラム名
サーバープログラム引き数
サービス名
のエントリには、
/etc/services
ファイルに記述されているサービス名が記述される。
“内部” サービス
(後述) については、
名前としてそのサービスの公式名
(すなわち
/etc/services
内の最初のエントリ)
を指定
しなければならない。
Sun-RPC
ベースのサービスを指定するためには、このフィールドは
/etc/rpc
に書かれた有効な RPC
サービス名でなければならない。
“/” の右の部分が RPC
のバージョン番号である。
バージョン番号は、数字もしくは、バージョンの範囲
(レンジ) で指定する。
範囲を指定する場合は低い番号から高い番号を指定する。
たとえば “rusers/1-3”
のように記述する。
サービス名に
@hostname
という形式の文字列が追加された場合、
inetd は
hostname
に対応する特定の IP
アドレスからの接続についてのみ、
サービスポートをバインドさせる
(全てのアドレスからの接続は
listen しない)。
異なるアドレスに対して使用したいだけ指定できるので、
``仮想ホスト''サービスを設定できる。
望むだけの数の特定のアドレスを監視できるが、
カーネルによる制限によって、
inetd
がそのポートを特定のアドレスに対して
(あるいは同時に一般のアドレスに対して)
監視するのが禁止されることもある。
hostname
はローカルシステムのインターフェースに関連づけられた、
解決可能なホスト名または
IP
アドレスにすべきである。
ソケットタイプ
のエントリは、
“stream”, “dgram”, “raw”,
“rdm”, “seqpacket”
のいずれかで、それぞれソケットが
stream, datagram, raw, reliably delivered message, sequenced packet socket
である場合に対応している。
プロトコル
のエントリには、
/etc/protocols
に記述されている有効なプロトコル名が記述される。
例えば “tcp” や “udp”
などである。 RPC
ベースのサービスの場合、
“rpc/tcp” や “rpc/udp”
のような指定になる。
wait/nowait
エントリは、datagram
ソケットにのみ適用できる
(その他のソケットでは、この場所は
“nowait”
でなければならない)。
もし datagram
サーバーが相手に接続したときにソケットを解放するなら、
inetd
はソケットに対するメッセージをさらに受けることができる。
このようなサーバーは
“マルチスレッド”
サーバーと呼ばれ、
“nowait”
エントリを指定しなければならない。
入って来る全ての datagram
を処理し、
時間切れまで動作する
datagram サーバーは、
“シングルスレッド”
サーバーと呼ばれ、
“wait”
エントリを指定しなければならない。
comsat(8),
(
biff(1)),
talkd(8)
は後者のタイプの datagram
サーバーの例である。
tftpd(8)
は例外である;
これは疑似接続を確立する
datagram サーバーである。
競合を避けるために
“wait”
が指定されなければならない;
サーバーは最初のパケットを読み込み、新たなソケットを作成し、
inetd
が新たなサーバーを起動するような接続要求をチェックできるように、
fork して終了する。
オプションのサフィックス
(接尾辞) “max” (“wait”
または “nowait”
からドット``.''で分けられる)
は、60
秒の間に最大いくつのサーバーが
inetd
から起動できるかを指定する。
省略された場合の、
“max” のデフォルトは
40 である。
user
エントリには、サーバーを実行するユーザー名を書く。
これによりサーバーを
root
よりも低い権限で実行できる。
ユーザー名に続いてドット``.''
を付加して、
その後ろにグループ名を指定することができる。
これによりサーバーを
password
ファイルで指定される
(プライマリの)
グループ ID
とは違うグループ ID
で実行できる。
グループ名が指定され、ユーザーが
root 以外だった場合は、
そのユーザの補助グループも
(グループアクセスリストに)
設定されることになる。
サーバープログラム名
のエントリには、ソケットに要求があったとき
inetd
が起動し、当該エントリのサービスを提供する
サーバープログラムのパス名を指定する。
inetd
内にすでに実装されているサービスを提供する場合には、サーバープログラムとして
“internal” を指定する。
サーバープログラム引数
のエントリには、サーバーを起動する際の引数を、
サーバープログラムの起動文字列である
argv[0]
を含めて記述する。
inetd
内に実装されているサービスを提供する場合には、サーバープログラム引数として
“internal” を指定する。
inetd
は、内蔵ルーチンを用いて簡単なサービスを自身で提供する。
これらのサービスとは
“echo”, “discard”, “chargen”
(文字生成), “daytime”
(人間が読む形式で時間を出力),
“time”
(機械可読形式の時間。1900
年 1 月 1 日 0
時からの経過秒数を出力)
である。
これらのサービスは TCP
ベースである。
これらのサービスの詳細については適切な
RFC
ドキュメントを参照のこと。
SIGHUP
を受けとると、
inetd
は、設定ファイルを再度読み込む。
設定ファイルを再読み込みするときに、サービスを追加・削除・変更できる。
inetd はファイル
/var/run/inetd.pid
を作成し、そこにプロセス
ID を記録する。
comsat(8),
fingerd(8),
ftpd(8),
rexecd(8),
rlogind(8),
rshd(8),
telnetd(8),
tftpd(8)
inetd コマンドは
4.3BSD
から登場した。
Sun-RPC
ベースのサービスのサポートは、
SunOS 4.1
で提供されたものにならって作られた。