名前


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() システムコールがある。

関連項目


chdir(2), path_resolution(7)

openSUSE Logo

コンテンツ