コマンドライン
paludarium crate には、静的な x86-64 Linux のプログラムを 1 つ、ホストの上で動かす paludarium コマンドも入っています。
sh
cargo install paludarium
paludarium [--env KEY=VALUE]... [--mount HOST:GUEST]... [--no-jit] [--report-enosys]
[--max-tasks N] [--max-open-files N] [--max-memory N]
[--allow-net HOST[:PORT]]... <program> [args...]<program>はホストのファイルです。ゲストの中では/<ファイル名>に置かれ、argv[0]は指定した文字列のままになります。--env KEY=VALUE(--env=KEY=VALUEとも書けます)は環境変数を足します。何度でも 指定できます。--mount HOST:GUEST(--mount=HOST:GUESTとも書けます)は、ホストのディレクトリを 1 つ、ゲストの絶対パスGUESTに見せます。何度でも指定できます。ゲストは..や シンボリックリンクを使っても、そのディレクトリの外には出られません。--no-jitは互換のために受け付けますが、ネイティブ版には JIT がないので何もしません。--report-enosysを付けると、ゲストが呼んだのに paludarium が実装していない システムコール(ENOSYSを返したもの)の番号を、終わった後に表示します。--max-tasks Nは、ゲストが持てるタスクをN個(1 以上)までにします。タスクは スレッドと、回収されるまでのプロセスで、cgroup のpids.maxと同じ数え方です。 それを超えるcloneやforkはEAGAINで失敗します。--max-open-files Nは、RLIMIT_NOFILEの天井をN(1048576 以下)にします。 Linux のfs.nr_openと同じで、ゲストは両方の上限がN以下の状態で始まり、 それより上には上げられません(EPERM)。そのため、それ以上ファイルを開くとEMFILEになります。--max-memory Nは、ゲストが使えるメモリをNバイトまでにします。cgroup のmemory.maxと同じで、Nの後にはK、M、G、T(1024 のべき)を付けられます。 ページは、初めて書き込んだときから、それを持つすべてのプロセスがマップを外すか 終わるまで数えます。共有メモリと、forkが共有したページ(書き込みで写すまで)は、 1 回だけ数えます。上限を超える書き込みをしたプロセスは、OOM killer と同じようにSIGKILLで終わります。収まらないexecveはENOMEMで失敗し、そもそも 収まらないプログラムは始まりません。 ファイルの中身と、パイプやソケットのバッファは数えません。- これらを指定しなければ、上限はありません。
--allow-net HOST[:PORT](--allow-net=HOST[:PORT]とも書けます)は、ゲストがHOSTのPORT(省けばすべてのポート)へ TCP で接続し、その名前を引けるように します。HOSTには、名前、サブドメインすべてを表す*.付きの名前、IPv4 アドレス、 角かっこで囲んだ IPv6 アドレス([::1]:8080)を書けます。何度でも指定できます。 指定しなければ、ゲストはネットワークを使えません(ネットワーク)。-h、--helpは使い方の 1 行を表示して、終了コード 0 で終わります。--でオプションを終わりにできます。-で始まる名前のプログラムを動かすときに使います。
終了コード
| 終了コード | 意味 |
|---|---|
| ゲストの終了コード | ゲストが exit か exit_group を呼んだ |
| 128 + シグナルの番号 | ゲストがシグナルで終わった |
| 2 | コマンドラインの指定の誤り、またはプログラムのファイルを読めない |
| 70 | ゲストを起動できない、またはエミュレータ自身のエラー(EX_SOFTWARE) |
ゲストを起動できないのは、たとえば、プログラムが paludarium の読み込める ELF ファイルでないとき、--max-memory に収まらないとき、--mount のホスト側のディレクトリを開けないときです。そのときは、標準エラー出力の paludarium: の行に、invalid-program や host のようなエラーの種類が出ます。
足りないものを探す
CPU のフォールトでゲストが終わったときは、どのシグナルでどこで止まったかを、 シェルがクラッシュを知らせるのと同じように標準エラーに 1 行表示します。 ゲスト自身から見える結果は、Linux とまったく同じです。
text
paludarium: SIGILL: cannot run the instruction at 0x5555556e1189 (bytes 41 0f 18 0b 48 83 c0 04 41 0f 18 4b 40 8b 7a)
paludarium: SIGSEGV: read of an unmapped address 0x0 at 0x401000バイト列の先頭が、paludarium が実行できなかった命令です。その後ろは、メモリで それに続くバイトです。実装していないシステムコールを呼んだプログラムは ENOSYS を 受け取り、そのまま動き続けることが多いので、--report-enosys を付けたときだけ 表示します。
text
paludarium: unimplemented system calls (they returned ENOSYS): 28, 63, 204番号は x86-64 の Linux のシステムコールの表のものです。エミュレータ自身のエラーは paludarium: <種類>: <メッセージ> と表示します。