名 前
setns − ス レ ッ ド に 名 前 空 間 を 関 連 付 け し な お す
書 式
#define
_GNU_SOURCE /* feature_test_macros(7) 参 照
*/
#include <sched.h>
int setns(int fd, int nstype);
説 明
名 前 空 間 を 参 照 す る フ ァ イ ル デ ィ ス ク リ プ タ ー を 指 定 す る と 、 呼 び 出 し た ス レ ッ ド に そ の 名 前 空 間 を 関 連 付 け し な お す 。
fd 引 き 数 は 、 /proc/[pid]/ns/ デ ィ レ ク ト リ 内 の 名 前 空 間 エ ン ト リ ー の い ず れ か を 参 照 す る フ ァ イ ル デ ィ ス ク リ プ タ ー で あ る 。 /proc/[pid]/ns/ の 詳 細 は namespaces(7) を 参 照 。 nstype 引 き 数 で 指 定 さ れ た 制 限 の 範 囲 内 で 、 呼 び 出 し た ス レ ッ ド に fd に 対 応 す る 名 前 空 間 を 関 連 付 け し な お す 。
nstype 引 き 数 は 、 呼 び 出 し た ス レ ッ ド が ど の タ イ プ の 名 前 空 間 を 関 連 付 け し な お す こ と が で き る か を 指 定 す る 。 こ の 引 き 数 に は 以 下 の い ず れ か の 値 を 指 定 で き る 。
0 ど の タ イ プ の 名 前 空 間 も 関 連 付 け る こ と が で き る 。 |
CLONE_NEWIPC (Linux 3.0 以 降 )
fd は IPC 名 前 空 間 を 参 照 し て い な け れ ば な ら な い 。
CLONE_NEWNET (Linux 3.0 以 降 )
fd は ネ ッ ト ワ ー ク 名 前 空 間 を 参 照 し て い な け れ ば な ら な い 。
CLONE_NEWNS (Linux 3.8 以 降 )
fd は マ ウ ン ト 名 前 空 間 を 参 照 し て い な け れ ば な ら な い 。
CLONE_NEWPID (Linux 3.8 以 降 )
fd は 子 孫 の PID 名 前 空 間 を 参 照 し て い な け れ ば な ら な い 。
CLONE_NEWUSER (Linux 3.8 以 降 )
fd は ユ ー ザ ー 名 前 空 間 を 参 照 し て い な け れ ば な ら な い 。
CLONE_NEWUTS (Linux 3.0 以 降 )
fd は UTS 名 前 空 間 を 参 照 し て い な け れ ば な ら な い 。 呼 び 出 し 側 が fd が ど の タ イ プ の 名 前 空 間 を 参 照 し て い る か を 知 っ て い る (も し く は 気 に す る 必 要 が な い ) 場 合 に は 、 nstype に 0 を 指 定 す れ ば 十 分 で あ る 。 呼 び 出 し 側 が fd が ど の タ イ プ の 名 前 空 間 を 参 照 し て い る か を 知 っ て お ら ず 、 か つ 、 特 定 の タ イ プ の 名 前 空 間 で あ る こ と を 保 証 し た い 場 合 、 nstype に 0 以 外 の 値 を 指 定 す る と よ い 。 (フ ァ イ ル デ ィ ス ク リ プ タ ー が 別 の プ ロ セ ス に よ り オ ー プ ン さ れ 、 例 え ば 、 UNIX ド メ イ ン ソ ケ ッ ト 経 由 で 呼 び 出 し 側 に 渡 さ れ た 場 合 な ど で は 、 呼 び 出 し 側 が fd が ど の タ イ プ の 名 前 空 間 を 参 照 し て い る か を 知 ら な い 可 能 性 が あ る 。 )
CLONE_NEWPID は 他 の nstype 値 の 場 合 と 少 し 違 っ た 動 作 を す る 。 呼 び 出 し 元 ス レ ッ ド を PID 名 前 空 間 に 関 連 付 け し 直 す と 、 呼 び 出 し 元 の 子 プ ロ セ ス が 作 成 さ れ る PID 名 前 空 間 が 変 更 さ れ る だ け で あ る 。 呼 び 出 し 元 自 身 の PID 名 前 空 間 は 変 更 さ れ な い 。 PID 名 前 空 間 を 関 連 付 け し 直 す こ と が で き る の は 、 fd で 指 定 さ れ た PID 名 前 空 間 が 呼 び 出 し 元 の PID 名 前 空 間 の 子 孫 (子 プ ロ セ ス 、 孫 プ ロ セ ス な ど ) の 場 合 だ け で あ る 。 PID 名 前 空 間 の 詳 細 は pid_namespaces(7) を 参 照 。 プ ロ セ ス が 自 分 自 身 を ユ ー ザ ー 名 前 空 間 に 再 関 連 付 け す る に は 、 そ の プ ロ セ ス は 変 更 後 の ユ ー ザ ー 名 前 空 間 に お い て CAP_SYS_ADMIN ケ ー パ ビ リ テ ィ を 持 っ て い な け れ ば な ら な い 。 ユ ー ザ ー 名 前 空 間 へ の 参 加 に 成 功 す る と 、 そ の ユ ー ザ ー ID や グ ル ー プ ID に 関 わ ら ず 、 プ ロ セ ス に は そ の 名 前 空 間 に お け る す べ て の ケ ー パ ビ リ テ ィ が 認 め ら れ る 。 マ ル チ ス レ ッ ド の プ ロ セ ス は setns() で ユ ー ザ ー 名 前 空 間 を 変 更 で き な い 。 setns() を 使 っ て 、 呼 び 出 し 元 が 現 在 の ユ ー ザ ー 名 前 空 間 に 再 度 入 る こ と は 認 め ら れ て い な い 。 こ れ に よ り 、 い く つ か の ケ ー パ ビ リ テ ィ を 外 し た 呼 び 出 し 元 が setns() を 呼 び 出 す こ と で そ れ ら の ケ ー パ ビ リ テ ィ を 再 度 得 る こ と を 防 ぐ こ と が で き る 。 セ キ ュ リ テ ィ 上 の 理 由 か ら 、 フ ァ イ ル シ ス テ ム 関 連 の 属 性 (共 有 が clone(2) CLONE_FS フ ラ グ で 制 御 さ れ る 属 性 ) を 別 の プ ロ セ ス と 共 有 し て い る 場 合 、 プ ロ セ ス は 新 し い ユ ー ザ ー 名 前 空 間 に 参 加 で き な い 。 ユ ー ザ ー 名 前 空 間 の 詳 細 は user_namespaces(7) を 参 照 。 プ ロ セ ス が マ ル チ ス レ ッ ド の 場 合 、 そ の プ ロ セ ス を 新 し い マ ウ ン ト 名 前 空 間 に 関 連 付 け し 直 す こ と は 許 可 さ れ て い な い 。 マ ウ ン ト 名 前 空 間 を 変 更 す る に は 、 呼 び 出 し 元 の プ ロ セ ス が 、 自 分 自 身 の ユ ー ザ ー 名 前 空 間 に お い て CAP_SYS_CHROOT と CAP_SYS_ADMIN の 両 方 の ケ ー パ ビ リ テ ィ を 持 っ て お り 、 変 更 後 の マ ウ ン ト 名 前 空 間 で CAP_SYS_ADMIN ケ ー パ ビ リ テ ィ を 持 っ て い な け れ ば な ら な い 。 ユ ー ザ ー 名 前 空 間 と マ ウ ン ト 名 前 空 間 の 関 係 の 詳 細 は user_namespaces(7) を 参 照 。
返 り 値
成 功 す る と setns() は 0 を 返 す 。 失 敗 す る と 、 −1 が 返 さ れ 、 errno に エ ラ ー を 示 す 値 が 設 定 さ れ る 。
エ ラ ー
EBADF |
fd が 有 効 な フ ァ イ ル デ ィ ス ク リ プ タ ー で は な い 。 | ||
EINVAL |
fd が nstype で 指 定 さ れ た タ イ プ と 一 致 し な い 名 前 空 間 を 参 照 し て い る 。 | ||
EINVAL |
ス レ ッ ド を 指 定 さ れ た 名 前 空 間 に 関 連 付 け し 直 す 際 に 問 題 が 発 生 し た 。
EINVAL 呼 び 出 し 元 が 先 祖 |
(親 や 親 の 親 な ど ) の PID 名 前 空 間 に 参 加 し よ う と |
し た 。
EINVAL 自 分 が す で に メ ン バ ー と な っ て い る ユ ー ザ ー 名 前 空 間 に 参 加 し よ う と し た 。 | |
EINVAL 呼 び 出 し 元 が 他 の プ ロ セ ス と フ ァ イ ル シ ス テ ム 状 態 |
(特 に root デ ィ レ ク ト リ ) を 共 有 し て い て (CLONE_FS)、 新 し い ユ ー ザ ー 名 前 空 間 に 参 加 し よ う と し た 。
EINVAL 呼 び 出 し 元 プ ロ セ ス が マ ル チ ス レ ッ ド で 、 新 し い ユ ー ザ ー 名 前 空 間 に 参 加 し よ う と し た 。 | |
ENOMEM 指 定 さ れ た 名 前 空 間 に 変 更 す る の に 必 要 な メ モ リ ー が 割 り 当 て ら れ な い 。 | |
EPERM 呼 び 出 し 元 ス レ ッ ド は こ の 操 作 を 行 う の に 必 要 な ケ ー パ ビ リ テ ィ を 持 っ て い な か っ た 。 |
バ ー ジ ョ ン
setns() シ ス テ ム コ ー ル は カ ー ネ ル 3.0 で Linux に 初 め て 登 場 し た 。 ラ イ ブ ラ リ に よ る サ ポ ー ト は glibc バ ー ジ ョ ン 2.14 を 追 加 さ れ た 。
準 拠
setns() シ ス テ ム コ ー ル は Linux 固 有 で あ る 。
注 意
新 し い ス レ ッ ド が clone(2) を 使 っ て 作 成 さ れ た 際 に 共 有 で き る 全 て の 属 性 を 、 setns() を 使 っ て 変 更 で き る わ け で は な い 。
例
以 下 の プ ロ グ ラ ム は 2 つ 以 上 の 引 き 数 を 取 る 。 最 初 の 引 き 数 に は 、 既 存 の /proc/[pid]/ns/ デ ィ レ ク ト リ の 名 前 空 間 フ ァ イ ル の パ ス 名 を 指 定 す る 。 残 り の 引 き 数 は 、 コ マ ン ド と そ の 引 き 数 を 指 定 す る 。 こ の プ ロ グ ラ ム は 名 前 空 間 フ ァ イ ル を オ ー プ ン し 、 setns() を 使 っ て 名 前 空 間 に 参 加 し 、 指 定 さ れ た コ マ ン ド を そ の 名 前 空 間 内 で 実 行 す る 。 以 下 の シ ェ ル セ ッ シ ョ ン で は 、 こ の プ ロ グ ラ ム (ns_exec と い う 名 前 の バ イ ナ リ と し て コ ン パ イ ル さ れ て い る )を 、 clone(2) の マ ニ ュ ア ル ペ ー ジ の CLONE_NEWUTS の サ ン プ ル プ ロ グ ラ ム と 組 み 合 わ せ て 使 っ て い る 。 ま ず 、 clone(2) の サ ン プ ル プ ロ グ ラ ム を バ ッ ク グ ラ ウ ン ド で 実 行 す る 。 こ の プ ロ グ ラ ム は 、 別 の UTS 名 前 空 間 で 子 プ ロ セ ス を 作 成 す る 。 子 プ ロ セ ス は 自 分 の 名 前 空 間 内 で ホ ス ト 名 を 変 更 す る 。 そ れ か ら 、 親 プ ロ セ ス と 子 プ ロ セ ス の 両 方 で そ れ ぞ れ の UTS 名 前 空 間 の ホ ス ト 名 を 表 示 し 、 2 つ の ホ ス ト 名 が 違 う こ と が 確 認 で き る 。
$ su #
名 前 空 間 の 操
作 に は 特 権 が
必 要
Password:
# ./newuts bizarro &
[1] 3549
clone() returned 3550
uts.nodename in child: bizarro
uts.nodename in parent: antero
# uname −n # シ ェ ル
で ホ ス ト 名 を
確 認
antero 次 に 、 以 下 の
プ ロ グ ラ ム を
使 っ て シ ェ ル
を 実 行 す る 。
こ の シ ェ ル の
中 で は 、 ホ ス
ト 名 が 最 初 の
プ ロ グ ラ ム で
作 成 さ れ た 子
プ ロ セ ス が 設
定 し た ホ ス ト
名 に な っ て い
る こ と を 確 認
で き る 。
# ./ns_exec
/proc/3550/ns/uts /bin/bash
# uname −n # ns_exec で 起 動
さ れ た シ ェ ル
内 で 実 行
bizarro プ ロ グ ラ ム
の ソ ー ス
#define _GNU_SOURCE
#include <fcntl.h>
#include <sched.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#define
errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \ }
while (0)
int
main(int argc, char *argv[])
{
int fd;
if (argc <
3) {
fprintf(stderr, "%s /proc/PID/ns/FILE cmd
args...\n", argv[0]);
exit(EXIT_FAILURE); }
fd =
open(argv[1], O_RDONLY); /* 名 前 空
間 の デ ィ ス ク
リ プ タ ー を 取
得 */
if (fd == −1)
errExit("open");
if (setns(fd,
0) == −1) /* 名 前 空 間
に 参 加 */
errExit("setns");
execvp(argv[2],
&argv[2]); /* 名 前 空 間
内 で コ マ ン ド
を 実 行 */
errExit("execvp"); }
関 連 項 目
clone(2), fork(2), unshare(2), vfork(2), namespaces(7), unix(7)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。