Provided by: manpages-ja_0.5.0.0.20210215+dfsg-1_all
名前
namespaces - Linux 名前空間の概要
説明
名前空間は、 グローバルシステムリソースを抽象化層で覆うことで、 名前空間内のプロセスに対し て、 自分たちが専用の分離されたグローバルリソースを持っているかのように見せる仕組みであ る。 グローバルリソースへの変更は、 名前空間のメンバーである他のプロセスには見えるが、 そ れ以外のプロセスには見えない。 名前空間の一つの利用方法はコンテナーの実装である。 Linux では以下の名前空間が提供される。 名前空間 定数 分離対象 IPC CLONE_NEWIPC System V IPC, POSIX メッセージキュー Network CLONE_NEWNET ネットワークデバイス、スタック、ポートなど Mount CLONE_NEWNS マウントポイント PID CLONE_NEWPID プロセス ID User CLONE_NEWUSER ユーザー ID とグループ ID UTS CLONE_NEWUTS ホスト名と NIS ドメイン名 このページでは、各種の名前空間と関連する /proc ファイルの説明と、名前空間とともに動作する API の概要を紹介する。 名前空間 API 後で説明する種々の /proc ファイル以外に、名前空間 API として以下のシステムコールがある。 clone(2) clone(2) システムコールは新しいプロセスを作成する。 呼び出し時に flags 引き数で以下 のリストにある CLONE_NEW* のフラグを一つ以上指定すると、 各フラグに対応する新しい名 前空間が作成され、 子プロセスはこれらの名前空間のメンバーになる。 (このシステムコー ルは名前空間とは関係のない機能も多数実装している。) setns(2) setns(2) システムコールを使うと、呼び出したプロセスを既存の名前空間に参加させること ができる。 参加する名前空間は、 以下で説明する /proc/[pid]/ns ファイルのいずれか一 つを参照するファイルディスクリプターを使って指定する。 unshare(2) unshare(2) システムコールは、 呼び出したプロセスを新しい名前空間に移動する。 呼び出 し時の flags 引き数に以下のリストにある CLONE_NEW* フラグを一つ以上指定すると、 各 フラグに対応する新しい名前空間が作成され、 呼び出したプロセスがこれらの名前空間のメ ンバーになる。 (このシステムコールは名前空間とは関係のない機能も多数実装している。) clone(2) と unshare(2) を使った新しい名前空間の作成のほとんどの場合で CAP_SYS_ADMIN ケーパ ビリティが必要である。 ユーザー名前空間は例外で、 Linux 3.8 以降ではユーザー名前空間を作成 するのに特権が不要である。 /proc/[pid]/ns/ ディレクトリ 各プロセスには /proc/[pid]/ns/ サブディレクトリがあり、 このサブディレクトリには setns(2) での操作がサポートされている名前空間単位にエントリーが存在する。 $ ls -l /proc/$$/ns total 0 lrwxrwxrwx. 1 mtk mtk 0 Jan 14 01:20 ipc -> ipc:[4026531839] lrwxrwxrwx. 1 mtk mtk 0 Jan 14 01:20 mnt -> mnt:[4026531840] lrwxrwxrwx. 1 mtk mtk 0 Jan 14 01:20 net -> net:[4026531956] lrwxrwxrwx. 1 mtk mtk 0 Jan 14 01:20 pid -> pid:[4026531836] lrwxrwxrwx. 1 mtk mtk 0 Jan 14 01:20 user -> user:[4026531837] lrwxrwxrwx. 1 mtk mtk 0 Jan 14 01:20 uts -> uts:[4026531838] このディレクトリ内のファイルのいずれかをファイルシステムの他のどこかにバインドマウント (mount(2) 参照) することで、 その名前空間のすべてのプロセスが終了した場合でも、 pid で指定 したプロセスの対応する名前空間を保持することができる。 このディレクトリ内のファイルのいずれか (またはこれらのファイルのいずれかにバインドマウント されたファイル) をオープンすると、 pid で指定されたプロセスの対応する名前空間に対するファ イルハンドルが返される。 このファイルディスクリプターがオープンされている限り、 その名前空 間のすべてのプロセスが終了した場合であっても、 その名前空間は存在し続ける。 このファイル ディスクリプターは setns(2) に渡すことができる。 Linux 3.7 以前では、これらのファイルはハードリンクとして見えていた。 Linux 3.8 以降で は、これらはシンボリックリンクとして見える。 2 つのプロセスが同じ名前空間に所属している場 合、 これらのプロセスの /proc/[pid]/ns/xxx シンボリックリンクの inode 番号は同じになる。 アプリケーションは、 stat(2) が返す stat.st_ino フィールドを使ってこれを確認することができ る。 シンボリックリンクの内容は、 以下の例にあるように、名前空間種別と inode 番号を含む文 字列である。 $ readlink /proc/$$/ns/uts uts:[4026531838] このサブディレクトリのファイルは以下のとおりである。 /proc/[pid]/ns/ipc (Linux 3.0 以降) このファイルはそのプロセスの IPC 名前空間の操作用である。 /proc/[pid]/ns/mnt (Linux 3.8 以降) このファイルはそのプロセスのマウント名前空間の操作用である。 /proc/[pid]/ns/net (Linux 3.0 以降) このファイルはそのプロセスのネットワーク名前空間の操作用である。 /proc/[pid]/ns/pid (Linux 3.8 以降) このファイルはそのプロセスの PID 名前空間の操作用である。 /proc/[pid]/ns/user (Linux 3.8 以降) このファイルはそのプロセスのユーザー名前空間の操作用である。 /proc/[pid]/ns/uts (Linux 3.0 以降) このファイルはそのプロセスの UTS 名前空間の操作用である。 IPC 名前空間 (CLONE_NEWIPC) IPC 名前空間は、 特定の IPC リソース、すなわち、System V IPC オブジェクト (svipc(7) 参 照)、(Linux 2.6.30 以降では) POSIX メッセージキュー (mq_overview(7) 参照) を分離する。 こ れらの IPC 機構に共通の特徴は、 IPC オブジェクトがファイルシステムのパス名以外の方法で識別 されるという点である。 各 IPC 名前空間はそれぞれ、 独自の System V IPC 識別子の集合と独自の POSIX メッセージ キューファイルシステムを持つ。 IPC 名前空間に作成されたオブジェクトは、 その名前空間のメン バーの他のすべてのプロセスにも見えるが、 他の IPC 名前空間のプロセスには見えない。 以下の /proc インターフェースは各 IPC 名前空間で別のものとなる。 * /proc/sys/fs/mqueue の POSIX メッセージキューインターフェース。 * /proc/sys/kernel の System V IPC インターフェース。 すなわち、 msgmax, msgmnb, msgmni, sem, shmall, shmmax, shmmni, shm_rmid_forced。 * /proc/sysvipc の System V IPC インターフェース。 IPC 名前空間が破棄されたときに (すなわち、その名前空間のメンバーの最後のプロセスが終了した ときに)、 その名前空間内のすべての IPC オブジェクトが自動的に破棄される。 IPC 名前空間を使用するには、設定 CONFIG_IPC_NS が有効になったカーネルが必要である。 ネットワーク名前空間 (CLONE_NEWNET) ネットワーク名前空間は、 ネットワークに関連するシステムリソースの分離を提供する。 分離され るリソースは、 ネットワークデバイス、 IPv4 と IPv6 のプロトコルスタック、 IP ルーティング テーブル、 ファイアウォール、 /proc/net ディレクトリ、 /sys/class/net ディレクトリ、 (ソ ケットの) ポート番号などである。 物理ネットワークデバイスは 1 つのネットワーク名前空間にの み属すことができる。 仮想ネットワークデバイス ("veth") ペアは、 ネットワーク名前空間間のト ンネルを作成するのに使うことができるパイプ風の抽象概念で、 別の名前空間に属す物理ネット ワークデバイスへのブリッジを作成するのに使用できる。 ネットワーク名前空間が解放されたときに (すなわち、その名前空間の最後のプロセスがしゅうりょ うしたときに)、 その名前空間に属していた物理ネットワークデバイスは初期ネットワーク名前空間 に戻される (プロセスの親プロセスに戻されるわけではない)。 ネットワーク名前空間を使用するには、設定 CONFIG_NET_NS が有効になったカーネルが必要であ る。 マウント名前空間 (CLONE_NEWNS) マウント名前空間はファイルシステムのマウントポイントの集合を分離する。 つまり、別のマウン ト名前空間のプロセスには別のファイルシステム階層が見えるということである。 マウント名前空 間内のマウントの集合は mount(2) と umount(2) で変更される。 /proc/[pid]/mounts ファイル (Linux 2.4.19 以降に存在) は、 そのプロセスのマウント名前空間 で現在マウントされている全ファイルシステムの一覧を表示する。 このファイルのフォーマットは fstab(5) に記載されている。 カーネルバージョン 2.6.15 以降では、このファイルをポーリングす ることができる。 すなわち、このファイルを読み出し用にオープンした後、 このファイルの変化 (ファイルシステムのマウントやアンマウント) が発生すると、 select(2) はファイルディスクリプ ターが読み出し可能になったと印を付け、 poll(2) や epoll_wait(2) はファイルがエラー状態に なったかのように印を付ける。 /proc/[pid]/mountstats ファイル (Linux 2.6.17 以降に存在) は、 そのプロセスのマウントポイ ントに関する情報 (統計情報、設定情報) を公開する。 このファイルはプロセスの所有者だけが読 み出し可能である。 このファイルの各行は以下の形式である。 device /dev/sda7 mounted on /home with fstype ext3 [statistics] ( 1 ) ( 2 ) (3 ) (4) 各行のフィールドは以下のとおりである。 (1) マウントされているデバイス名 (もしくは、対応するデバイスがない場合は "nodevice")。 (2) ファイルシステムツリー内のマウントポイント。 (3) ファイルシステム種別 (4) 統計情報と設定情報。 オプションフィールドである。 現在のところ (Linux 2.6.26 時点)、NFS ファイルシステムだけがこのフィールドで情報を公開している。 PID 名前空間 (CLONE_NEWPID) pid_namespaces(7) 参照。 ユーザー名前空間 (CLONE_NEWUSER) user_namespaces(7) 参照。 UTS 名前空間 (CLONE_NEWUTS) UTS 名前空間は、 ホスト名と NIS ドメイン名の 2 つのシステム識別子を分離する。 これらの識別 子は sethostname(2) と setdomainname(2) を使って設定でき、 uname(2), gethostname(2), getdomainname(2) を使って取得できる。 UTS 名前空間を使用するには、設定 CONFIG_UTS_NS が有効になったカーネルが必要である。
準拠
名前空間は Linux 独自の機能である。
例
user_namespaces(7) 参照。
関連項目
nsenter(1), readlink(1), unshare(1), clone(2), setns(2), unshare(2), proc(5), credentials(7), capabilities(7), pid_namespaces(7), user_namespaces(7), switch_root(8)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクト の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。