名 前
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_VM が flags に 指 定 さ れ た が 、 呼 び 出 し た プ ロ セ ス は マ ル チ ス レ ッ ド で あ る 。 | ||
ENOMEM |
呼 び 出 し 元 の コ ン テ キ ス ト の う ち 共 有 を 解 除 す る 必 要 が あ る 部 分 を コ ピ ー す る た め に 、 十 分 な メ モ リ ー が 確 保 で き な か っ た 。
EPERM 呼 び 出 し 元 プ ロ セ ス は こ の 操 作 を 行 う の に 必 要 な 特 権 を 持 っ て い な か っ た 。 | |
EPERM |
CLONE_NEWUSER が flags に 指 定 さ れ た が 、 呼 び 出 し 元 の 実 効 ユ ー ザ ー ID も し く は 実 効 グ ル ー プ ID が 親 名 前 空 間 に マ ッ ピ ン グ が な い (user_namespaces(7) 参 照 )。
EPERM (Linux 3.9 以 降 )
CLONE_NEWUSER が flags に 指 定 さ れ 、 呼 び 出 し 元 が chroot さ れ た 環 境 に い る (す な わ ち 、 呼 び 出 し 元 の root デ ィ レ ク ト リ が 呼 び 出 し 元 が 属 す る マ ウ ン ト 名 前 空 間 の root デ ィ レ ク ト リ に 一 致 し な い )。
EUSERS (Linux 3.11 以 降 )
CLONE_NEWUSER が flags に 指 定 さ れ て お り 、 こ の 呼 び 出 し に よ り ネ ス ト さ れ た ユ ー ザ ー 名 前 空 間 数 の 上 限 を 超 え て し ま う 。 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/ に 書 か れ て い る 。