.\" Copyright (C) 2011, Eric Biederman .\" and Copyright (C) 2011, 2012, Michael Kerrisk .\" .\" %%%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 .\" Updated 2013-05-01, Akihiro MOTOKI .\" Updated 2013-05-06, Akihiro MOTOKI .\" .TH SETNS 2 2015\-01\-10 Linux "Linux Programmer's Manual" .SH 名前 setns \- スレッドに名前空間を関連付けしなおす .SH 書式 .nf \fB#define _GNU_SOURCE\fP /* feature_test_macros(7) 参照 */ \fB#include \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 の詳細は \fBnamespaces\fP(7) を参照。 \fInstype\fP 引き数で指定された制限の範囲内で、 呼び出したスレッドに \fIfd\fP に対応する名前空間を関連付けしなおす。 \fInstype\fP 引き数は、呼び出したスレッドがどのタイプの名前空間を 関連付けしなおすことができるかを指定する。 この引き数には以下のいずれかの値を指定できる。 .TP \fB0\fP どのタイプの名前空間も関連付けることができる。 .TP \fBCLONE_NEWIPC\fP (Linux 3.0 以降) \fIfd\fP は IPC 名前空間を参照していなければならない。 .TP \fBCLONE_NEWNET\fP (Linux 3.0 以降) \fIfd\fP はネットワーク名前空間を参照していなければならない。 .TP \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 以外の値を指定するとよい。 (ファイルディスクリプターが別の プロセスによりオープンされ、例えば、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 返り値 成功すると \fBsetns\fP() は 0 を返す。 失敗すると、 \-1 が返され、 \fIerrno\fP にエラーを示す値が設定される。 .SH エラー .TP \fBEBADF\fP \fIfd\fP が有効なファイルディスクリプターではない。 .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 指定された名前空間に変更するのに必要なメモリーが割り当てられない。 .TP \fBEPERM\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 #include #include #include #include #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), \fBunshare\fP(2), \fBvfork\fP(2), \fBnamespaces\fP(7), \fBunix\fP(7) .SH この文書について この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man\-pages/ に書かれている。