PIVOT_ROOT
Section: Linux Programmer's Manual (2)
Updated: 2012-07-13
Index
JM Home Page
roff page
 
名前
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/ に書かれている。
 Index
- 名前
 - 
 - 書式
 - 
 - 説明
 - 
 - 返り値
 - 
 - エラー
 - 
 - バージョン
 - 
 - 準拠
 - 
 - 注意
 - 
 - バグ
 - 
 - 関連項目
 - 
 - この文書について
 - 
 
This document was created by
man2html,
using the manual pages.
Time: 16:46:42 GMT, November 24, 2023