EN JA
PIVOT_ROOT(2)
PIVOT_ROOT(2) Linux Programmer's Manual PIVOT_ROOT(2)

名前

pivot_root - root ファイルシステムを変更する

書式

int pivot_root(const char * new_root , const char * put_old );
 
: このシステムコールには glibc のラッパー関数は存在しない。「注意」の節を参照。

説明

pivot_root() は呼び出し元のプロセスの root ファイルシステムを put_old ディレクトリに移動し、 new_root を呼び出し元のプロセスの新しい root ファイルシステムにする。
 
pivot_root() の典型的な利用法は、システムの起動中にシステムが一時的な root ファイルシステム (例えば initrd) をマウントし、これに続いて本当の root ファイルシステムをマウントし、後者を必要な全てのプロセス・スレッドのカレント root に変更するような場合である。
 
古い root ディレクトリを使っていた全てのプロセスやスレッドのカレント root とカレントワーキングディレクトリを、 pivot_root() が変更するかどうかはわからない。 pivot_root() の呼びだしプロセスは、古い root やカレントワーキングディレクトリを使っていたプロセスが、いずれの場合でも正しく動作することを保証しなければならない。これを簡単に行うには、それらのプロセスの root とカレントワーキングディレクトリを pivot_root() を呼び出す前に new_root に変更しておくことである。
 
上記の段落は、将来 pivot_root() が変更されるかも知れないことを鑑みて、わざと曖昧に書いてある。本ページを記述している時点では、 pivot_root() は古い root ディレクトリを用いている全てのプロセス・スレッドの root とカレントワーキングディレクトリを new_root に変更する。これはカーネルのスレッドが古い root ディレクトリを busy 状態にしないために必要である。これらのスレッドが古いディレクトリを root やカレントワーキングディレクトリとしていると、ファイルシステムに一切アクセスしない場合でも古い root が busy になってしまうからである。将来は、カーネルスレッドがあらゆるファイルシステムへのアクセスを明示的に放棄するメカニズムができ、このでしゃばりな機能は pivot_root() から削除されるかもしれない。
 
これは呼び出し元のプロセスについても当てはまることに注意。 pivot_root() がカレントプロセスのカレントワーキングディレクトリに影響するかどうかは分からない。したがって pivot_root() の直後に chdir("/") を呼び出すとよい。
 
new_root および put_old には以下の制限がある:
-
ディレクトリでなければならない。
-
new_rootput_old は現在の root と同じファイルシステムにあってはならない。
-
put_oldnew_root 以下になければならない。すなわち put_old を差す文字列に 1 個以上の ../ を付けることによって new_root と同じディレクトリが得られなければならない。
-
他のファイルシステムが put_old にマウントされていてはならない。

利用例については pivot_root(8) を参照のこと。

 

現在の root がマウントポイントではない ( chroot(2) や pivot_root() の後など。以下も参照) 場合、古い root ディレクトリではなく、そのファイルシステムのマウントポイントが put_old にマウントされる。

 

new_root はマウントポイントでなくてもよい。この場合 /proc/mounts は、 new_root を root ( /) とするファイルシステムのマウントポイントを表示する。

返り値

成功した場合は 0 が返される。エラーの場合は-1 が返され、 errno が適切に設定される。

エラー

pivot_root() は stat(2) の返すあらゆるエラーを ( errno に) 返す可能性がある。さらに以下を返すことがある:
EBUSY
new_root または put_old が、現在の root ファイルシステム上にあるか、既に put_old になんらかのファイルシステムがマウントされている。
EINVAL
put_oldnew_root の下層にない。
ENOTDIR
new_root または put_old がディレクトリでない。
EPERM
呼び出し元のプロセスが CAP_SYS_ADMIN ケーパビリティを持っていない。

バージョン

pivot_root() は Linux 2.3.41 で導入された。

準拠

pivot_root() は Linux に固有のものなので、移植性はない。

注意

glibc はこのシステムコールに対するラッパー関数を提供していない。 syscall(2) を使って呼び出すこと。

バグ

pivot_root() はシステムの他のプロセス全ての root とカレントワーキングディレクトリとを変更しなくてもよいはずである。
 
pivot_root() の使い方がもうちょっと曖昧になると、あっという間にわけのわからない状態になってしまうだろう

関連項目

chdir(2), chroot(2), stat(2), initrd(4), pivot_root(8)

この文書について

この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
2012-07-13 Linux