PIVOT_ROOT

Section: Linux Programmer's Manual (2)
Updated: 2012-07-13
Index JM Home 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/ に書かれている。

関連キーワード

root   ファイルシステム   カレント   マウント   ワーキング   スレッド   ポイント   pivot   ラッパー   将来   カーネル   busy   典型的   起動   一時的   本当   保証   上記   段落   記述   時点   一切   明示   放棄   メカニズム

Linux マニュアル 一覧

関連するコマンド・関数

pivot_root.8   fstab.5   exports.5   chown.2   chown32.2   fchown.2
 

Index

名前
書式
説明
返り値
エラー
バージョン
準拠
注意
バグ
関連項目
この文書について

This document was created by man2html, using the manual pages.
Time: 04:38:57 GMT, October 11, 2026