kazmax - Linux で自宅サーバー

pivot_root - システムコールの説明 - Linux コマンド集 一覧表

  1. 名前
  2. 書式
  3. 説明
  4. 注意
  5. 返り値
  6. エラー
  7. バグ
  8. 準拠
  9. 履歴
  10. 関連項目

名前

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_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 ()はシステムの他のプロセス全ての root と cwd とを変更しなくてもよいはずである。
pivot_root ()の使い方がもうちょっと曖昧になると、 あっという間にわけのわからない状態になってしまうだろう

準拠

pivot_root ()は Linux に固有のものなので、移植性はない。

履歴

pivot_root ()は Linux 2.3.41 で導入された。

関連項目