OSDN Git Service

6e2b1da993cbf8f7e2cd10ab52e70c9ce3f196b2
[linuxjm/LDP_man-pages.git] / release / man2 / pivot_root.2
1 .\" Copyright (C) 2000 by Werner Almesberger
2 .\" May be distributed under GPL
3 .\"
4 .\" Written 2000-02-23 by Werner Almesberger
5 .\" Modified 2004-06-17 Michael Kerrisk <mtk.manpages@gmail.com>
6 .\"
7 .\" Japanese Version Copyright (c) 2000 NAKANO Takeo all rights reserved.
8 .\" Translated Wed Jun 14 2000 by NAKANO Takeo <nakano@apm.seikei.ac.jp>
9 .\"
10 .TH PIVOT_ROOT 2 2007-06-01 "Linux" "Linux Programmer's Manual"
11 .SH 名前
12 pivot_root \- root ファイルシステムを変更する
13 .SH 書式
14 .BI "int pivot_root(const char *" new_root ", const char *" put_old );
15 .SH 説明
16 .BR pivot_root ()
17 は呼び出し元のプロセスの root ファイルシステムを
18 .I put_old
19 ディレクトリに移動し、
20 .I new_root
21 を呼び出し元のプロセスの新しい root ファイルシステムにする。
22 .\"
23 .\" .B CAP_SYS_ADMIN
24 .\" ケーパビリティが必要である。
25
26 .BR pivot_root ()
27 の典型的な利用法は、システムの起動中にシステムが一時的な
28 root ファイルシステム (例えば
29 .BR initrd )
30 をマウントし、これに続いて本当の root ファイルシステムをマウントし、
31 後者を必要な全てのプロセス・スレッドの
32 カレント root に変更するような場合である。
33
34 古い root ディレクトリを使っていた全てのプロセスやスレッドの
35 カレント root とカレントワーキングディレクトリを、
36 .BR pivot_root ()
37 が変更するかどうかはわからない。
38 .BR pivot_root ()
39 の呼びだしプロセスは、古い root やカレントワーキングディレクトリを使っていた
40 プロセスが、いずれの場合でも正しく動作することを保証しなければならない。
41 これを簡単に行うには、それらのプロセスの root と
42 カレントワーキングディレクトリを
43 .BR pivot_root ()
44 を呼び出す前に
45 .I new_root
46 に変更しておくことである。
47
48 上記の段落は、将来
49 .BR pivot_root ()
50 が変更されるかも知れないことを鑑みて、わざと曖昧に書いてある。
51 本ページを記述している時点では、
52 .BR pivot_root ()
53 は古い root ディレクトリを用いている全てのプロセス・スレッドの root と
54 カレントワーキングディレクトリを
55 .I new_root
56 に変更する。これはカーネルのスレッドが古い root ディレクトリを
57 busy 状態にしないために必要である。これらのスレッドが
58 古いディレクトリを root やカレントワーキングディレクトリとしていると、
59 ファイルシステムに一切アクセスしない場合でも
60 古い root が busy になってしまうからである。
61 .\"nakano: ちと冗長...
62 将来は、カーネルスレッドがあらゆるファイルシステムへのアクセスを
63 明示的に放棄するメカニズムができ、このでしゃばりな機能は
64 .BR pivot_root ()
65 から削除されるかもしれない。
66
67 これは呼び出し元のプロセスについても当てはまることに注意。
68 .BR pivot_root ()
69 がカレントプロセスのカレントワーキングディレクトリに影響するかどうかは
70 分からない。したがって
71 .BR pivot_root ()
72 の直後に
73 .B chdir("/")
74 を呼び出すとよい。
75
76 .IR new_root " および " put_old
77 には以下の制限がある:
78 .IP \- 3
79 ディレクトリでなければならない。
80 .IP \- 3
81 .IR new_root " と " put_old
82 は現在の root と同じファイルシステムにあってはならない。
83 .IP \- 3
84 .IR put_old " は " new_root
85 以下になければならない。すなわち
86 .I put_old
87 を差す文字列に 1 個以上の
88 .I ../
89 を付けることによって
90 .I new_root
91 と同じディレクトリが得られなければならない。
92 .IP \- 3
93 他のファイルシステムが
94 .I put_old
95 にマウントされていてはならない。
96 .PP
97 利用例については
98 .BR pivot_root (8)
99 を参照のこと。
100
101 現在の root がマウントポイントではない
102 .RB ( chroot (2)
103
104 .BR pivot_root ()
105 の後など。以下も参照) 場合、
106 古い root ディレクトリではなく、
107 そのファイルシステムのマウントポイントが
108 .I put_old
109 にマウントされる。
110
111 .I new_root
112 はマウントポイントでなくてもよい。
113 この場合
114 .I /proc/mounts
115 は、
116 .I new_root
117 を root
118 .RI ( / )
119 とするファイルシステムのマウントポイントを表示する。
120 .SH 返り値
121 成功すると 0 を返す。エラーが起ると \-1 を返し、
122 .I errno
123 が適切な値に設定される。
124 .SH エラー
125 .BR pivot_root ()
126
127 .BR stat (2)
128 の返すあらゆるエラーを
129 .RI ( errno
130 に) 返す可能性がある。さらに以下を返すことがある:
131 .TP
132 .B EBUSY
133 .IR new_root " または " put_old
134 が、現在の root ファイルシステム上にあるか、既に
135 .I put_old
136 になんらかのファイルシステムがマウントされている。
137 .TP
138 .B EINVAL
139 .IR put_old " が " new_root
140 の下層にない。
141 .TP
142 .B ENOTDIR
143 .IR new_root " または " put_old
144 がディレクトリでない。
145 .TP
146 .B EPERM
147 呼び出し元のプロセスが
148 .B CAP_SYS_ADMIN
149 ケーパビリティを持っていない。
150 .SH バージョン
151 .BR pivot_root ()
152 は Linux 2.3.41 で導入された。
153 .SH 準拠
154 .BR pivot_root ()
155 は Linux に固有のものなので、移植性はない。
156 .SH 注意
157 glibc はこのシステムコールに対するラッパー関数を提供していない。
158 .BR syscall (2)
159 を使って呼び出すこと。
160 .SH バグ
161 .BR pivot_root ()
162 はシステムの他のプロセス全ての root と
163 カレントワーキングディレクトリとを変更しなくてもよいはずである。
164
165 .BR pivot_root ()
166 の使い方がもうちょっと曖昧になると、
167 あっという間にわけのわからない状態になってしまうだろう
168 .SH 関連項目
169 .BR chdir (2),
170 .BR chroot (2),
171 .BR stat (2),
172 .BR initrd (4),
173 .BR pivot_root (8)