Provided by: manpages-ja-dev_0.5.0.0.20161015+dfsg-1_all
名前
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/ に書かれている。