名前
chroot - ルート・ディレクトリを変更する
書式
#include <unistd.h>
int chroot(const char *path);
説明
chroot() は、ルート・ディレクトリを path で指定されたディレクトリに変更する。 このディレクトリ以下が / から始まるパス名として使われる。 このルート・ディレクトリは現在のプロセスの全ての子プロセスに受け継がれる。
特権プロセス (Linux では、 CAP_SYS_CHROOT ケーパビリティを持つプロセス) のみが chroot(2) を呼び出すことができる。
このコールはパス名解決の過程で構成要素を変更するのみで、 その他には何も行わない。
このコールは現在の作業ディレクトリ (working directory) を変更しない。 そのため、このコールの後に . が / を根とするツリーの外になる場合がある。 特に、スーパー・ユーザーは mkdir foo; chroot foo; cd .. とすれば「chroot jail」から逃げ出せてしまう。
このコールはオープンファイルディスクリプタをクローズしないので、 このようなファイルディスクリプタは chroot ツリーの外にある ファイルにアクセスできる。
返り値
成功すると 0 を返す。 失敗すると -1 を返し、 errno に適切な値を設定する。
エラー
ファイルシステムによっては他のエラーが返される事がある。 一般的なエラーを以下に挙げる:
EACCES | パス名の途中のどこかに検索許可 (search permission) がない。 (path_resolution(7) も参照すること。) |
EFAULT | path が割り当てられたアドレス空間外を指している。 |
EIO | I/O エラーが発生した。 |
ELOOP | path を解決する際に遭遇したシンボリック・リンクが多過ぎる。 |
ENAMETOOLONG | |
path が長過ぎる。 | |
ENOENT | ファイルが存在しない。 |
ENOMEM | カーネルに十分なメモリがない。 |
ENOTDIR | |
path の内容がディレクトリではない。 | |
EPERM | 呼び出し側に十分な特権がない。 |
準拠
SVr4, 4.4BSD, SUSv2 (但し、SUSv2 では過去の名残とされている)。 この関数は POSIX.1-2001 にはない。
注意
fork(2) で作成された子プロセスは、 親プロセスのルート・ディレクトリを継承する。 execve(2) の場合も、ルート・ディレクトリは変更されない。
FreeBSD にはより強力な jail() システムコールがある。