Manpages

名 前

unshare − プ ロ セ ス 実 行 コ ン テ キ ス ト の 一 部 を 分 離 す る

書 式

#include <sched.h>

int unshare(int flags);

glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):

unshare():

glibc 2.14 以 降 :

_GNU_SOURCE

glibc 2.14 よ り 前 :

_BSD_SOURCE || _SVID_SOURCE
/* _GNU_SOURCE も 定 義 さ れ る */

説 明

unshare() を 使 う と 、 プ ロ セ ス は 他 の プ ロ セ ス と 現 在 共 有 し て い る 実 行 コ ン テ キ ス ト の 一 部 を 分 離 す る こ と が で き る 。 実 行 コ ン テ キ ス ト の 一 部 、 た と え ば マ ウ ン ト 名 前 空 間 (mount namespace) な ど は 、 新 し い プ ロ セ ス を fork(2) ま た は vfork(2) を 使 っ て 生 成 し た と き に 、 暗 黙 の う ち に 共 有 さ れ る 。 一 方 、 仮 想 メ モ リ ー な ど は 、 clone(2) を 使 っ て プ ロ セ ス を 生 成 す る と き に 、 明 示 的 に 共 有 す る こ と を 要 求 で き る 。

unshare() の 主 な 利 用 法 は 、 プ ロ セ ス が 新 し い プ ロ セ ス を 生 成 す る こ と な く 、 共 有 実 行 コ ン テ キ ス ト を 制 御 す る こ と で あ る 。

flags 引 き 数 は ビ ッ ト マ ス ク で あ り 、 実 行 コ ン テ キ ス ト の ど の 部 分 の 共 有 を 解 除 す る か を 表 す 。 こ の 引 き 数 は 、 以 下 の 定 数 の 0 個 以 上 の OR で 指 定 す る :
CLONE_FILES

clone(2) CLONE_FILES フ ラ グ の 効 果 を 取 り 消 す 。 フ ァ イ ル デ ィ ス ク リ プ タ ー テ ー ブ ル を 共 有 さ せ ず 、 呼 び 出 し 元 プ ロ セ ス は 他 の プ ロ セ ス と フ ァ イ ル デ ィ ス ク リ プ タ ー を 共 有 し な く な る 。

CLONE_FS

clone(2) CLONE_FS フ ラ グ の 効 果 を 取 り 消 す 。 フ ァ イ ル シ ス テ ム 属 性 を 共 有 さ せ ず 、 呼 び 出 し 元 プ ロ セ ス は 、 ル ー ト デ ィ レ ク ト リ (chroot(2))、 カ レ ン ト デ ィ レ ク ト リ (chdir(2))、 umask (umask(2)) を 他 の プ ロ セ ス と 共 有 し な く な る 。

CLONE_NEWIPC (Linux 2.6.19 以 降 ) こ の フ ラ グ は clone(2) CLONE_NEWIPC フ ラ グ と 同 じ 効 果 を 持 つ 。 System V IPC 名 前 空 間 を 共 有 せ ず 、 呼 び 出 し 元 プ ロ セ ス は 他 の プ ロ セ ス と は 共 有 し な い 固 有 の System V IPC 名 前 空 間 の コ ピ ー を 持 つ 。 こ の フ ラ グ を 指 定 す る と 、 CLONE_SYSVSEM も 暗 黙 の う ち に 指 定 さ れ る 。 CLONE_NEWIPC を 使 用 す る に は CAP_SYS_ADMIN ケ ー パ ビ リ テ ィ が 必 要 で あ る 。
CLONE_NEWNET
(Linux 2.6.24 以 降 ) こ の フ ラ グ は clone(2) CLONE_NEWNET フ ラ グ と 同 じ 効 果 を 持 つ 。 ネ ッ ト ワ ー ク 名 前 空 間 を 共 有 せ ず 、 呼 び 出 し 元 プ ロ セ ス は 他 の プ ロ セ ス と は 共 有 し な い 固 有 の ネ ッ ト ワ ー ク 名 前 空 間 の コ ピ ー を 持 つ 。 CLONE_NEWNET を 使 用 す る に は CAP_SYS_ADMIN ケ ー パ ビ リ テ ィ が 必 要 で あ る 。
CLONE_NEWNS
こ の フ ラ グ は clone(2) CLONE_NEWNS フ ラ グ と 同 じ 効 果 を 持 つ 。 マ ウ ン ト 名 前 空 間 を 共 有 せ ず 、 呼 び 出 し 元 プ ロ セ ス は 他 の プ ロ セ ス と は 共 有 し な い 固 有 の 名 前 空 間 の コ ピ ー を 持 つ 。 こ の フ ラ グ を 指 定 す る と 、 CLONE_FS も 暗 黙 の う ち に 指 定 さ れ る 。 CLONE_NEWNS を 使 用 す る に は CAP_SYS_ADMIN ケ ー パ ビ リ テ ィ が 必 要 で あ る 。
CLONE_NEWPID
(Linux 3.8 以 降 ) こ の フ ラ グ は clone(2) CLONE_NEWPID フ ラ グ と 同 じ 効 果 を 持 つ 。 PID 名 前 空 間 を 共 有 し な い 。 呼 び 出 し 元 プ ロ セ ス は 、 す で に 存 在 す る ど の プ ロ セ ス と も 共 有 さ れ な い 新 し い PID 名 前 空 間 を 、 自 身 の 子 プ ロ セ ス 用 に 持 つ こ と に な る 。 こ の プ ロ セ ス に よ り 作 成 さ れ る 最 初 の 子 プ ロ セ ス は プ ロ セ ス ID 1 を 持 ち 、 こ の 新 し い 名 前 空 間 に お い て init(1) の 役 割 を 持 つ と み な さ れ る 。 CLONE_NEWPID を 指 定 す る と 、 自 動 的 に CLONE_THREAD も 指 定 さ れ た も の と み な さ れ る 。 CLONE_NEWPID を 使 用 す る に は CAP_SYS_ADMIN ケ ー パ ビ リ テ ィ が 必 要 で あ る 。 詳 細 な 情 報 は pid_namespaces(7) を 参 照 。
CLONE_NEWUSER
(Linux 3.8 以 降 ) こ の フ ラ グ は clone(2) CLONE_NEWUSER フ ラ グ と 同 じ 効 果 を 持 つ 。 ユ ー ザ ー 名 前 空 間 を 共 有 せ ず 、 呼 び 出 し 元 プ ロ セ ス は す で に 存 在 す る ど の プ ロ セ ス と も 共 有 さ れ な い 新 し い ユ ー ザ ー 名 前 空 間 に 移 動 さ れ る 。 CLONE_NEWUSER フ ラ グ を 指 定 し て clone(2) で 作 成 さ れ た 子 プ ロ セ ス と 同 様 に 、 呼 び 出 し 元 は 新 し い 名 前 空 間 で す べ て の ケ ー パ ビ リ テ ィ を 獲 得 す る 。

CLONE_NEWUSER を 使 う に は 、 呼 び 出 し 元 プ ロ セ ス が ス レ ッ ド 化 さ れ て い な い こ と が 必 要 で あ る 。 CLONE_NEWUSER を 指 定 す る と 、 自 動 的 に CLONE_THREAD が 指 定 さ れ た も の と み な さ れ る 。 Linux 3.9 以 降 で は 、 CLONE_NEWUSER が 指 定 さ れ た 場 合 CLONE_FS も 指 定 さ れ た と み な さ れ る 。 CLONE_NEWUSER を 使 う に は 、 呼 び 出 し 元 プ ロ セ ス の ユ ー ザ ー ID と グ ル ー プ ID が 、 呼 び 出 し た 時 点 で 、 呼 び 出 し 元 プ ロ セ ス の ユ ー ザ ー 名 前 空 間 の ユ ー ザ ー ID と グ ル ー プ ID に マ ッ ピ ン グ さ れ て い る 必 要 が あ る 。 ユ ー ザ ー 名 前 空 間 の 詳 細 は user_namespaces(7) を 参 照 。

CLONE_NEWUTS (Linux 2.6.19 以 降 ) こ の フ ラ グ は clone(2) CLONE_NEWUTS フ ラ グ と 同 じ 効 果 を 持 つ 。 UTS IPC 名 前 空 間 を 共 有 せ ず 、 呼 び 出 し 元 プ ロ セ ス は 他 の プ ロ セ ス と は 共 有 し な い 固 有 の UTS IPC 名 前 空 間 の コ ピ ー を 持 つ 。 こ の フ ラ グ を 指 定 す る と 、 CLONE_FS も 暗 黙 の う ち に 指 定 さ れ る 。 CLONE_NEWUTS を 使 用 す る に は CAP_SYS_ADMIN ケ ー パ ビ リ テ ィ が 必 要 で あ る 。
CLONE_SYSVSEM
(Linux 2.6.26 以 降 ) こ の フ ラ グ は clone(2) CLONE_SYSVSEM フ ラ グ の 効 果 を 逆 転 さ せ る 。 System V セ マ フ ォ の 調 整 値 (semadj) を 共 有 せ ず 、 呼 び 出 し 元 プ ロ セ ス は 他 の プ ロ セ ス と は 共 有 さ れ な い 新 し い 空 の semadj リ ス ト を 持 つ 。 そ の プ ロ セ ス が 、 自 分 の 現 在 の semadj リ ス ト へ の 参 照 を 持 つ 最 後 の プ ロ セ ス で あ れ ば 、 こ の リ ス ト の 調 整 値 は 対 応 す る セ マ フ ォ に 適 用 さ れ る (semop(2) に 説 明 が あ る 通 り )。 上 記 に 加 え て 、 呼 び 出 し 元 が シ ン グ ル ス レ ッ ド の 場 合 (す な わ ち 別 の プ ロ セ ス や ス レ ッ ド と ア ド レ ス 空 間 を 共 有 し て い な い 場 合 )、 CLONE_THREAD, CLONE_SIGHAND, CLONE_VM を 指 定 す る こ と が で き る 。 こ の 場 合 、 こ れ ら の フ ラ グ は 効 果 を 持 た な い 。 (CLONE_THREAD を 指 定 す る と 自 動 的 に CLONE_VM が 指 定 さ れ た と み な さ れ 、 CLONE_VM を 指 定 す る と 自 動 的 に CLONE_SIGHAND が 指 定 さ れ た と み な さ れ る 点 に 注 意 し て ほ し い 。 ) プ ロ セ ス が マ ル チ ス レ ッ ド の 場 合 、 こ れ ら の フ ラ グ を 使 用 す る と エ ラ ー と な る 。

flags に 0 が 指 定 さ れ た 場 合 、 unshare() は 何 も 行 わ な い の で 、 呼 び 出 し 元 プ ロ セ ス の 実 行 コ ン テ キ ス ト は 、 何 も 変 更 さ れ な い 。

返 り 値

成 功 し た 場 合 は 0 が 返 さ れ る 。 失 敗 し た 場 合 は −1 が 返 さ れ て 、 errno に は エ ラ ー を 示 す 値 が 設 定 さ れ る 。

エ ラ ー

EINVAL

flags に 不 正 な ビ ッ ト が 指 定 さ れ た 。

EINVAL

CLONE_THREAD, CLONE_SIGHAND, CLONE_VMflags に 指 定 さ れ た が 、 呼 び 出 し た プ ロ セ ス は マ ル チ ス レ ッ ド で あ る 。

ENOMEM

呼 び 出 し 元 の コ ン テ キ ス ト の う ち 共 有 を 解 除 す る 必 要 が あ る 部 分 を コ ピ ー す る た め に 、 十 分 な メ モ リ ー が 確 保 で き な か っ た 。

EPERM 呼 び 出 し 元 プ ロ セ ス は こ の 操 作 を 行 う の に 必 要 な 特 権 を 持 っ て い な か っ た 。

EPERM

CLONE_NEWUSERflags に 指 定 さ れ た が 、 呼 び 出 し 元 の 実 効 ユ ー ザ ー ID も し く は 実 効 グ ル ー プ ID が 親 名 前 空 間 に マ ッ ピ ン グ が な い (user_namespaces(7) 参 照 )。

EPERM (Linux 3.9 以 降 )

CLONE_NEWUSERflags に 指 定 さ れ 、 呼 び 出 し 元 が chroot さ れ た 環 境 に い る (す な わ ち 、 呼 び 出 し 元 の root デ ィ レ ク ト リ が 呼 び 出 し 元 が 属 す る マ ウ ン ト 名 前 空 間 の root デ ィ レ ク ト リ に 一 致 し な い )。

EUSERS (Linux 3.11 以 降 )

CLONE_NEWUSERflags に 指 定 さ れ て お り 、 こ の 呼 び 出 し に よ り ネ ス ト さ れ た ユ ー ザ ー 名 前 空 間 数 の 上 限 を 超 え て し ま う 。 user_namespaces(7) を 参 照 。

バ ー ジ ョ ン

unshare() シ ス テ ム コ ー ル は Linux カ ー ネ ル 2.6.16 で 追 加 さ れ た 。

準 拠

unshare() シ ス テ ム コ ー ル は Linux 固 有 で あ る 。

注 意

clone(2) で 新 し い プ ロ セ ス を 生 成 し た と き に 共 有 さ れ る 全 て の プ ロ セ ス 属 性 を 、 unshare() に よ っ て 共 有 の 解 除 が で き る わ け で は な い 。 特 に 、 カ ー ネ ル 3.8 時 点 で は 、 unshare() に CLONE_SIGHAND, CLONE_THREAD, CLONE_VM の 効 果 を 取 り 消 す た め の フ ラ グ が 実 装 さ れ て い な い 。 こ れ ら の 機 能 は 、 必 要 で あ れ ば 将 来 追 加 さ れ る か も し れ な い 。

以 下 の プ ロ グ ラ ム は unshare(1) コ マ ン ド の 簡 単 な 実 装 で あ る 。 こ の コ マ ン ド は 、 1 つ 以 上 の 名 前 空 間 の unshare を 行 っ て か ら 、 コ マ ン ド ラ イ ン 引 き 数 で 指 定 さ れ た コ マ ン ド を 実 行 す る 。 以 下 は こ の プ ロ グ ラ ム の 使 用 例 で あ る 。 新 し い マ ウ ン ト 名 前 空 間 で シ ェ ル を 実 行 し 、 元 の シ ェ ル と 新 し い シ ェ ル が 別 の マ ウ ン ト 名 前 空 間 に い る こ と を 確 認 し て い る 。

$ readlink /proc/$$/ns/mnt
mnt:[4026531840]
$ sudo ./unshare −m /bin/bash
[sudo] password for cecilia:
# readlink /proc/$$/ns/mnt
mnt:[4026532325]

2 つ の readlink(1) コ マ ン ド の 出 力 が 違 う こ と か ら 、 2 つ の シ ェ ル は 異 な る マ ウ ン ト 名 前 空 間 に い る こ と が 分 か る 。 プ ロ グ ラ ム の ソ ー ス
/* 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 'errno' and terminate the calling process */

#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \ }
while (0)

static void
usage(char *pname)
{
fprintf(stderr, "Usage: %s [options] program [arg...]\n", pname);
fprintf(stderr, "Options can be:\n");
fprintf(stderr, " −i unshare IPC namespace\n");
fprintf(stderr, " −m unshare mount namespace\n");
fprintf(stderr, " −n unshare network namespace\n");
fprintf(stderr, " −p unshare PID namespace\n");
fprintf(stderr, " −u unshare UTS namespace\n");
fprintf(stderr, " −U unshare user namespace\n");
exit(EXIT_FAILURE); }

int
main(int argc, char *argv[])
{
int flags, opt;

flags = 0;

while ((opt = getopt(argc, argv, "imnpuU")) != −1) {
switch (opt) {
case 'i': flags |= CLONE_NEWIPC; break;
case 'm': flags |= CLONE_NEWNS; break;
case 'n': flags |= CLONE_NEWNET; break;
case 'p': flags |= CLONE_NEWPID; break;
case 'u': flags |= CLONE_NEWUTS; break;
case 'U': 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"); }

関 連 項 目

unshare(1), clone(2), fork(2), kcmp(2), setns(2), vfork(2), namespaces(7)

Linux カ ー ネ ル ソ ー ス 内 の Documentation/unshare.txt

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。