Next: env invocation, Up: Modified command invocation [Contents][Index]
chroot
: ルートディレクトリを変更して、コマンドを実行するchroot
は、指定されたディレクトリをルートディレクトリにして、コマンドを実行する。
多くのシステムでは、この操作を行うことができるのはスーパーユーザだけである。
4
書式:
chroot option newroot [command [args]…] chroot option
通常、ファイル名の検索は、ディレクトリ構造の根 (ルート、root)、すなわち
/ を起点として行われる。chroot
はこのルートを newroot
ディレクトリ (実在するディレクトリでなければならない) に変更し、
さらに、作業ディレクトリを / に変更して、最後に command
を、args の指定があれば args を付けて実行する。
command が指定されていない場合、デフォルトのコマンドは、環境変数
SHELL
の値か、SHELL
が設定されていなければ、/bin/sh
であり、
それが -i オプションを付けて、呼び出される。
command は シェルの組み込みコマンドであってはならない
(see Special built-in utilities)。
このプログラムでは以下のオプションが使用できる。参照: Common options. オプションはオペランドの前に置かなければならない。
このオプションを使えば、新しいプロセスが使用する補助 groups を変更することができる。グループのリストの各項目 (名前でも ID 番号でもよい) は、コンマで区切られていなければならない。 --userspec オプションで自動的に行われる補助グループの照合をしないようにするには、 ‘--groups=''’ を使用すればよい。
デフォルトでは、command は呼び出し側のプロセスと同じ資格情報を使って実行されるが、 このオプションを使えば、command を別の user の資格で実行することができる。別の基本 group を指定することも可能だ。 user が指定された場合、補助グループは、そのユーザについてシステムが設定しているリストと同じものになる。 ただし、--groups オプションによって置き換えられる場合は別だ。
ルートディレクトリを newroot に変更した後で (すなわち chroot 環境中で)、作業ディレクトリを / に変更したくなかったら、このオプションを使えばよい。 このオプションが使用できるのは、newroot が元の / ディレクトリと同じときだけであり、従って、役に立つのは、 --groups や "--userspec と一緒に使い、 元の作業ディレクトリに留まっていたい場合がほとんどである。
--userspec や --groups オプションによって行われるユーザ名やグループ名の照合は、 chroot 環境の外側と内側の両方で行われるが、chroot 環境の内側で成功した照合が優先される。 ユーザやグループの指定で ID 番号を使うつもりならば、数字の前に ‘+’ を付ければ、名前を ID 番号に還元するステップが行われないで済む。 See Disambiguating names and IDs.
chroot を使う上でよくある問題を避けることができるように、 ちょっとした情報をいくつか挙げておく。まず簡単なことから言うと、command は、静的にリンクしたバイナリを指すようにした方がよい。 もし、動的にリンクした実行ファイルを使用するのならば、 共有ライブラリが新しいルートディレクトリ以下の適切な場所に存在するように、 前もって準備しておく必要があるだろう。
たとえば、静的にリンクした ls
の実行ファイルを作成して、
/tmp/empty に置けば、root ユーザとして次のようなコマンドを実行することができる。
$ chroot /tmp/empty /ls -Rl /
出力はこんなふうになるだろう。
/: total 1023 -rwxr-xr-x 1 0 0 1041745 Aug 16 11:17 ls
もし、動的にリンクした実行ファイル、たとえば bash
を使いたいならば、
まず ‘ldd bash’ を実行して、どんな共有オブジェクトファイルが必要かを調べることだ。
それから、bash
自体のバイナリをコピーするだけでなく、‘ldd bash’
でリストされたファイルも、新しいルートディレクトリになるディレクトリ以下のしかるべき場所にコピーしておく。
さらに、実行ファイルが何か他のファイルも必要としているなら
(たとえば、データファイル、ステータスファイル、デバイスファイルなど)、
それも適切な場所にコピーする。
chroot
がインストールされるのは、chroot
関数を持つシステムだけである。
従って、移植を考慮したスクリプトでは、chroot
が存在することを当てにしない方がよい。
終了ステータス:
125: chroot
そのものの実行に失敗した。
126: command は見つかったが、起動できなかった。
127: command が見つからなかった。
それ以外は、command の終了ステータス。
もっとも、システムによっては (たとえば、FreeBSD がそうだが)、
特定の一般ユーザが chroot
システムコールを使用できるように設定できるものもある。
従って、そうしたユーザは chroot
コマンドを実行できるわけだ。
また、Cygwin では、どんなユーザでも chroot
コマンドを実行できる。
MS-Windows では chroot 関数をサポートしていないため、
内部で使用する関数が特権を要求しないからである。
なお、newroot が元の / ディレクトリと同じ場合、chroot
コマンドは chroot
システムコールを使わないで済まそうとする。
これは、非特権ユーザにもそういったことが許されているシステムとの一貫性を保つためである。