OSDN Git Service

Update README
[linuxjm/LDP_man-pages.git] / release / man2 / unshare.2
index 757129d..97c39eb 100644 (file)
@@ -1,5 +1,5 @@
 .\" 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
 .\" This file was generated with po4a. Translate the source file.
 .\"
 .\"*******************************************************************
-.TH UNSHARE 2 2013\-04\-17 Linux "Linux Programmer's Manual"
+.\"
+.\" 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 2014\-09\-21 Linux "Linux Programmer's Manual"
 .SH 名前
 unshare \- プロセス実行コンテキストの一部を分離する
 .SH 書式
@@ -44,7 +52,7 @@ glibc 向けの機能検査マクロの要件 (\fBfeature_test_macros\fP(7)  参
 glibc 2.14 以降:
 _GNU_SOURCE
 .TP  4
-.\" FIXME See http://sources.redhat.com/bugzilla/show_bug.cgi?id=4749
+.\" See http://sources.redhat.com/bugzilla/show_bug.cgi?id=4749
 glibc 2.14 より前:
 _BSD_SOURCE || _SVID_SOURCE
     /* _GNU_SOURCE も定義される */
@@ -54,7 +62,7 @@ _BSD_SOURCE || _SVID_SOURCE
 .SH 説明
 \fBunshare\fP()  を使うと、プロセスは他のプロセスと現在共有している 実行コンテキストの一部を分離することができる。
 実行コンテキストの一部、たとえばマウント名前空間 (mount namespace)  などは、新しいプロセスを \fBfork\fP(2)  または
-\fBvfork\fP(2)  を使って生成したときに、暗黙のうちに共有される。 一方、仮想メモリなどは、 \fBclone\fP(2)
+\fBvfork\fP(2)  ã\82\92使ã\81£ã\81¦ç\94\9fæ\88\90ã\81\97ã\81\9fã\81¨ã\81\8dã\81«ã\80\81æ\9a\97é»\99ã\81®ã\81\86ã\81¡ã\81«å\85±æ\9c\89ã\81\95ã\82\8cã\82\8bã\80\82 ä¸\80æ\96¹ã\80\81ä»®æ\83³ã\83¡ã\83¢ã\83ªã\83¼ã\81ªã\81©ã\81¯ã\80\81 \fBclone\fP(2)
 を使ってプロセスを生成するときに、明示的に共有することを要求できる。
 
 \fBunshare\fP()  の主な利用法は、プロセスが新しいプロセスを生成することなく、 共有実行コンテキストを制御することである。
@@ -63,8 +71,8 @@ _BSD_SOURCE || _SVID_SOURCE
 で指定する:
 .TP 
 \fBCLONE_FILES\fP
-\fBclone\fP(2)  \fBCLONE_FILES\fP フラグの効果を取り消す。 ファイルディスクリプタテーブルを共有させず、
-呼び出し元プロセスは他のプロセスとファイルディスクリプタを共有しなくなる。
+\fBclone\fP(2)  \fBCLONE_FILES\fP ã\83\95ã\83©ã\82°ã\81®å\8a¹æ\9e\9cã\82\92å\8f\96ã\82\8aæ¶\88ã\81\99ã\80\82 ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\83\86ã\83¼ã\83\96ã\83«ã\82\92å\85±æ\9c\89ã\81\95ã\81\9bã\81\9aã\80\81
\91¼ã\81³å\87ºã\81\97å\85\83ã\83\97ã\83­ã\82»ã\82¹ã\81¯ä»\96ã\81®ã\83\97ã\83­ã\82»ã\82¹ã\81¨ã\83\95ã\82¡ã\82¤ã\83«ã\83\87ã\82£ã\82¹ã\82¯ã\83ªã\83\97ã\82¿ã\83¼ã\82\92å\85±æ\9c\89ã\81\97ã\81ªã\81\8fã\81ªã\82\8bã\80\82
 .TP 
 \fBCLONE_FS\fP
 \fBclone\fP(2)  \fBCLONE_FS\fP フラグの効果を取り消す。ファイルシステム属性を共有させず、呼び出し元プロセスは、ルートディレクトリ
@@ -73,8 +81,8 @@ _BSD_SOURCE || _SVID_SOURCE
 .TP 
 \fBCLONE_NEWIPC\fP (Linux 2.6.19 以降)
 このフラグは \fBclone\fP(2) \fBCLONE_NEWIPC\fP フラグと同じ効果を持つ。
-System V IPC 名前空間を共有せず、呼び出し元プロセスは 他のプロセスとは
-共有しない固有の System V IPC 名前空間のコピーを持つ。 このフラグを指定
+System\ V IPC 名前空間を共有せず、呼び出し元プロセスは 他のプロセスとは
+共有しない固有の System\ V IPC 名前空間のコピーを持つ。 このフラグを指定
 すると、 \fBCLONE_SYSVSEM\fP も暗黙のうちに指定される。 \fBCLONE_NEWIPC\fP を
 使用するには \fBCAP_SYS_ADMIN\fP ケーパビリティが必要である。
 .TP 
@@ -95,6 +103,27 @@ System V IPC 名前空間を共有せず、呼び出し元プロセスは 他の
 黙のうちに指定される。 \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 名前空間を共有せず、呼び出し元プロセスは他のプロセスとは共有しない
@@ -104,32 +133,24 @@ IPC 名前空間を共有せず、呼び出し元プロセスは他のプロセ
 .TP 
 \fBCLONE_SYSVSEM\fP (Linux 2.6.26 以降)
 .\" commit 9edff4ab1f8d82675277a04e359d0ed8bf14a7b7
-.\" As at 2.6.16, the following forced implications also apply,
+.\" 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.
-.\" CLONE_NEWNSIf 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.
-このフラグは \fBclone\fP(2) \fBCLONE_SYSVSEM\fP フラグの効果を逆転させる。
-System V セマフォのアンドゥ値を共有せず、呼び出し元プロセスは 他のプロ
-セスとは共有しない固有のコピーを持つ。\fBCLONE_SYSVSEM\fP を使用するには
-\fBCAP_SYS_ADMIN\fP ケーパビリティが必要である。
+.\" 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
 \fIflags\fP に 0 が指定された場合、 \fBunshare\fP()  は何も行わないので、
 呼び出し元プロセスの実行コンテキストは、何も変更されない。
@@ -140,11 +161,29 @@ System V セマフォのアンドゥ値を共有せず、呼び出し元プロ
 \fBEINVAL\fP
 \fIflags\fP に不正なビットが指定された。
 .TP 
+\fBEINVAL\fP
+\fBCLONE_THREAD\fP, \fBCLONE_SIGHAND\fP, \fBCLONE_VM\fP が \fIflags\fP に指定されたが、
+呼び出したプロセスはマルチスレッドである。
+.TP 
 \fBENOMEM\fP
-呼び出し元のコンテキストのうち共有を解除する必要がある部分をコピーするために、 十分なメモリが確保できなかった。
\91¼ã\81³å\87ºã\81\97å\85\83ã\81®ã\82³ã\83³ã\83\86ã\82­ã\82¹ã\83\88ã\81®ã\81\86ã\81¡å\85±æ\9c\89ã\82\92解é\99¤ã\81\99ã\82\8bå¿\85è¦\81ã\81\8cã\81\82ã\82\8bé\83¨å\88\86ã\82\92ã\82³ã\83\94ã\83¼ã\81\99ã\82\8bã\81\9fã\82\81ã\81«ã\80\81 å\8d\81å\88\86ã\81ªã\83¡ã\83¢ã\83ªã\83¼ã\81\8c確ä¿\9dã\81§ã\81\8dã\81ªã\81\8bã\81£ã\81\9fã\80\82
 .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 バージョン
 \fBunshare\fP()  システムコールは Linux カーネル 2.6.16 で追加された。
 .SH 準拠
@@ -174,11 +213,92 @@ System V セマフォのアンドゥ値を共有せず、呼び出し元プロ
 によって共有の解除ができるわけではない。 特に、カーネル 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 関連項目
-\fBclone\fP(2), \fBfork\fP(2), \fBkcmp\fP(2), \fBsetns\fP(2), \fBvfork\fP(2)
+\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.52 の一部
+この man ページは Linux \fIman\-pages\fP プロジェクトのリリース 3.79 の一部
 である。プロジェクトの説明とバグ報告に関する情報は
 http://www.kernel.org/doc/man\-pages/ に書かれている。