Provided by: manpages-ja-dev_0.5.0.0.20180315+dfsg-1_all bug

名前

       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.79 の一部 である。プロジェクト
       の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。