pivot_root - システムコールの説明 - Linux コマンド集 一覧表
名前
pivot_root - root ファイルシステムを変更する
書式
#include <linux/unistd.h>
#include <errno.h>
_syscall2(int,pivot_root,const char *,new_root,const char *,put_old)
/* Using syscall
(2) may be preferable; see intro
(2) */
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
()はシステムの他のプロセス全ての root と
cwd とを変更しなくてもよいはずである。
pivot_root
()の使い方がもうちょっと曖昧になると、
あっという間にわけのわからない状態になってしまうだろう
準拠
pivot_root ()は Linux に固有のものなので、移植性はない。
履歴
pivot_root ()は Linux 2.3.41 で導入された。