Skip to content

コマンドライン ​

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: <種類>: <メッセージ> と表示します。

Apache-2.0 ライセンスで公開しています。