1 .\" Copyright (C) 2011, Eric Biederman <ebiederm@xmission.com>
2 .\" and Copyright (C) 2011, 2012, Michael Kerrisk <mtk.manpages@gamil.com>
4 .\" %%%LICENSE_START(GPLv2_ONELINE)
5 .\" Licensed under the GPLv2
8 .\"*******************************************************************
10 .\" This file was generated with po4a. Translate the source file.
12 .\"*******************************************************************
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>
20 .TH SETNS 2 2015\-01\-10 Linux "Linux Programmer's Manual"
22 setns \- スレッドに名前空間を関連付けしなおす
25 \fB#define _GNU_SOURCE\fP /* feature_test_macros(7) 参照 */
26 \fB#include <sched.h>\fP
28 \fBint setns(int \fP\fIfd\fP\fB, int \fP\fInstype\fP\fB);\fP
31 名前空間を参照するファイルディスクリプターを指定すると、
32 呼び出したスレッドにその名前空間を関連付けしなおす。
34 \fIfd\fP 引き数は、 \fI/proc/[pid]/ns/\fP ディレクトリ内の名前空間エントリー
35 のいずれかを参照するファイルディスクリプターである。
36 \fI/proc/[pid]/ns/\fP の詳細は \fBnamespaces\fP(7) を参照。
37 \fInstype\fP 引き数で指定された制限の範囲内で、
38 呼び出したスレッドに \fIfd\fP に対応する名前空間を関連付けしなおす。
40 \fInstype\fP 引き数は、呼び出したスレッドがどのタイプの名前空間を
42 この引き数には以下のいずれかの値を指定できる。
45 どのタイプの名前空間も関連付けることができる。
47 \fBCLONE_NEWIPC\fP (Linux 3.0 以降)
48 \fIfd\fP は IPC 名前空間を参照していなければならない。
50 \fBCLONE_NEWNET\fP (Linux 3.0 以降)
51 \fIfd\fP はネットワーク名前空間を参照していなければならない。
53 \fBCLONE_NEWNS\fP (Linux 3.8 以降)
54 \fIfd\fP はマウント名前空間を参照していなければならない。
56 \fBCLONE_NEWPID\fP (Linux 3.8 以降)
57 \fIfd\fP は子孫の PID 名前空間を参照していなければならない。
59 \fBCLONE_NEWUSER\fP (Linux 3.8 以降)
60 \fIfd\fP はユーザー名前空間を参照していなければならない。
62 \fBCLONE_NEWUTS\fP (Linux 3.0 以降)
63 \fIfd\fP は UTS 名前空間を参照していなければならない。
65 呼び出し側が \fIfd\fP がどのタイプの名前空間を参照しているかを知っている
66 (もしくは気にする必要がない) 場合には、 \fInstype\fP に 0 を指定すれば十分
67 である。呼び出し側が \fIfd\fP がどのタイプの名前空間を参照しているかを
68 知っておらず、かつ、特定のタイプの名前空間であることを保証したい場合、
69 \fInstype\fP に 0 以外の値を指定するとよい。 (ファイルディスクリプターが別の
70 プロセスによりオープンされ、例えば、UNIX ドメインソケット経由で呼び出し
71 側に渡された場合などでは、呼び出し側が \fIfd\fP がどのタイプの名前空間を
74 \fBCLONE_NEWPID\fP は他の \fInstype\fP 値の場合と少し違った動作をする。 呼び出し元スレッドを PID 名前空間に関連付けし直すと、
75 呼び出し元の子プロセスが作成される PID 名前空間が変更されるだけである。 呼び出し元自身の PID 名前空間は変更されない。 PID
76 名前空間を関連付けし直すことができるのは、 \fIfd\fP で指定された PID 名前空間が呼び出し元の PID 名前空間の子孫
77 (子プロセス、孫プロセスなど) の場合だけである。 PID 名前空間の詳細は \fBpid_namespaces\fP(7) を参照。
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) を参照。
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) を参照。
97 成功すると \fBsetns\fP() は 0 を返す。 失敗すると、 \-1 が返され、 \fIerrno\fP にエラーを示す値が設定される。
101 \fIfd\fP が有効なファイルディスクリプターではない。
104 \fIfd\fP が \fInstype\fP で指定されたタイプと一致しない名前空間を参照している。
107 スレッドを指定された名前空間に関連付けし直す際に問題が発生した。
109 .\" See kernel/pid_namespace.c::pidns_install() [kernel 3.18 sources]
111 呼び出し元が先祖 (親や親の親など) の PID 名前空間に参加しようとした。
114 自分がすでにメンバーとなっているユーザー名前空間に参加しようとした。
117 .\" commit e66eded8309ebf679d3d3c1f5820d1f2ca332c71
118 呼び出し元が他のプロセスとファイルシステム状態 (特に root ディレクトリ) を共有していて (\fBCLONE_FS\fP)、
119 新しいユーザー名前空間に参加しようとした。
122 .\" See kernel/user_namespace.c::userns_install() [kernel 3.15 sources]
123 呼び出し元プロセスがマルチスレッドで、新しいユーザー名前空間に参加しようとした。
126 指定された名前空間に変更するのに必要なメモリーが割り当てられない。
129 呼び出し元スレッドはこの操作を行うのに必要なケーパビリティを持っていなかった。
131 \fBsetns\fP() システムコールはカーネル 3.0 で Linux に初めて登場した。
132 ライブラリによるサポートは glibc バージョン 2.14 を追加された。
134 \fBsetns\fP() システムコールは Linux 固有である。
136 新しいスレッドが \fBclone\fP(2) を使って作成された際に共有できる全ての属性を、
137 \fBsetns\fP() を使って変更できるわけではない。
139 以下のプログラムは 2 つ以上の引き数を取る。 最初の引き数には、 既存の \fI/proc/[pid]/ns/\fP
140 ディレクトリの名前空間ファイルのパス名を指定する。 残りの引き数は、コマンドとその引き数を指定する。 このプログラムは名前空間ファイルをオープンし、
141 \fBsetns\fP() を使って名前空間に参加し、 指定されたコマンドをその名前空間内で実行する。
143 以下のシェルセッションでは、 このプログラム (\fIns_exec\fP という名前のバイナリとしてコンパイルされている)を、 \fBclone\fP(2)
144 のマニュアルページの \fBCLONE_NEWUTS\fP のサンプルプログラムと組み合わせて使っている。
146 まず、 \fBclone\fP(2) のサンプルプログラムをバックグラウンドで実行する。 このプログラムは、 別の UTS 名前空間で子プロセスを作成する。
147 子プロセスは自分の名前空間内でホスト名を変更する。 それから、 親プロセスと子プロセスの両方でそれぞれの UTS 名前空間のホスト名を表示し、 2
152 $ \fBsu\fP # 名前空間の操作には特権が必要
154 # \fB./newuts bizarro &\fP
156 clone() returned 3550
157 uts.nodename in child: bizarro
158 uts.nodename in parent: antero
159 # \fBuname \-n\fP # シェルでホスト名を確認
164 次に、以下のプログラムを使ってシェルを実行する。
165 このシェルの中では、ホスト名が最初のプログラムで作成された子プロセスが設定したホスト名になっていることを確認できる。
169 # \fB./ns_exec /proc/3550/ns/uts /bin/bash\fP
170 # \fBuname \-n\fP # ns_exec で起動されたシェル内で実行
183 #define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \e
187 main(int argc, char *argv[])
192 fprintf(stderr, "%s /proc/PID/ns/FILE cmd args...\en", argv[0]);
196 fd = open(argv[1], O_RDONLY); /* 名前空間のディスクリプターを取得 */
200 if (setns(fd, 0) == \-1) /* 名前空間に参加 */
203 execvp(argv[2], &argv[2]); /* 名前空間内でコマンドを実行 */
208 \fBclone\fP(2), \fBfork\fP(2), \fBunshare\fP(2), \fBvfork\fP(2), \fBnamespaces\fP(7),
211 この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.79 の一部
212 である。プロジェクトの説明とバグ報告に関する情報は
213 http://www.kernel.org/doc/man\-pages/ に書かれている。