OSDN Git Service

(split) LDP: Restore and add Copyrights for draft pages
[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 2013\-01\-01 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 の詳細は \fBproc\fP(5) を参照。
37 \fInstype\fP 引き数で指定された制限の範囲内で、
38 呼び出したスレッドに \fIfd\fP に対応する名前空間を関連付けしなおす。
39
40 \fInstype\fP 引き数は、呼び出したスレッドがどのタイプの名前空間を
41 関連付けしなおすことができるかを指定する。
42 この引き数には以下のいずれかの値を指定できる。
43 .TP 
44 \fB0\fP
45 どのタイプの名前空間も関連付けることができる。
46 .TP 
47 \fBCLONE_NEWIPC\fP
48 \fIfd\fP は IPC 名前空間を参照していなければならない。
49 .TP 
50 \fBCLONE_NEWNET\fP
51 \fIfd\fP はネットワーク名前空間を参照していなければならない。
52 .TP 
53 \fBCLONE_NEWUTS\fP
54 \fIfd\fP は UTS 名前空間を参照していなければならない。
55 .PP
56 呼び出し側が \fIfd\fP がどのタイプの名前空間を参照しているかを知っている
57 (もしくは気にする必要がない) 場合には、 \fInstype\fP に 0 を指定すれば十分
58 である。呼び出し側が \fIfd\fP がどのタイプの名前空間を参照しているかを
59 知っておらず、かつ、特定のタイプの名前空間であることを保証したい場合、
60 \fInstype\fP に 0 以外の値を指定するとよい。 (ファイルディスクリプタが別の
61 プロセスによりオープンされ、例えば、UNIX ドメインソケット経由で呼び出し
62 側に渡された場合などでは、呼び出し側が \fIfd\fP がどのタイプの名前空間を
63 参照しているかを知らない可能性がある。)
64 .SH 返り値
65 成功すると \fIsetns\fP() は 0 を返す。
66 失敗すると、 \-1 が返され、 \fIerrno\fP にエラーを示す値が設定される。
67 .SH エラー
68 .TP 
69 \fBEBADF\fP
70 \fIfd\fP が有効なファイルディスクリプタではない。
71 .TP 
72 \fBEINVAL\fP
73 \fIfd\fP が \fInstype\fP で指定されたタイプと一致しない名前空間を参照している。
74 または、指定された名前空間をそのスレッドに関連付けし直す際に問題
75 があった。
76 .TP 
77 \fBENOMEM\fP
78 指定された名前空間に変更するのに必要なメモリが割り当てられない。
79 .TP 
80 \fBEPERM\fP
81 呼び出したスレッドがこの操作を行うのに必要な特権 (\fBCAP_SYS_ADMIN\fP) を
82 持っていなかった。
83 .SH バージョン
84 \fBsetns\fP() システムコールはカーネル 3.0 で Linux に初めて登場した。
85 ライブラリによるサポートは glibc バージョン 2.14 を追加された。
86 .SH 準拠
87 \fBsetns\fP() システムコールは Linux 固有である。
88 .SH 注意
89 新しいスレッドが \fBclone\fP(2) を使って作成された際に共有できる全ての属性を、
90 \fBsetns\fP() を使って変更できるわけではない。
91 .SH 例
92 以下のプログラムは 2 つ以上の引き数を取る。 最初の引き数には、 既存の \fI/proc/[pid]/ns/\fP
93 ディレクトリの名前空間ファイルのパス名を指定する。 残りの引き数は、コマンドとその引き数を指定する。 このプログラムは名前空間ファイルをオープンし、
94 \fBsetns\fP() を使って名前空間に参加し、 指定されたコマンドをその名前空間内で実行する。
95
96 以下のシェルセッションでは、 このプログラム (\fIns_exec\fP という名前のバイナリとしてコンパイルされている)を、 \fBclone\fP(2)
97 のマニュアルページの \fBCLONE_NEWUTS\fP のサンプルプログラムと組み合わせて使っている。
98
99 まず、 \fBclone\fP(2) のサンプルプログラムをバックグラウンドで実行する。 このプログラムは、 別の UTS 名前空間で子プロセスを作成する。
100 子プロセスは自分の名前空間内でホスト名を変更する。 それから、 親プロセスと子プロセスの両方でそれぞれの UTS 名前空間のホスト名を表示し、 2
101 つのホスト名が違うことが確認できる。
102
103 .nf
104 .in +4n
105 $ \fBsu\fP                   # 名前空間の操作には特権が必要
106 Password:
107 # \fB./newuts bizarro &\fP
108 [1] 3549
109 clone() returned 3550
110 uts.nodename in child:  bizarro
111 uts.nodename in parent: antero
112 # \fBuname \-n\fP             # シェルでホスト名を確認
113 antero
114 .in
115 .fi
116
117 次に、以下のプログラムを使ってシェルを実行する。
118 このシェルの中では、ホスト名が最初のプログラムで作成された子プロセスが設定したホスト名になっていることを確認できる。
119
120 .nf
121 .in +4n
122 # \fB./ns_exec /proc/3550/ns/uts /bin/bash\fP
123 # \fBuname \-n\fP             #  ns_exec で起動されたシェル内で実行
124 bizarro
125 .in
126 .fi
127 .SS プログラムのソース
128 .nf
129 #define _GNU_SOURCE
130 #include <fcntl.h>
131 #include <sched.h>
132 #include <unistd.h>
133 #include <stdlib.h>
134 #include <stdio.h>
135
136 #define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \e
137                         } while (0)
138
139 int
140 main(int argc, char *argv[])
141 {
142     int fd;
143
144     if (argc < 3) {
145         fprintf(stderr, "%s /proc/PID/ns/FILE cmd args...\en", argv[0]);
146         exit(EXIT_FAILURE);
147     }
148
149     fd = open(argv[1], O_RDONLY);   /* 名前空間のディスクリプタを取得 */
150     if (fd == \-1)
151         errExit("open");
152
153     if (setns(fd, 0) == \-1)         /* 名前空間に参加 */
154         errExit("setns");
155
156     execvp(argv[2], &argv[2]);      /* 名前空間内でコマンドを実行 */
157     errExit("execvp");
158 }
159 .fi
160 .SH 関連項目
161 \fBclone\fP(2), \fBfork\fP(2), \fBvfork\fP(2), \fBproc\fP(5), \fBunix\fP(7)
162 .SH この文書について
163 この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.53 の一部
164 である。プロジェクトの説明とバグ報告に関する情報は
165 http://www.kernel.org/doc/man\-pages/ に書かれている。