.\" 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"
+.TH SETNS 2 2015\-01\-10 Linux "Linux Programmer's Manual"
.SH 名前
setns \- スレッドに名前空間を関連付けしなおす
.SH 書式
\fBint setns(int \fP\fIfd\fP\fB, int \fP\fInstype\fP\fB);\fP
.fi
.SH 説明
-名前空間を参照するファイルディスクリプタを指定すると、
+å\90\8då\89\8d空é\96\93ã\82\92å\8f\82ç\85§ã\81\99ã\82\8bã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\82\92æ\8c\87å®\9aã\81\99ã\82\8bã\81¨ã\80\81
呼び出したスレッドにその名前空間を関連付けしなおす。
-\fIfd\fP 引き数は、 \fI/proc/[pid]/ns/\fP ディレクトリ内の名前空間エントリ
-のいずれかを参照するファイルディスクリプタである。
-\fI/proc/[pid]/ns/\fP の詳細は \fBproc\fP(5) を参照。
+\fIfd\fP 引き数は、 \fI/proc/[pid]/ns/\fP ディレクトリ内の名前空間エントリー
+ã\81®ã\81\84ã\81\9aã\82\8cã\81\8bã\82\92å\8f\82ç\85§ã\81\99ã\82\8bã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81§ã\81\82ã\82\8bã\80\82
+\fI/proc/[pid]/ns/\fP の詳細は \fBnamespaces\fP(7) を参照。
\fInstype\fP 引き数で指定された制限の範囲内で、
呼び出したスレッドに \fIfd\fP に対応する名前空間を関連付けしなおす。
\fB0\fP
どのタイプの名前空間も関連付けることができる。
.TP
-\fBCLONE_NEWIPC\fP
+\fBCLONE_NEWIPC\fP (Linux 3.0 以降)
\fIfd\fP は IPC 名前空間を参照していなければならない。
.TP
-\fBCLONE_NEWNET\fP
+\fBCLONE_NEWNET\fP (Linux 3.0 以降)
\fIfd\fP はネットワーク名前空間を参照していなければならない。
.TP
-\fBCLONE_NEWUTS\fP
+\fBCLONE_NEWNS\fP (Linux 3.8 以降)
+\fIfd\fP はマウント名前空間を参照していなければならない。
+.TP
+\fBCLONE_NEWPID\fP (Linux 3.8 以降)
+\fIfd\fP は子孫の PID 名前空間を参照していなければならない。
+.TP
+\fBCLONE_NEWUSER\fP (Linux 3.8 以降)
+\fIfd\fP はユーザー名前空間を参照していなければならない。
+.TP
+\fBCLONE_NEWUTS\fP (Linux 3.0 以降)
\fIfd\fP は UTS 名前空間を参照していなければならない。
.PP
呼び出し側が \fIfd\fP がどのタイプの名前空間を参照しているかを知っている
(もしくは気にする必要がない) 場合には、 \fInstype\fP に 0 を指定すれば十分
である。呼び出し側が \fIfd\fP がどのタイプの名前空間を参照しているかを
知っておらず、かつ、特定のタイプの名前空間であることを保証したい場合、
-\fInstype\fP に 0 以外の値を指定するとよい。 (ファイルディスクリプタが別の
+\fInstype\fP ã\81« 0 以å¤\96ã\81®å\80¤ã\82\92æ\8c\87å®\9aã\81\99ã\82\8bã\81¨ã\82\88ã\81\84ã\80\82 (ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81\8cå\88¥ã\81®
プロセスによりオープンされ、例えば、UNIX ドメインソケット経由で呼び出し
側に渡された場合などでは、呼び出し側が \fIfd\fP がどのタイプの名前空間を
参照しているかを知らない可能性がある。)
+
+\fBCLONE_NEWPID\fP は他の \fInstype\fP 値の場合と少し違った動作をする。 呼び出し元スレッドを PID 名前空間に関連付けし直すと、
+呼び出し元の子プロセスが作成される PID 名前空間が変更されるだけである。 呼び出し元自身の PID 名前空間は変更されない。 PID
+名前空間を関連付けし直すことができるのは、 \fIfd\fP で指定された PID 名前空間が呼び出し元の PID 名前空間の子孫
+(子プロセス、孫プロセスなど) の場合だけである。 PID 名前空間の詳細は \fBpid_namespaces\fP(7) を参照。
+
+.\" See kernel/user_namespace.c:userns_install() [3.8 source]
+.\" commit e66eded8309ebf679d3d3c1f5820d1f2ca332c71
+.\" https://lwn.net/Articles/543273/
+プロセスが自分自身をユーザー名前空間に再関連付けするには、 そのプロセスは変更後のユーザー名前空間において \fBCAP_SYS_ADMIN\fP
+ケーパビリティを持っていなければならない。 ユーザー名前空間への参加に成功すると、 そのユーザー ID やグループ ID に関わらず、
+プロセスにはその名前空間におけるすべてのケーパビリティが認められる。 マルチスレッドのプロセスは \fBsetns\fP()
+でユーザー名前空間を変更できない。 \fBsetns\fP() を使って、呼び出し元が現在のユーザー名前空間に再度入ることは認められていない。 これにより、
+いくつかのケーパビリティを外した呼び出し元が \fBsetns\fP() を呼び出すことでそれらのケーパビリティを再度得ることを防ぐことができる。
+セキュリティ上の理由から、 ファイルシステム関連の属性 (共有が \fBclone\fP(2) \fBCLONE_FS\fP フラグで制御される属性)
+を別のプロセスと共有している場合、 プロセスは新しいユーザー名前空間に参加できない。 ユーザー名前空間の詳細は
+\fBuser_namespaces\fP(7) を参照。
+
+.\" Above check is in fs/namespace.c:mntns_install() [3.8 source]
+プロセスがマルチスレッドの場合、そのプロセスを新しいマウント名前空間に関連付けし直すことは許可されていない。
+マウント名前空間を変更するには、呼び出し元のプロセスが、 自分自身のユーザー名前空間において \fBCAP_SYS_CHROOT\fP と
+\fBCAP_SYS_ADMIN\fP の両方のケーパビリティを持っており、 変更後のマウント名前空間で \fBCAP_SYS_ADMIN\fP
+ケーパビリティを持っていなければならない。 ユーザー名前空間とマウント名前空間の関係の詳細は \fBuser_namespaces\fP(7) を参照。
.SH 返り値
-成功すると \fIsetns\fP() は 0 を返す。
-失敗すると、 \-1 が返され、 \fIerrno\fP にエラーを示す値が設定される。
+成功すると \fBsetns\fP() は 0 を返す。 失敗すると、 \-1 が返され、 \fIerrno\fP にエラーを示す値が設定される。
.SH エラー
.TP
\fBEBADF\fP
-\fIfd\fP が有効なファイルディスクリプタではない。
+\fIfd\fP ã\81\8cæ\9c\89å\8a¹ã\81ªã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\81§ã\81¯ã\81ªã\81\84ã\80\82
.TP
\fBEINVAL\fP
\fIfd\fP が \fInstype\fP で指定されたタイプと一致しない名前空間を参照している。
-または、指定された名前空間をそのスレッドに関連付けし直す際に問題
-があった。
+.TP
+\fBEINVAL\fP
+スレッドを指定された名前空間に関連付けし直す際に問題が発生した。
+.TP
+.\" See kernel/pid_namespace.c::pidns_install() [kernel 3.18 sources]
+\fBEINVAL\fP
+呼び出し元が先祖 (親や親の親など) の PID 名前空間に参加しようとした。
+.TP
+\fBEINVAL\fP
+自分がすでにメンバーとなっているユーザー名前空間に参加しようとした。
+.TP
+\fBEINVAL\fP
+.\" commit e66eded8309ebf679d3d3c1f5820d1f2ca332c71
+呼び出し元が他のプロセスとファイルシステム状態 (特に root ディレクトリ) を共有していて (\fBCLONE_FS\fP)、
+新しいユーザー名前空間に参加しようとした。
+.TP
+\fBEINVAL\fP
+.\" See kernel/user_namespace.c::userns_install() [kernel 3.15 sources]
+呼び出し元プロセスがマルチスレッドで、新しいユーザー名前空間に参加しようとした。
.TP
\fBENOMEM\fP
-指定された名前空間に変更するのに必要なメモリが割り当てられない。
+æ\8c\87å®\9aã\81\95ã\82\8cã\81\9få\90\8då\89\8d空é\96\93ã\81«å¤\89æ\9b´ã\81\99ã\82\8bã\81®ã\81«å¿\85è¦\81ã\81ªã\83¡ã\83¢ã\83ªã\83¼ã\81\8cå\89²ã\82\8aå½\93ã\81¦ã\82\89ã\82\8cã\81ªã\81\84ã\80\82
.TP
\fBEPERM\fP
-呼び出したスレッドがこの操作を行うのに必要な特権 (\fBCAP_SYS_ADMIN\fP) を
-持っていなかった。
+呼び出し元スレッドはこの操作を行うのに必要なケーパビリティを持っていなかった。
.SH バージョン
\fBsetns\fP() システムコールはカーネル 3.0 で Linux に初めて登場した。
ライブラリによるサポートは glibc バージョン 2.14 を追加された。
exit(EXIT_FAILURE);
}
- fd = open(argv[1], O_RDONLY); /* 名前空間のディスクリプタを取得 */
+ fd = open(argv[1], O_RDONLY); /* 名前空間のディスクリプターを取得 */
if (fd == \-1)
errExit("open");
- if (setns(fd, 0) == \-1) /* 名前空間に参加 */
+ if (setns(fd, 0) == \-1) /* 名前空間に参加 */
errExit("setns");
- execvp(argv[2], &argv[2]); /* 名前空間内でコマンドを実行 */
+ execvp(argv[2], &argv[2]); /* 名前空間内でコマンドを実行 */
errExit("execvp");
}
.fi
.SH 関連項目
-\fBclone\fP(2), \fBfork\fP(2), \fBvfork\fP(2), \fBproc\fP(5), \fBunix\fP(7)
+\fBclone\fP(2), \fBfork\fP(2), \fBunshare\fP(2), \fBvfork\fP(2), \fBnamespaces\fP(7),
+\fBunix\fP(7)
.SH この文書について
-この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.63 の一部
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.78 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man\-pages/ に書かれている。