File: setns.2

package info (click to toggle)
manpages-ja 0.5.0.0.20140515%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 27,672 kB
  • ctags: 7
  • sloc: perl: 161; makefile: 98
file content (165 lines) | stat: -rw-r--r-- 7,287 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
.\" Copyright (C) 2011, Eric Biederman <ebiederm@xmission.com>
.\" and Copyright (C) 2011, 2012, Michael Kerrisk <mtk.manpages@gamil.com>
.\"
.\" %%%LICENSE_START(GPLv2_ONELINE)
.\" Licensed under the GPLv2
.\" %%%LICENSE_END
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.\"
.\" Japanese Version Copyright (c) 2012-2013  Akihiro MOTOKI
.\"         all rights reserved.
.\" Translated 2012-06-04, Akihiro MOTOKI <amotoki@gmail.com>
.\" Updated 2013-05-01, Akihiro MOTOKI <amotoki@gmail.com>
.\" Updated 2013-05-06, Akihiro MOTOKI <amotoki@gmail.com>
.\"
.TH SETNS 2 2013\-01\-01 Linux "Linux Programmer's Manual"
.SH 名前
setns \- スレッドに名前空間を関連付けしなおす
.SH 書式
.nf
\fB#define _GNU_SOURCE\fP             /* feature_test_macros(7) 参照 */
\fB#include <sched.h>\fP
.sp
\fBint setns(int \fP\fIfd\fP\fB, int \fP\fInstype\fP\fB);\fP
.fi
.SH 説明
名前空間を参照するファイルディスクリプタを指定すると、
呼び出したスレッドにその名前空間を関連付けしなおす。

\fIfd\fP 引き数は、 \fI/proc/[pid]/ns/\fP ディレクトリ内の名前空間エントリ
のいずれかを参照するファイルディスクリプタである。
\fI/proc/[pid]/ns/\fP の詳細は \fBproc\fP(5) を参照。
\fInstype\fP 引き数で指定された制限の範囲内で、
呼び出したスレッドに \fIfd\fP に対応する名前空間を関連付けしなおす。

\fInstype\fP 引き数は、呼び出したスレッドがどのタイプの名前空間を
関連付けしなおすことができるかを指定する。
この引き数には以下のいずれかの値を指定できる。
.TP 
\fB0\fP
どのタイプの名前空間も関連付けることができる。
.TP 
\fBCLONE_NEWIPC\fP
\fIfd\fP は IPC 名前空間を参照していなければならない。
.TP 
\fBCLONE_NEWNET\fP
\fIfd\fP はネットワーク名前空間を参照していなければならない。
.TP 
\fBCLONE_NEWUTS\fP
\fIfd\fP は UTS 名前空間を参照していなければならない。
.PP
呼び出し側が \fIfd\fP がどのタイプの名前空間を参照しているかを知っている
(もしくは気にする必要がない) 場合には、 \fInstype\fP に 0 を指定すれば十分
である。呼び出し側が \fIfd\fP がどのタイプの名前空間を参照しているかを
知っておらず、かつ、特定のタイプの名前空間であることを保証したい場合、
\fInstype\fP に 0 以外の値を指定するとよい。 (ファイルディスクリプタが別の
プロセスによりオープンされ、例えば、UNIX ドメインソケット経由で呼び出し
側に渡された場合などでは、呼び出し側が \fIfd\fP がどのタイプの名前空間を
参照しているかを知らない可能性がある。)
.SH 返り値
成功すると \fIsetns\fP() は 0 を返す。
失敗すると、 \-1 が返され、 \fIerrno\fP にエラーを示す値が設定される。
.SH エラー
.TP 
\fBEBADF\fP
\fIfd\fP が有効なファイルディスクリプタではない。
.TP 
\fBEINVAL\fP
\fIfd\fP が \fInstype\fP で指定されたタイプと一致しない名前空間を参照している。
または、指定された名前空間をそのスレッドに関連付けし直す際に問題
があった。
.TP 
\fBENOMEM\fP
指定された名前空間に変更するのに必要なメモリが割り当てられない。
.TP 
\fBEPERM\fP
呼び出したスレッドがこの操作を行うのに必要な特権 (\fBCAP_SYS_ADMIN\fP) を
持っていなかった。
.SH バージョン
\fBsetns\fP() システムコールはカーネル 3.0 で Linux に初めて登場した。
ライブラリによるサポートは glibc バージョン 2.14 を追加された。
.SH 準拠
\fBsetns\fP() システムコールは Linux 固有である。
.SH 注意
新しいスレッドが \fBclone\fP(2) を使って作成された際に共有できる全ての属性を、
\fBsetns\fP() を使って変更できるわけではない。
.SH 例
以下のプログラムは 2 つ以上の引き数を取る。 最初の引き数には、 既存の \fI/proc/[pid]/ns/\fP
ディレクトリの名前空間ファイルのパス名を指定する。 残りの引き数は、コマンドとその引き数を指定する。 このプログラムは名前空間ファイルをオープンし、
\fBsetns\fP() を使って名前空間に参加し、 指定されたコマンドをその名前空間内で実行する。

以下のシェルセッションでは、 このプログラム (\fIns_exec\fP という名前のバイナリとしてコンパイルされている)を、 \fBclone\fP(2)
のマニュアルページの \fBCLONE_NEWUTS\fP のサンプルプログラムと組み合わせて使っている。

まず、 \fBclone\fP(2) のサンプルプログラムをバックグラウンドで実行する。 このプログラムは、 別の UTS 名前空間で子プロセスを作成する。
子プロセスは自分の名前空間内でホスト名を変更する。 それから、 親プロセスと子プロセスの両方でそれぞれの UTS 名前空間のホスト名を表示し、 2
つのホスト名が違うことが確認できる。

.nf
.in +4n
$ \fBsu\fP                   # 名前空間の操作には特権が必要
Password:
# \fB./newuts bizarro &\fP
[1] 3549
clone() returned 3550
uts.nodename in child:  bizarro
uts.nodename in parent: antero
# \fBuname \-n\fP             # シェルでホスト名を確認
antero
.in
.fi

次に、以下のプログラムを使ってシェルを実行する。
このシェルの中では、ホスト名が最初のプログラムで作成された子プロセスが設定したホスト名になっていることを確認できる。

.nf
.in +4n
# \fB./ns_exec /proc/3550/ns/uts /bin/bash\fP
# \fBuname \-n\fP             #  ns_exec で起動されたシェル内で実行
bizarro
.in
.fi
.SS プログラムのソース
.nf
#define _GNU_SOURCE
#include <fcntl.h>
#include <sched.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

#define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \e
                        } while (0)

int
main(int argc, char *argv[])
{
    int fd;

    if (argc < 3) {
        fprintf(stderr, "%s /proc/PID/ns/FILE cmd args...\en", argv[0]);
        exit(EXIT_FAILURE);
    }

    fd = open(argv[1], O_RDONLY);   /* 名前空間のディスクリプタを取得 */
    if (fd == \-1)
        errExit("open");

    if (setns(fd, 0) == \-1)         /* 名前空間に参加 */
        errExit("setns");

    execvp(argv[2], &argv[2]);      /* 名前空間内でコマンドを実行 */
    errExit("execvp");
}
.fi
.SH 関連項目
\fBclone\fP(2), \fBfork\fP(2), \fBvfork\fP(2), \fBproc\fP(5), \fBunix\fP(7)
.SH この文書について
この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.65 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man\-pages/ に書かれている。