PIVOT_ROOT
Section: Linux Programmer's Manual (2)
Updated: 2007-06-01
Index
JM Home Page
roff page
名前
pivot_root - root ファイルシステムを変更する
書式
int pivot_root(const char *new_root, const char *put_old);
説明
pivot_root()
はカレントプロセスの root ファイルシステムを
put_old
ディレクトリに移動し、
new_root
をカレントプロセスの新しい root ファイルシステムにする。
pivot_root()
の典型的な利用法は、システムの起動中にシステムが一時的な
root ファイルシステム (例えば
initrd)
をマウントし、これに続いて本当の root ファイルシステムをマウントし、
後者を必要な全てのプロセス・スレッドの
カレント root に変更するような場合である。
古い root ディレクトリを使っていた全てのプロセスやスレッドの
カレント root とカレントワーキングディレクトリ (cwd) を、
pivot_root()
が変更するかどうかはわからない。
pivot_root()
の呼びだしプロセスは、古い root / cwd を使っていたプロセスが、
いずれの場合でも正しく動作することを保証しなければならない。
これを簡単に行うには、それらのプロセスの root と cwd を
pivot_root()
を呼び出す前に
new_root
に変更しておくことである。
上記の段落は、将来
pivot_root()
が変更されるかも知れないことを鑑みて、わざと曖昧に書いてある。
本ページを記述している時点では、
pivot_root()
は古い root ディレクトリを用いている全てのプロセス・スレッドの root と cwd を
new_root
に変更する。これはカーネルのスレッドが古い root ディレクトリを
busy 状態にしないために必要である。これらのスレッドが
古いディレクトリを root / cwd としていると、ファイルシステムに
一切アクセスしない場合でも古い root が busy になってしまうからである。
将来は、カーネルスレッドがあらゆるファイルシステムへのアクセスを
明示的に放棄するメカニズムができ、このでしゃばりな機能は
pivot_root()
から削除されるかもしれない。
これはカレントプロセスについても当てはまることに注意。
pivot_root()
がカレントプロセスの cwd に影響するかどうかはわからない。
したがって
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 と
cwd とを変更しなくてもよいはずである。
pivot_root()
の使い方がもうちょっと曖昧になると、
あっという間にわけのわからない状態になってしまうだろう
関連項目
chdir(2),
chroot(2),
stat(2),
initrd(4),
pivot_root(8)
Index
- 名前
-
- 書式
-
- 説明
-
- 返り値
-
- エラー
-
- バージョン
-
- 準拠
-
- 注意
-
- バグ
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.
Time: 04:31:55 GMT, November 19, 2007