OSDN Git Service

Update README
[linuxjm/LDP_man-pages.git] / release / man2 / unshare.2
index 18c9a28..97c39eb 100644 (file)
@@ -1,6 +1,9 @@
 .\" Copyright (C) 2006, Janak Desai <janak@us.ibm.com>
-.\" and Copyright (C) 2006, Michael Kerrisk <mtk.manpages@gmail.com>
+.\" and Copyright (C) 2006, 2012 Michael Kerrisk <mtk.manpages@gmail.com>
+.\"
+.\" %%%LICENSE_START(GPL_NOVERSION_ONELINE)
 .\" Licensed under the GPL
+.\" %%%LICENSE_END
 .\"
 .\" Patch Justification:
 .\" unshare system call is needed to implement, using PAM,
 .\" by clone, which would require porting and maintaining all commands
 .\" such as login, and su, that establish a user session.
 .\"
-.\" FIXME Document CLONE_NEWIPC, which is new in 2.6.18
-.\" FIXME Document CLONE_NEWUTS, which is new in 2.6.19
-.\" FIXME Document CLONE_SYSVSEM, which is new in 2.6.26
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
 .\"
 .\" Japanese Version Copyright (c) 2006 Yuichi SATO
 .\"         all rights reserved.
 .\" Translated 2006-08-10 by Yuichi SATO <ysato444@yahoo.co.jp>, LDP v2.36
+.\" Updated 2012-05-08, Akihiro MOTOKI <amotoki@gmail.com>
+.\" Updated 2013-03-26, Akihiro MOTOKI <amotoki@gmail.com>
+.\" Updated 2013-05-06, Akihiro MOTOKI <amotoki@gmail.com>
 .\"
-.TH UNSHARE 2 2010-09-10 "Linux" "Linux Programmer's Manual"
+.TH UNSHARE 2 2014\-09\-21 Linux "Linux Programmer's Manual"
 .SH 名前
 unshare \- プロセス実行コンテキストの一部を分離する
 .SH 書式
 .nf
-.BR "#define _GNU_SOURCE" "             /* feature_test_macros(7) 参照 */"
-.\" Actually _BSD_SOURCE || _SVID_SOURCE
-.\" See http://sources.redhat.com/bugzilla/show_bug.cgi?id=4749
-.B #include <sched.h>
+\fB#include <sched.h>\fP
 .sp
-.BI "int unshare(int " flags );
+\fBint unshare(int \fP\fIflags\fP\fB);\fP
 .fi
+.sp
+.in -4n
+glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7)  参照):
+.in
+.sp
+\fBunshare\fP():
+.ad l
+.RS 4
+.PD 0
+.TP  4
+glibc 2.14 以降:
+_GNU_SOURCE
+.TP  4
+.\" See http://sources.redhat.com/bugzilla/show_bug.cgi?id=4749
+glibc 2.14 より前:
+_BSD_SOURCE || _SVID_SOURCE
+    /* _GNU_SOURCE も定義される */
+.PD
+.RE
+.ad b
 .SH 説明
-.BR unshare ()
-を使うと、プロセスは他のプロセスと現在共有している
-実行コンテキストの一部を分離することができる。
-実行コンテキストの一部、たとえばマウント名前空間 (mount namespace)
-などは、新しいプロセスを
-.BR fork (2)
-または
-.BR vfork (2)
-を使って生成したときに、暗黙のうちに共有される。
-一方、仮想メモリなどは、
-.BR clone (2)
+\fBunshare\fP()  を使うと、プロセスは他のプロセスと現在共有している 実行コンテキストの一部を分離することができる。
+実行コンテキストの一部、たとえばマウント名前空間 (mount namespace)  などは、新しいプロセスを \fBfork\fP(2)  または
+\fBvfork\fP(2)  を使って生成したときに、暗黙のうちに共有される。 一方、仮想メモリーなどは、 \fBclone\fP(2)
 を使ってプロセスを生成するときに、明示的に共有することを要求できる。
 
-.BR unshare ()
-の主な利用法は、プロセスが新しいプロセスを生成することなく、
-共有実行コンテキストを制御することである。
-
-.I flags
-引き数はビットマスクであり、
-実行コンテキストのどの部分の共有を解除するかを表す。
-この引き数は、以下の定数の 0 個以上の OR で指定する:
-.TP
-.B CLONE_FILES
-.BR clone (2)
-.B CLONE_FILES
-フラグの効果を取り消す。
-ファイルディスクリプタテーブルを共有させず、
-呼び出し元プロセスは他のプロセスとファイルディスクリプタを共有しなくなる。
-.TP
-.B CLONE_FS
-.BR clone (2)
-.B CLONE_FS
-フラグの効果を取り消す。
-ファイルシステム属性を共有させず、
-呼び出し元プロセスは他のプロセスとルートディレクトリ・
-カレントディレクトリ・umask 属性を共有しなくなる。
-.BR chroot (2),
-.BR chdir (2),
-.BR umask (2)
-に影響する。
-.TP
-.B CLONE_NEWNS
+\fBunshare\fP()  の主な利用法は、プロセスが新しいプロセスを生成することなく、 共有実行コンテキストを制御することである。
+
+\fIflags\fP 引き数はビットマスクであり、 実行コンテキストのどの部分の共有を解除するかを表す。 この引き数は、以下の定数の 0 個以上の OR
+で指定する:
+.TP 
+\fBCLONE_FILES\fP
+\fBclone\fP(2)  \fBCLONE_FILES\fP フラグの効果を取り消す。 ファイルディスクリプターテーブルを共有させず、
+呼び出し元プロセスは他のプロセスとファイルディスクリプターを共有しなくなる。
+.TP 
+\fBCLONE_FS\fP
+\fBclone\fP(2)  \fBCLONE_FS\fP フラグの効果を取り消す。ファイルシステム属性を共有させず、呼び出し元プロセスは、ルートディレクトリ
+(\fBchroot\fP(2))、カレントディレクトリ (\fBchdir\fP(2))、 umask (\fBumask\fP(2))
+を他のプロセスと共有しなくなる。
+.TP 
+\fBCLONE_NEWIPC\fP (Linux 2.6.19 以降)
+このフラグは \fBclone\fP(2) \fBCLONE_NEWIPC\fP フラグと同じ効果を持つ。
+System\ V IPC 名前空間を共有せず、呼び出し元プロセスは 他のプロセスとは
+共有しない固有の System\ V IPC 名前空間のコピーを持つ。 このフラグを指定
+すると、 \fBCLONE_SYSVSEM\fP も暗黙のうちに指定される。 \fBCLONE_NEWIPC\fP を
+使用するには \fBCAP_SYS_ADMIN\fP ケーパビリティが必要である。
+.TP 
+\fBCLONE_NEWNET\fP (Linux 2.6.24 以降)
+このフラグは \fBclone\fP(2) \fBCLONE_NEWNET\fP フラグと同じ効果を持つ。ネット
+ワーク名前空間を共有せず、呼び出し元プロセスは他のプロセスとは共有しな
+い固有のネットワーク名前空間のコピーを持つ。\fBCLONE_NEWNET\fP を使用する
+には \fBCAP_SYS_ADMIN\fP ケーパビリティが必要である。
+.TP 
+\fBCLONE_NEWNS\fP
 .\" These flag name are inconsistent:
 .\" CLONE_NEWNS does the same thing in clone(), but CLONE_VM,
 .\" CLONE_FS, and CLONE_FILES reverse the action of the clone()
 .\" flags of the same name.
-このフラグは
-.BR clone (2)
-.B CLONE_NEWNS
-フラグと\fI同じ\fR効果を持つ。
-マウント名前空間を共有せず、呼び出し元プロセスは
-他のプロセスとは共有しない固有の名前空間のコピーを持つ。
-このフラグを指定すると、
-.B CLONE_FS
-も暗黙のうちに指定される。
-.\" As at 2.6.16, the following forced implications also apply,
+このフラグは \fBclone\fP(2) \fBCLONE_NEWNS\fP フラグと同じ効果を持つ。 マウン
+ト名前空間を共有せず、呼び出し元プロセスは 他のプロセスとは共有しない固
+有の名前空間のコピーを持つ。 このフラグを指定すると、 \fBCLONE_FS\fP も暗
+黙のうちに指定される。 \fBCLONE_NEWNS\fP を使用するには \fBCAP_SYS_ADMIN\fP
+ケーパビリティが必要である。
+.TP 
+\fBCLONE_NEWPID\fP (Linux 3.8 以降)
+このフラグは \fBclone\fP(2) \fBCLONE_NEWPID\fP フラグと同じ効果を持つ。 PID 名前空間を共有しない。 呼び出し元プロセスは、
+すでに存在するどのプロセスとも共有されない新しい PID 名前空間を、 自身の子プロセス用に持つことになる。
+このプロセスにより作成される最初の子プロセスはプロセス ID 1 を持ち、 この新しい名前空間において \fBinit\fP(1) の役割を持つとみなされる。
+\fBCLONE_NEWPID\fP を指定すると、自動的に \fBCLONE_THREAD\fP も指定されたものとみなされる。 \fBCLONE_NEWPID\fP
+を使用するには \fBCAP_SYS_ADMIN\fP ケーパビリティが必要である。 詳細な情報は \fBpid_namespaces\fP(7) を参照。
+.TP 
+\fBCLONE_NEWUSER\fP (Linux 3.8 以降)
+このフラグは \fBclone\fP(2) \fBCLONE_NEWUSER\fP フラグと同じ効果を持つ。 ユーザー名前空間を共有せず、
+呼び出し元プロセスはすでに存在するどのプロセスとも共有されない新しいユーザー名前空間に移動される。 \fBCLONE_NEWUSER\fP フラグを指定して
+\fBclone\fP(2) で作成された子プロセスと同様に、 呼び出し元は新しい名前空間ですべてのケーパビリティを獲得する。
+.IP
+.\" commit e66eded8309ebf679d3d3c1f5820d1f2ca332c71
+.\" https://lwn.net/Articles/543273/
+\fBCLONE_NEWUSER\fP を使うには、呼び出し元プロセスがスレッド化されていないことが必要である。 \fBCLONE_NEWUSER\fP
+を指定すると、自動的に \fBCLONE_THREAD\fP が指定されたものとみなされる。 Linux 3.9 以降では、 \fBCLONE_NEWUSER\fP
+が指定された場合 \fBCLONE_FS\fP も指定されたとみなされる。 \fBCLONE_NEWUSER\fP を使うには、呼び出し元プロセスのユーザー ID
+とグループ ID が、 呼び出した時点で、 呼び出し元プロセスのユーザー名前空間のユーザー ID とグループ ID にマッピングされている必要がある。
+
+ユーザー名前空間の詳細は \fBuser_namespaces\fP(7) を参照。
+.TP 
+\fBCLONE_NEWUTS\fP (Linux 2.6.19 以降)
+このフラグは \fBclone\fP(2) \fBCLONE_NEWUTS\fP フラグと同じ効果を持つ。 UTS
+IPC 名前空間を共有せず、呼び出し元プロセスは他のプロセスとは共有しない
+固有の UTS IPC 名前空間のコピーを持つ。 このフラグを指定すると、
+\fBCLONE_FS\fP も暗黙のうちに指定される。\fBCLONE_NEWUTS\fP を使用するには
+\fBCAP_SYS_ADMIN\fP ケーパビリティが必要である。
+.TP 
+\fBCLONE_SYSVSEM\fP (Linux 2.6.26 以降)
+.\" commit 9edff4ab1f8d82675277a04e359d0ed8bf14a7b7
+.\" CLONE_NEWNS If CLONE_SIGHAND is set and signals are also being shared
+.\" (i.e., current->signal->count > 1), force CLONE_THREAD.
+このフラグは \fBclone\fP(2) \fBCLONE_SYSVSEM\fP フラグの効果を逆転させる。 System\ V セマフォの調整値
+(\fIsemadj\fP) を共有せず、 呼び出し元プロセスは他のプロセスとは共有されない新しい空の \fIsemadj\fP リストを持つ。
+そのプロセスが、自分の現在の \fIsemadj\fP リストへの参照を持つ最後のプロセスであれば、 このリストの調整値は対応するセマフォに適用される
+(\fBsemop\fP(2) に説明がある通り)。
+.PP
+.\" As at 3.9, the following forced implications also apply,
 .\" although the relevant flags are not yet implemented.
 .\" If CLONE_THREAD is set force CLONE_VM.
 .\" If CLONE_VM is set, force CLONE_SIGHAND.
-.\" If CLONE_SIGHAND is set and signals are also being shared
-.\" (i.e., current->signal->count > 1), force CLONE_THREAD.
 .\"
-.\" FIXME . CLONE_VM is not (yet, as at 2.6.16) implemented.
-.\" .TP
-.\" .B CLONE_VM
-.\" Reverse the effect of the
-.\" .BR clone (2)
-.\" .B CLONE_VM
-.\" flag.
-.\" .RB ( CLONE_VM
-.\" is also implicitly set by
-.\" .BR vfork (2),
-.\" and can be reversed using this
-.\" .BR unshare ()
-.\" flag.)
-.\" Unshare virtual memory, so that the calling process no
-.\" longer shares its virtual address space with any other process.
+.\" See kernel/fork.c::check_unshare_flags()
+上記に加えて、 呼び出し元がシングルスレッドの場合 (すなわち別のプロセスやスレッドとアドレス空間を共有していない場合)、
+\fBCLONE_THREAD\fP, \fBCLONE_SIGHAND\fP, \fBCLONE_VM\fP を指定することができる。 この場合、
+これらのフラグは効果を持たない。 (\fBCLONE_THREAD\fP を指定すると自動的に \fBCLONE_VM\fP が指定されたとみなされ、
+\fBCLONE_VM\fP を指定すると自動的に \fBCLONE_SIGHAND\fP が指定されたとみなされる点に注意してほしい。)
+プロセスがマルチスレッドの場合、 これらのフラグを使用するとエラーとなる。
 .PP
-.I flags
-に 0 が指定された場合、
-.BR unshare ()
-は何も行わないので、
+\fIflags\fP に 0 が指定された場合、 \fBunshare\fP()  は何も行わないので、
 呼び出し元プロセスの実行コンテキストは、何も変更されない。
 .SH 返り値
-成功した場合は 0 が返される。
-失敗した場合は \-1 が返されて、
-.I errno
-にはエラーを示す値が設定される。
+成功した場合は 0 が返される。 失敗した場合は \-1 が返されて、 \fIerrno\fP にはエラーを示す値が設定される。
 .SH エラー
-.TP
-.B EINVAL
-.I flags
-に不正なビットが指定された。
-.TP
-.B ENOMEM
-呼び出し元のコンテキストのうち共有を解除する必要がある部分をコピーするために、
-十分なメモリが確保できなかった。
-.TP
-.B EPERM
-.I flags
-に
-.B CLONE_NEWNS
-が指定されたが、呼び出し元プロセスに特権
-.RB ( CAP_SYS_ADMIN
-ケーパビリティ) がなかった。
+.TP 
+\fBEINVAL\fP
+\fIflags\fP に不正なビットが指定された。
+.TP 
+\fBEINVAL\fP
+\fBCLONE_THREAD\fP, \fBCLONE_SIGHAND\fP, \fBCLONE_VM\fP が \fIflags\fP に指定されたが、
+呼び出したプロセスはマルチスレッドである。
+.TP 
+\fBENOMEM\fP
+呼び出し元のコンテキストのうち共有を解除する必要がある部分をコピーするために、 十分なメモリーが確保できなかった。
+.TP 
+\fBEPERM\fP
+呼び出し元プロセスはこの操作を行うのに必要な特権を持っていなかった。
+.TP 
+\fBEPERM\fP
+\fBCLONE_NEWUSER\fP が \fIflags\fP に指定されたが、 呼び出し元の実効ユーザー ID もしくは実効グループ ID
+が親名前空間にマッピングがない (\fBuser_namespaces\fP(7) 参照)。
+.TP 
+\fBEPERM\fP (Linux 3.9 以降)
+.\" commit 3151527ee007b73a0ebd296010f1c0454a919c7d
+.\" FIXME What is the rationale for this restriction?
+\fBCLONE_NEWUSER\fP が \fIflags\fP に指定され、 呼び出し元が chroot された環境にいる (すなわち、呼び出し元の root
+ディレクトリが呼び出し元が属するマウント名前空間の root ディレクトリに一致しない)。
+.TP 
+\fBEUSERS\fP (Linux 3.11 以降)
+\fBCLONE_NEWUSER\fP が \fIflags\fP に指定されており、 この呼び出しによりネストされたユーザー名前空間数の上限を超えてしまう。
+\fBuser_namespaces\fP(7) を参照。
 .SH バージョン
-.BR unshare ()
-システムコールは Linux カーネル 2.6.16 で追加された。
+\fBunshare\fP()  システムコールは Linux カーネル 2.6.16 で追加された。
 .SH 準拠
-.BR unshare ()
-システムコールは Linux 固有である。
+\fBunshare\fP()  システムコールは Linux 固有である。
 .SH 注意
-.BR clone (2)
-で新しいプロセスを生成したときに共有される全てのプロセス属性を、
-.BR unshare ()
-によって共有の解除ができるわけではない。
-特に、カーネル 2.6.16 においては、
-.BR unshare ()
-に
-.BR CLONE_SIGHAND ,
+.\" FIXME all of the following needs to be reviewed for the current kernel
 .\" However, we can do unshare(CLONE_SIGHAND) if CLONE_SIGHAND
 .\" was not specified when doing clone(); i.e., unsharing
 .\" signal handlers is permitted if we are not actually
 .\" sharing signal handlers.   mtk
-.BR CLONE_SYSVSEM ,
-.BR CLONE_THREAD ,
-.\" FIXME . check future kernel versions (e.g., 2.6.17)
-.\" to see if CLONE_VM gets implemented.
-.B CLONE_VM
-の効果を取り消すためのフラグが実装されていない。
-.\" However, as at 2.6.16, we can do unshare(CLONE_VM) if CLONE_VM
+.\" However, we can do unshare(CLONE_VM) if CLONE_VM
 .\" was not specified when doing clone(); i.e., unsharing
 .\" virtual memory is permitted if we are not actually
 .\" sharing virtual memory.   mtk
-これらの機能は、必要であれば将来追加されるかもしれない。
 .\"
 .\"9) Future Work
 .\"--------------
@@ -181,8 +209,96 @@ unshare \- プロセス実行コンテキストの一部を分離する
 .\"be incrementally added to unshare without affecting legacy
 .\"applications using unshare.
 .\"
+\fBclone\fP(2)  で新しいプロセスを生成したときに共有される全てのプロセス属性を、 \fBunshare\fP()
+によって共有の解除ができるわけではない。 特に、カーネル 3.8 時点では、 \fBunshare\fP()  に \fBCLONE_SIGHAND\fP,
+\fBCLONE_THREAD\fP, \fBCLONE_VM\fP の効果を取り消すためのフラグが実装されていない。
+これらの機能は、必要であれば将来追加されるかもしれない。
+.SH 例
+以下のプログラムは \fBunshare\fP(1) コマンドの簡単な実装である。 このコマンドは、1 つ以上の名前空間の unshare を行ってから、
+コマンドライン引き数で指定されたコマンドを実行する。 以下はこのプログラムの使用例である。 新しいマウント名前空間でシェルを実行し、
+元のシェルと新しいシェルが別のマウント名前空間にいることを確認している。
+.in +4n
+.nf
+
+$ \fBreadlink /proc/$$/ns/mnt\fP
+mnt:[4026531840]
+$ \fBsudo ./unshare \-m /bin/bash\fP
+[sudo] password for cecilia:
+# \fBreadlink /proc/$$/ns/mnt\fP
+mnt:[4026532325]
+.fi
+.in
+
+2 つの \fBreadlink\fP(1) コマンドの出力が違うことから、 2 つのシェルは異なるマウント名前空間にいることが分かる。
+.SS プログラムのソース
+\&
+.nf
+/* unshare.c
+
+   A simple implementation of the unshare(1) command: unshare
+   namespaces and execute a command.
+*/
+#define _GNU_SOURCE
+#include <sched.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+/* A simple error\-handling function: print an error message based
+   on the value in \(aqerrno\(aq and terminate the calling process */
+
+#define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \e
+                        } while (0)
+
+static void
+usage(char *pname)
+{
+    fprintf(stderr, "Usage: %s [options] program [arg...]\en", pname);
+    fprintf(stderr, "Options can be:\en");
+    fprintf(stderr, "    \-i   unshare IPC namespace\en");
+    fprintf(stderr, "    \-m   unshare mount namespace\en");
+    fprintf(stderr, "    \-n   unshare network namespace\en");
+    fprintf(stderr, "    \-p   unshare PID namespace\en");
+    fprintf(stderr, "    \-u   unshare UTS namespace\en");
+    fprintf(stderr, "    \-U   unshare user namespace\en");
+    exit(EXIT_FAILURE);
+}
+
+int
+main(int argc, char *argv[])
+{
+    int flags, opt;
+
+    flags = 0;
+
+    while ((opt = getopt(argc, argv, "imnpuU")) != \-1) {
+        switch (opt) {
+        case \(aqi\(aq: flags |= CLONE_NEWIPC;        break;
+        case \(aqm\(aq: flags |= CLONE_NEWNS;         break;
+        case \(aqn\(aq: flags |= CLONE_NEWNET;        break;
+        case \(aqp\(aq: flags |= CLONE_NEWPID;        break;
+        case \(aqu\(aq: flags |= CLONE_NEWUTS;        break;
+        case \(aqU\(aq: flags |= CLONE_NEWUSER;       break;
+        default:  usage(argv[0]);
+        }
+    }
+
+    if (optind >= argc)
+        usage(argv[0]);
+
+    if (unshare(flags) == \-1)
+        errExit("unshare");
+
+    execvp(argv[optind], &argv[optind]);
+    errExit("execvp");
+}
+.fi
 .SH 関連項目
-.BR clone (2),
-.BR fork (2),
-.BR vfork (2),
-Documentation/unshare.txt
+\fBunshare\fP(1), \fBclone\fP(2), \fBfork\fP(2), \fBkcmp\fP(2), \fBsetns\fP(2),
+\fBvfork\fP(2), \fBnamespaces\fP(7)
+
+Linux カーネルソース内の \fIDocumentation/unshare.txt\fP
+.SH この文書について
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.79 の一部
+である。プロジェクトの説明とバグ報告に関する情報は
+http://www.kernel.org/doc/man\-pages/ に書かれている。