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_root と put_old
は現在の root
と同じファイルシステムにあってはならない。
- -
-
put_old は new_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_old が new_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.79 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。