OSDN Git Service

Address fuzzy in 3.77
[linuxjm/LDP_man-pages.git] / draft / man2 / setns.2
1 .\" Copyright (C) 2011, Eric Biederman <ebiederm@xmission.com>
2 .\" and Copyright (C) 2011, 2012, Michael Kerrisk <mtk.manpages@gamil.com>
3 .\"
4 .\" %%%LICENSE_START(GPLv2_ONELINE)
5 .\" Licensed under the GPLv2
6 .\" %%%LICENSE_END
7 .\"
8 .\"*******************************************************************
9 .\"
10 .\" This file was generated with po4a. Translate the source file.
11 .\"
12 .\"*******************************************************************
13 .\"
14 .\" Japanese Version Copyright (c) 2012-2013  Akihiro MOTOKI
15 .\"         all rights reserved.
16 .\" Translated 2012-06-04, Akihiro MOTOKI <amotoki@gmail.com>
17 .\" Updated 2013-05-01, Akihiro MOTOKI <amotoki@gmail.com>
18 .\" Updated 2013-05-06, Akihiro MOTOKI <amotoki@gmail.com>
19 .\"
20 .TH SETNS 2 2015\-01\-10 Linux "Linux Programmer's Manual"
21 .SH 名前
22 setns \- スレッドに名前空間を関連付けしなおす
23 .SH 書式
24 .nf
25 \fB#define _GNU_SOURCE\fP             /* feature_test_macros(7) 参照 */
26 \fB#include <sched.h>\fP
27 .sp
28 \fBint setns(int \fP\fIfd\fP\fB, int \fP\fInstype\fP\fB);\fP
29 .fi
30 .SH 説明
31 名前空間を参照するファイルディスクリプタを指定すると、
32 呼び出したスレッドにその名前空間を関連付けしなおす。
33
34 \fIfd\fP 引き数は、 \fI/proc/[pid]/ns/\fP ディレクトリ内の名前空間エントリ
35 のいずれかを参照するファイルディスクリプタである。
36 \fI/proc/[pid]/ns/\fP の詳細は \fBnamespaces\fP(7) を参照。
37 \fInstype\fP 引き数で指定された制限の範囲内で、
38 呼び出したスレッドに \fIfd\fP に対応する名前空間を関連付けしなおす。
39
40 \fInstype\fP 引き数は、呼び出したスレッドがどのタイプの名前空間を
41 関連付けしなおすことができるかを指定する。
42 この引き数には以下のいずれかの値を指定できる。
43 .TP 
44 \fB0\fP
45 どのタイプの名前空間も関連付けることができる。
46 .TP 
47 \fBCLONE_NEWIPC\fP (Linux 3.0 以降)
48 \fIfd\fP は IPC 名前空間を参照していなければならない。
49 .TP 
50 \fBCLONE_NEWNET\fP (Linux 3.0 以降)
51 \fIfd\fP はネットワーク名前空間を参照していなければならない。
52 .TP 
53 \fBCLONE_NEWNS\fP (Linux 3.8 以降)
54 \fIfd\fP はマウント名前空間を参照していなければならない。
55 .TP 
56 \fBCLONE_NEWPID\fP (Linux 3.8 以降)
57 \fIfd\fP must refer to a descendant PID namespace.
58 .TP 
59 \fBCLONE_NEWUSER\fP (Linux 3.8 以降)
60 \fIfd\fP はユーザー名前空間を参照していなければならない。
61 .TP 
62 \fBCLONE_NEWUTS\fP (Linux 3.0 以降)
63 \fIfd\fP は UTS 名前空間を参照していなければならない。
64 .PP
65 呼び出し側が \fIfd\fP がどのタイプの名前空間を参照しているかを知っている
66 (もしくは気にする必要がない) 場合には、 \fInstype\fP に 0 を指定すれば十分
67 である。呼び出し側が \fIfd\fP がどのタイプの名前空間を参照しているかを
68 知っておらず、かつ、特定のタイプの名前空間であることを保証したい場合、
69 \fInstype\fP に 0 以外の値を指定するとよい。 (ファイルディスクリプタが別の
70 プロセスによりオープンされ、例えば、UNIX ドメインソケット経由で呼び出し
71 側に渡された場合などでは、呼び出し側が \fIfd\fP がどのタイプの名前空間を
72 参照しているかを知らない可能性がある。)
73
74 \fBCLONE_NEWPID\fP は他の \fInstype\fP 値の場合と少し違った動作をする。 呼び出し元スレッドを PID 名前空間に関連付けし直すと、
75 呼び出し元の子プロセスが作成される PID 名前空間が変更されるだけである。 呼び出し元自身の PID 名前空間は変更されない。 PID
76 名前空間を関連付けし直すことができるのは、 \fIfd\fP で指定された PID 名前空間が呼び出し元の PID 名前空間の子孫
77 (子プロセス、孫プロセスなど) の場合だけである。 PID 名前空間の詳細は \fBpid_namespaces\fP(7) を参照。
78
79 .\" See kernel/user_namespace.c:userns_install() [3.8 source]
80 .\" commit e66eded8309ebf679d3d3c1f5820d1f2ca332c71
81 .\" https://lwn.net/Articles/543273/
82 プロセスが自分自身をユーザー名前空間に再関連付けするには、 そのプロセスは変更後のユーザー名前空間において \fBCAP_SYS_ADMIN\fP
83 ケーパビリティを持っていなければならない。 ユーザー名前空間への参加に成功すると、 そのユーザー ID やグループ ID に関わらず、
84 プロセスにはその名前空間におけるすべてのケーパビリティが認められる。 マルチスレッドのプロセスは \fBsetns\fP()
85 でユーザー名前空間を変更できない。 \fBsetns\fP() を使って、呼び出し元が現在のユーザー名前空間に再度入ることは認められていない。 これにより、
86 いくつかのケーパビリティを外した呼び出し元が \fBsetns\fP() を呼び出すことでそれらのケーパビリティを再度得ることを防ぐことができる。
87 セキュリティ上の理由から、 ファイルシステム関連の属性 (共有が \fBclone\fP(2) \fBCLONE_FS\fP フラグで制御される属性)
88 を別のプロセスと共有している場合、 プロセスは新しいユーザー名前空間に参加できない。 ユーザー名前空間の詳細は
89 \fBuser_namespaces\fP(7) を参照。
90
91 .\" Above check is in fs/namespace.c:mntns_install() [3.8 source]
92 プロセスがマルチスレッドの場合、そのプロセスを新しいマウント名前空間に関連付けし直すことは許可されていない。
93 マウント名前空間を変更するには、呼び出し元のプロセスが、 自分自身のユーザー名前空間において \fBCAP_SYS_CHROOT\fP と
94 \fBCAP_SYS_ADMIN\fP の両方のケーパビリティを持っており、 変更後のマウント名前空間で \fBCAP_SYS_ADMIN\fP
95 ケーパビリティを持っていなければならない。 ユーザー名前空間とマウント名前空間の関係の詳細は \fBuser_namespaces\fP(7) を参照。
96 .SH 返り値
97 成功すると \fIsetns\fP() は 0 を返す。
98 失敗すると、 \-1 が返され、 \fIerrno\fP にエラーを示す値が設定される。
99 .SH エラー
100 .TP 
101 \fBEBADF\fP
102 \fIfd\fP が有効なファイルディスクリプタではない。
103 .TP 
104 \fBEINVAL\fP
105 \fIfd\fP が \fInstype\fP で指定されたタイプと一致しない名前空間を参照している。
106 .TP 
107 \fBEINVAL\fP
108 スレッドを指定された名前空間に関連付けし直す際に問題が発生した。
109 .TP 
110 .\" See kernel/pid_namespace.c::pidns_install() [kernel 3.18 sources]
111 \fBEINVAL\fP
112 The caller tried to join an ancestor (parent, grandparent, etc...)  pid
113 namespace.
114 .TP 
115 \fBEINVAL\fP
116 自分がすでにメンバーとなっているユーザー名前空間に参加しようとした。
117 .TP 
118 \fBEINVAL\fP
119 .\" commit e66eded8309ebf679d3d3c1f5820d1f2ca332c71
120 呼び出し元が他のプロセスとファイルシステム状態 (特に root ディレクトリ) を共有していて (\fBCLONE_FS\fP)、
121 新しいユーザー名前空間に参加しようとした。
122 .TP 
123 \fBEINVAL\fP
124 .\" See kernel/user_namespace.c::userns_install() [kernel 3.15 sources]
125 呼び出し元プロセスがマルチスレッドで、新しいユーザー名前空間に参加しようとした。
126 .TP 
127 \fBENOMEM\fP
128 指定された名前空間に変更するのに必要なメモリが割り当てられない。
129 .TP 
130 \fBEPERM\fP
131 呼び出し元スレッドはこの操作を行うのに必要なケーパビリティを持っていなかった。
132 .SH バージョン
133 \fBsetns\fP() システムコールはカーネル 3.0 で Linux に初めて登場した。
134 ライブラリによるサポートは glibc バージョン 2.14 を追加された。
135 .SH 準拠
136 \fBsetns\fP() システムコールは Linux 固有である。
137 .SH 注意
138 新しいスレッドが \fBclone\fP(2) を使って作成された際に共有できる全ての属性を、
139 \fBsetns\fP() を使って変更できるわけではない。
140 .SH 例
141 以下のプログラムは 2 つ以上の引き数を取る。 最初の引き数には、 既存の \fI/proc/[pid]/ns/\fP
142 ディレクトリの名前空間ファイルのパス名を指定する。 残りの引き数は、コマンドとその引き数を指定する。 このプログラムは名前空間ファイルをオープンし、
143 \fBsetns\fP() を使って名前空間に参加し、 指定されたコマンドをその名前空間内で実行する。
144
145 以下のシェルセッションでは、 このプログラム (\fIns_exec\fP という名前のバイナリとしてコンパイルされている)を、 \fBclone\fP(2)
146 のマニュアルページの \fBCLONE_NEWUTS\fP のサンプルプログラムと組み合わせて使っている。
147
148 まず、 \fBclone\fP(2) のサンプルプログラムをバックグラウンドで実行する。 このプログラムは、 別の UTS 名前空間で子プロセスを作成する。
149 子プロセスは自分の名前空間内でホスト名を変更する。 それから、 親プロセスと子プロセスの両方でそれぞれの UTS 名前空間のホスト名を表示し、 2
150 つのホスト名が違うことが確認できる。
151
152 .nf
153 .in +4n
154 $ \fBsu\fP                   # 名前空間の操作には特権が必要
155 Password:
156 # \fB./newuts bizarro &\fP
157 [1] 3549
158 clone() returned 3550
159 uts.nodename in child:  bizarro
160 uts.nodename in parent: antero
161 # \fBuname \-n\fP             # シェルでホスト名を確認
162 antero
163 .in
164 .fi
165
166 次に、以下のプログラムを使ってシェルを実行する。
167 このシェルの中では、ホスト名が最初のプログラムで作成された子プロセスが設定したホスト名になっていることを確認できる。
168
169 .nf
170 .in +4n
171 # \fB./ns_exec /proc/3550/ns/uts /bin/bash\fP
172 # \fBuname \-n\fP             #  ns_exec で起動されたシェル内で実行
173 bizarro
174 .in
175 .fi
176 .SS プログラムのソース
177 .nf
178 #define _GNU_SOURCE
179 #include <fcntl.h>
180 #include <sched.h>
181 #include <unistd.h>
182 #include <stdlib.h>
183 #include <stdio.h>
184
185 #define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \e
186                         } while (0)
187
188 int
189 main(int argc, char *argv[])
190 {
191     int fd;
192
193     if (argc < 3) {
194         fprintf(stderr, "%s /proc/PID/ns/FILE cmd args...\en", argv[0]);
195         exit(EXIT_FAILURE);
196     }
197
198     fd = open(argv[1], O_RDONLY);  /* 名前空間のディスクリプタを取得 */
199     if (fd == \-1)
200         errExit("open");
201
202     if (setns(fd, 0) == \-1)        /* 名前空間に参加 */
203         errExit("setns");
204
205     execvp(argv[2], &argv[2]);     /* 名前空間内でコマンドを実行 */
206     errExit("execvp");
207 }
208 .fi
209 .SH 関連項目
210 \fBclone\fP(2), \fBfork\fP(2), \fBunshare\fP(2), \fBvfork\fP(2), \fBnamespaces\fP(7),
211 \fBunix\fP(7)
212 .SH この文書について
213 この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.77 の一部
214 である。プロジェクトの説明とバグ報告に関する情報は
215 http://www.kernel.org/doc/man\-pages/ に書かれている。