# rmid - Java RMI 起動システムデーモン

> rmid で起動システムデーモンを開始すると、オブジェクトを仮想マシン (VM) に登録して起動できるようになります。

## 形式

>     rmid [options]

## 説明

> rmid ツールは、起動システムデーモンを開始します。起動システムデーモンを開始してからでないと、起動可能オブジェクトを起動システムに登録したり、VM 内で起動したりすることができません。起動可能なリモートオブジェクトを使ったプログラムの作成方法の詳細は、「Java RMI 仕様」および「起動のチュートリアル」を参照してくだ さい。

> デーモンを起動するには、次のように、セキュリティーポリシーファイルを指定して `rmid` コマンドを実行します。

>         rmid -J-Djava.security.policy=rmid.policy

> 注:`rmid` の Sun の 実装を実行する場合、デフォルトでは、セキュリティーポリシーファイルを指定する必要があります。 それは、起動グループ用に VM を起動するために各 `ActivationGroupDesc` 内の情報を使用できるかどうかを `rmid` が検証できるようにするためです。特に、`ActivationGroupDesc` のコンストラクタに渡される `CommandEnvironment` や任意の `Properties` によって指定されるコマンドおよびオプションは、`rmid` のセキュリティーポリシーファイルの中で明示的に許可することが必要になりました。`sun.rmi.activation.execPolicy` プロパティーの値は、起動グループ用に VM を起動するために `ActivationGroupDesc` 内の情報を使用できるかどうかを判断するときに `rmid` が使用するポリシーを決定します。

> `rmid` をデフォルト設定で実行すると、次のような処理が行われます。

> - アクティベータを起動し、デフォルトポート 1098 で内部レジストリを起動する
> - この内部レジストリの中で、`ActivationSystem` を `java.rmi.activation.ActivationSystem` という名前にバインドする

> レジストリにほかのポートを指定するには、`rmid` の起動時に `-port` オプションを指定しなければなりません。次に例を示します。

>         rmid -J-Djava.security.policy=rmid.policy -port 1099

> このコマンドは、起動システムデーモンを開始し、レジストリのデフォルトポート 1099 でレジストリを開始します。

> ### `rmid` を `inetd`/`xinetd` から開始する

> `rmid` をコマンド行から開始するには、`inetd` (Solaris の場合)、または `xinetd` (Linux) を構成して `rmid` を必要に応じて開始する方法もあります。

> `rmid` を開始すると、`System.inheritedChannel` メソッドを呼び出して、継承されたチャンネル (`inetd`/`xinetd` から継承) を取得しようとします。継承されたチャンネルが `null` であるか、`java.nio.channels.ServerSocketChannel` のインスタンスでなかった場合、`rmid` はそのチャンネルは `inetd`/`xinetd` によって起動されたものではないと判断し、前述のように起動します。

> 継承されたチャンネルが `ServerSocketChannel` インスタンスである場合は、エクスポートするリモートオブジェクト、つまり `java.rmi.activation.ActivationSystem` がバインドされているレジストリと `java.rmi.activation.Activator` リモートオブジェクトに対する要求を受信するサーバーソケットとして、`ServerSocketChannel` から取得した `java.net.ServerSocket` を `rmid` では使用します。このモードでは、`rmid` の動作は、次のことを除いて、 コマンド行から起動した場合と同じです。

> - `System.err` に対する出力は、ファイルにリダイレクトされる。このファイルは `java.io.tmpdir` システムプロパティーで指定されるディレクトリ (通常は `/var/tmp` または `/tmp`) にある。 ファイル名の接頭辞は `rmid-err` で、接尾辞は `"tmp"` である
> - `-port` オプションは拒否される。このオプションを指定すると、`rmid` はエラーメッセージを出して終了する
> - `-log` オプションは必須。このオプションを指定しないと、`rmid` はエラーメッセージを出して終了する

> 必要に応じてサービスを開始するように設定する詳細については、`inetd` (Solaris) または `xinetd` (Linux) のマニュアルページを参照してください。

## オプション

> -C<someCommandLineOption>
>   `rmid` の子プロセス (起動グループ) が作成されたときに、それぞれの子プロセスにコマンド行引数として渡されるオプションを指定します。たとえば、次のように指定すると、起動システムデーモ ンによって生成される各仮想マシンにプロパティーを渡すことができます。

>           rmid -C-Dsome.property=value

>   コマンド行引数を子プロセスに渡す機能は、デバッグを行う場合に便利です。たとえば、次のようなコマンドを実行できます。

>           rmid -C-Djava.rmi.server.logCalls=true

>   このコマンドにより、すべての子 VM でサーバー呼び出しのログが作成されるようになります。

> -J<someCommandLineOption>
>   `rmid` を実行している `java` インタプリタに渡すオプションを指定します。たとえば、`rmid` が `rmid.policy` という名前のポリシーファイルを使用するように指定するには、`rmid` のコマンド行で `-J` オプションを使って、`java.security.policy` プロパティーを定義します。 次に例を示します。

>           rmid -J-Djava.security.policy=rmid.policy

> -J-Dsun.rmi.activation.execPolicy=<policy>
>   起動グループが実行されることになる VM の起動に使用するコマンドおよびコマンド行オプションをチェックするために、`rmid` が採用するポリシーを指定します。このオプションは、Java RMI 起動デーモンの Sun の実装だけに存在することに注意してください。コマンド行にこのプロパティーを指定しない場合、結果は `-J-Dsun.rmi.activation.execPolicy=default` を指定した場合と同じになります。<policy> に指定可能な値は、`default`、<policyClassName>、または `none` です。 それぞれの値について、このあと説明します。

>   - default (または、このプロパティーが「指定されていない」場合)

>     デフォルトの `execPolicy` の場合、`rmid` が実行できるのは、`rmid` が使用する セキュリティーポリシーファイルの中で、実行する権限が `rmid` に与えられているコマンドおよびコマンド行オプションだけです。「デフォルト」の実行ポリシーで使用できるのは、デフォルトの起動グループ実装だけです。

>     `rmid` は、起動グループ用の VM を起動するときに、そのグループについて登録された起動グループ記述子である `ActivationGroupDesc` 内の情報を使用します。グループ記述子は、`ActivationGroupDesc.CommandEnvironment` を指定します (省略可能)。 これには、起動グループを開始する「コマンド」と、そのコマンド行に追加できるコマンド行「オプション」が含まれています。デフォルトでは、`rmid` は、`java.home` にある `java` コマンドを使用します。グループ記述子には、オプションとしてコマンド行に追加される「プロパティー」オーバーライドも含まれています。 このプロパティーは、次のように定義します。

>             -D<property>=<value>

>     アクセス権 `com.sun.rmi.rmid.ExecPermission` を使用すると、グループ記述子の `CommandEnvironment` で指定されたコマンドを実行して起動グループを開始する権限を、`rmid` に対して許可することができます。アクセス権 `com.sun.rmi.rmid.ExecOptionPermission` を使用すると、グループ記述子でプロパティーオーバーライドとして指定されたコマンド行オプション、または `CommandEnvironment` でオプションとして指定されたコマンド行オプションを、起動グループを開始するときに `rmid` が使用できるようになります。

>     `rmid` にさまざまなコマンドおよびオプションを実行する権限を許可する場合は、アクセス権 `ExecPermission` および `ExecOptionPermission` を汎用的に許可する必要があります。 つまり、すべてのコードソースに対して許可します。

>     `ExecPermission`
>       `ExecPermission` クラスは、起動グループを開始するために `rmid` が特定の「コマンド」を実行する権限を表します。

>       構文
>       `ExecPermission` の「名前」は、`rmid` に実行を許可するコマンドのパス名です。「/*」 (「/」はファイル区切り文字 `File.separatorChar`) で終わるパス名は、そのディレクトリに含まれるすべてのファイルを示します。「/-」で終わるパス名は、そのディレクトリに含まれるすべてのファイルとサブディレクトリ (再帰的に) を示します。パス名に特別なトークン「<<ALL FILES>>」を指定した場合は、任意のファイルを示します。

>       注:「*」を 1 つ指定しただけのパス名は、現在のディレクトリ内のすべてのファイルを表します。 また、「-」を 1 つ指定しただけのパス名は、現在のディレクトリ内のすべてのファイルと、現在のディレクトリに含まれるすべてのファイルとサブディレクトリ (再帰的に) を表します。

>     `ExecOptionPermission`
>       `ExecOptionPermission` クラスは、起動グループを開始するときに `rmid` が特定のコマンド行「オプション」を使用できる権限を表します。`ExecOptionPermission` の「名前」は、コマンド行オプションの値です。

>       構文
>       オプションでは、ワイルドカードが限定的にサポートされます。アスタリスクは、ワイルドカードマッチを表します。 アスタリスクは、オプション名そのものとして使用できます。 つまり、任意のオプションを表すことができます。 また、オプション名の末尾に使用することもできます。 ただし、「.」か「=」の直後にアスタリスクを指定する必要があります。

>       例を示します。「*」、「-Dfoo.*」、「-Da.b.c=*」は有効ですが、「*foo」、「-Da*b」、「ab*」は無効です。

>     `rmid` のポリシーファイル
>       `rmid` にさまざまなコマンドおよびオプションを実行する権限を許可する場合は、アクセス権 `ExecPermission` および `ExecOptionPermission` を汎用的に許可する必要があります。 つまり、すべてのコードソースに対して許可します。これらのアクセス権をチェックするのは `rmid` だけなので、これらのアクセス権を汎用的に許可しても安全です。

>       `rmid` に各種の実行権限を許可するポリシーファイルの例を、次に示します。

>           grant {
>               permission com.sun.rmi.rmid.ExecPermission
>                   "/files/apps/java/jdk1.2.2/solaris/bin/java";

>               permission com.sun.rmi.rmid.ExecPermission
>                   "/files/apps/java/jdk1.2.2/solaris/bin/java_g";

>               permission com.sun.rmi.rmid.ExecPermission
>                   "/files/apps/rmidcmds/*";

>               permission com.sun.rmi.rmid.ExecOptionPermission
>                   "-Djava.security.policy=/files/policies/group.policy";

>               permission com.sun.rmi.rmid.ExecOptionPermission
>                   "-Djava.security.debug=*";

>               permission com.sun.rmi.rmid.ExecOptionPermission
>                   "-Dsun.rmi.*";
>           };

>       最初の 2 つの付与されているアクセス権は、`rmid` に対し、パス名により明示的に指定される `java` コマンドおよび `java_g` コマンドの 1.2.2 バージョンの実行を許可します。デフォルトでは、`java.home` にあるバージョンの `java` コマンド (`rmid` が使用するのと同じバージョン) が使用されるため、そのコマンドは、ポリシーファイルで指定する必要はありません。3 番目のアクセス権は、`rmid` に対して、ディレクトリ `/files/apps/rmidcmds` 内の任意のコマンドの実行権限を許可します。

>       4 番目のアクセス権 `ExecOptionPermission` は、`rmid` に対して、セキュリティーポリシーファイルを `/files/policies/group.policy` として定義している起動グループの開始を許可します。5 番目のアクセス権は、起動グループが `java.security.debug` プロパティーを使用することを許可しています。最後のアクセス権は、起動グループが `sun.rmi` というプロパティー名の階層内の任意のプロパティーを使用することを許可しています。

>       ポリシーファイルを指定して `rmid` を起動するには、`rmid` のコマンド行で `java.security.policy` プロパティーを指定する必要があります。 次に例を示します。

>       > `rmid -J-Djava.security.policy=rmid.policy`

>   - <policyClassName>

>     デフォルトの動作では十分な柔軟性が得られない場合、管理者は、`rmid` の起動時に、`checkExecCommand` メソッドが所属するクラスの名前を指定して、rmid が実行するコマンドをチェックすることができます。

>     policyClassName には、引数なしのコンストラクタを持ち、次のような `checkExecCommand` メソッドを実装している public クラスを指定します。

>             public void checkExecCommand(ActivationGroupDesc desc,
>                                          String[] command)
>                 throws SecurityException;

>     起動グループを開始する前に、`rmid` は、ポリシーの `checkExecCommand` メソッドを呼び出します。このとき、起動グループの記述子と、起動グループを開始するための完全なコマンドを含む配列をそのメソッドに渡します。`checkExecCommand` が `SecurityException` をスローすると、`rmid` はその起動グループを開始せず、オブジェクトの起動を試行している呼び出し側には `ActivationException` がスローされます。

>   - none

>     `sun.rmi.activation.execPolicy` プロパティーの値が「none」の場合、`rmid` は、起動グループを開始するコマンドをまったく検証しません。

> -log dir
>   起動システムデーモンがデータベースおよび関連情報を書き込むのに使うディレクトリの名前を指定します。デフォルトでは、`rmid` コマンドを実行したディレクトリに、`log` というログディレクトリが作成されます。

> -port port
>   `rmid` のレジストリが使うポートを指定します。起動システムデーモンは、このレジストリの中で、`java.rmi.activation.ActivationSystem` という名前で`ActivationSystem` をバインドします。したがって、ローカルマシン上の `ActivationSystem` は、次のように `Naming.lookup` メソッドを呼び出すことによって取得できます。

>           import java.rmi.*;
>           import java.rmi.activation.*;

>           ActivationSystem system; system = (ActivationSystem)
>           Naming.lookup("//:port/java.rmi.activation.ActivationSystem");

> -stop
>   `-port` オプションによって指定されたポートの、現在の `rmid` 呼び出しを停止します。ポートが指定されていない場合は、ポート 1098 で実行されている `rmid` を停止します。

## 環境変数

> CLASSPATH
>   ユーザー定義クラスへのパスをシステムに指定します。ディレクトリはコロンで分割します。例を示します。

>           .:/usr/local/java/classes

## 関連項目

> rmic、CLASSPATH、java

Copyright © 2004-2006 Sun Microsystems, Inc. All Rights Reserved. コメントの送付先: `rmi-comments@java.sun.com` |