Manpages

名 前

pid_namespaces − Linux PID 名 前 空 間 の 概 要

説 明

名 前 空 間 の 概 要 に つ い て は namespaces(7) を 参 照 。

PID 名 前 空 間 は プ ロ セ ス ID 番 号 空 間 を 分 離 す る 。 こ れ は 、 異 な る PID 名 前 空 間 の プ ロ セ ス は 同 じ PID を 持 つ こ と が で き る こ と を 意 味 す る 。 PID 名 前 空 間 を 使 う こ と で 、 コ ン テ ナ ー 内 の プ ロ セ ス 群 を 中 断 、 再 開 し た り 、 コ ン テ ナ ー 内 の プ ロ セ ス の PID を 保 持 し た ま ま コ ン テ ナ ー を 新 し い ホ ス ト に 移 行 し た り す る と い っ た 機 能 を コ ン テ ナ ー が 提 供 す る こ と が 可 能 に な る 。 新 し い PID 名 前 空 間 の PID は 、 独 立 し た シ ス テ ム で あ る か の よ う に 、 1 か ら 始 ま る 。 fork(2), vfork(2), clone(2) を 呼 び 出 す と 、 そ の 名 前 空 間 内 で 一 意 な PID で プ ロ セ ス が 生 成 さ れ る 。

PID 名 前 空 間 を 使 用 す る に は 、 設 定 CONFIG_PID_NS が 有 効 に な っ た カ ー ネ ル が 必 要 で あ る 。 名 前 空 間 の init プ ロ セ ス 新 し い 名 前 空 間 で 作 成 さ れ る 最 初 の プ ロ セ ス (す な わ ち 、 CLONE_NEWPID フ ラ グ で clone(2) を 使 っ て 作 成 さ れ た プ ロ セ ス や 、 CLONE_NEWPID フ ラ グ で unshare(2) を 呼 び 出 し た 後 の プ ロ セ ス に よ っ て 作 成 さ れ た 最 初 の プ ロ セ ス ) は PID 1 を 持 ち 、 そ の プ ロ セ ス は そ の 名 前 空 間 の "init" プ ロ セ ス と な る (init(1) 参 照 )。 名 前 空 間 内 で み な し ご に な っ た (親 プ ロ セ ス が い な く な っ た ) 子 プ ロ セ ス は 、 init(1) で は な く こ の プ ロ セ ス が 親 プ ロ セ ス に な る (た だ し 、 同 じ PID 名 前 空 間 内 の そ の 子 プ ロ セ ス の 先 祖 が 、 prctl(2)PR_SET_CHILD_SUBREAPER コ マ ン ド を 使 っ て 、 自 分 自 身 を み な し ご と な っ た 子 孫 の プ ロ セ ス の 引 き 取 り 手 に な っ て い る 場 合 は こ の 限 り で は な く )。

PID 名 前 空 間 の "init" プ ロ セ ス が 終 了 す る と 、 カ ー ネ ル は そ の 名 前 空 間 の 全 プ ロ セ ス を SIGKILL シ グ ナ ル で 終 了 す る 。 こ の 動 作 は 、 PID 名 前 空 間 の 正 し い 操 作 の た め に は "init" プ ロ セ ス は 不 可 欠 で あ る と い う 事 実 を 反 映 し た も の で あ る 。 こ の 場 合 、 そ の PID 名 前 空 間 へ の そ れ 以 降 の fork(2) は エ ラ ー ENOMEM で 失 敗 す る 。 "init" プ ロ セ ス が 終 了 し て い る PID 名 前 空 間 に 新 し い プ ロ セ ス を 作 成 す る こ と は で き な い 。 こ の よ う な 状 況 は 、 例 え ば 、 名 前 空 間 に い た プ ロ セ ス に 対 応 す る /proc/[pid]/ns/pid フ ァ イ ル に 対 し て オ ー プ ン し た フ ァ イ ル デ ィ ス ク リ プ タ ー を 使 っ て 、 "init" プ ロ セ ス が 終 了 し た 後 に そ の 名 前 空 間 に setns(2) を 行 っ た 場 合 に 起 こ り 得 る 。 unshare(2) を 呼 び 出 し た 後 に も 、 こ の 状 況 は 起 こ り 得 る 。 そ れ 以 降 に fork(2) で 作 成 さ れ た 最 初 の 子 プ ロ セ ス が 終 了 す る と 、 そ れ 以 降 の fork(2) の 呼 び 出 し は NOMEM で 失 敗 す る 。

PID 名 前 空 間 の 他 の メ ン バ ー は 、 "init" プ ロ セ ス が シ グ ナ ル ハ ン ド ラ ー を 設 定 し た シ グ ナ ル だ け を 、 "init" プ ロ セ ス に 送 信 す る こ と が で き る 。 こ の 制 限 は 特 権 プ ロ セ ス に 対 し て も 適 用 さ れ る 。 こ の 制 限 に よ り 、 PID 名 前 空 間 の 他 の メ ン バ ー が う っ か り "init" プ ロ セ ス を 殺 し て し ま う の を 防 ぐ こ と が で き る 。 同 様 に 、 先 祖 の 名 前 空 間 の プ ロ セ ス は 、 "init" プ ロ セ ス が そ の シ グ ナ ル に 対 す る ハ ン ド ラ ー を 設 定 し て い る 場 合 に の み 、 kill(2) で 説 明 さ れ て い る 通 常 の ア ク セ ス 許 可 の チ ェ ッ ク を 経 た 上 で 、 子 供 の PID 名 前 空 間 の "init" プ ロ セ ス に シ グ ナ ル を 送 信 で き る 。 (ハ ン ド ラ ー 内 で は 、 sigaction(2) に 説 明 が あ る siginfo_tsi_pid フ ィ ー ル ド は 0 に な る 。 ) SIGKILLSIGSTOP は 例 外 と し て 扱 わ れ 、 こ れ ら の シ グ ナ ル が 先 祖 の PID 名 前 空 間 か ら 送 信 さ れ た 場 合 に は 強 制 的 に 配 送 さ れ る 。 こ れ ら の シ グ ナ ル は ど ち ら も "init" プ ロ セ ル が 捕 捉 す る こ と は で き な い 。 そ の た め 、 こ れ ら の シ グ ナ ル に 関 連 付 け ら れ た 通 常 の ア ク シ ョ ン (そ れ ぞ れ 、 プ ロ セ ス の 終 了 と プ ロ セ ス の 強 制 停 止 ) が 実 行 さ れ る 。

Linux 3.4 以 降 で は 、 reboot(2) シ ス テ ム コ ー ル を 呼 び 出 す と 、 シ グ ナ ル が そ の 名 前 空 間 の "init" プ ロ セ ス に 送 信 さ れ る 。 詳 細 は reboot(2) を 参 照 。 ネ ス ト さ れ た PID 名 前 空 間
PID 名 前 空 間 は 入 れ 子 に す る こ と が で き る 。 最 初 の ("root") PID 名 前 空 間 以 外 の 各 PID 名 前 空 間 は 親 を 持 つ 。 PID 名 前 空 間 の 親 は clone(2)unshare(2) を 使 っ て そ の 名 前 空 間 を 作 成 し た プ ロ セ ス の PID 名 前 空 間 で あ る 。 し た が っ て 、 PID 名 前 空 間 は 木 構 造 を 構 成 し 、 す べ て の 名 前 空 間 は 親 を 辿 っ て 行 く と 、 最 終 的 に は root 名 前 空 間 に 辿 り 着 く 。 プ ロ セ ス は 、 所 属 す る PID 名 前 空 間 の 他 の プ ロ セ ス か ら 見 え る 。 ま た 、 root PID 名 前 空 間 に 向 か う 直 径 の 先 祖 の 各 PID 名 前 空 間 の プ ロ セ ス か ら も 見 え る 。 こ の 場 合 、 「 見 え る 」 と は 、 あ る プ ロ セ ス が 、 他 の プ ロ セ ス が プ ロ セ ス ID を 指 定 す る シ ス テ ム コ ー ル を 使 う 際 に 操 作 の 対 象 に で き る こ と を 意 味 す る 。 逆 に 、 子 供 PID 名 前 空 間 の プ ロ セ ス か ら 親 や 先 祖 の 名 前 空 間 の プ ロ セ ス は 見 え な い 。 あ る プ ロ セ ス は 自 分 自 身 の PID 名 前 空 間 と そ の 子 孫 の 名 前 空 間 の プ ロ セ ス だ け が 見 え る (例 え ば 、 kill(2) で シ グ ナ ル を 送 信 し た り 、 setpriority(2) で nice 値 を 設 定 し た り 、 な ど )。 プ ロ セ ス は 、 そ の プ ロ セ ス が 見 え る PID 名 前 空 間 の 階 層 の 各 層 に お い て プ ロ セ ス ID を 一 つ 持 ち 、 直 接 の 先 祖 の 名 前 空 間 を 辿 る こ と で 通 っ て root PID 名 前 空 間 に 至 る こ と が で き る 。 プ ロ セ ス ID に 対 し て 操 作 を 行 う シ ス テ ム コ ー ル は 、 常 に 、 呼 び 出 し 元 プ ロ セ ス の PID 名 前 空 間 で 見 え る プ ロ セ ス ID を 使 っ て 操 作 を 行 う 。 getpid(2) の 呼 び 出 し で は 、 常 に 、 プ ロ セ ス が 作 成 さ れ た 名 前 空 間 に 関 連 付 け ら れ た PID を 返 す 。

PID 名 前 空 間 内 の プ ロ セ ス は 名 前 空 間 の 外 部 に 親 プ ロ セ ス を 持 つ こ と が で き る 。 例 え ば 、 そ の 名 前 空 間 の 初 期 プ ロ セ ス (す な わ ち PID 1 を 持 つ init(1) プ ロ セ ス ) の 親 プ ロ セ ス は 必 然 的 に 別 の 名 前 空 間 に 属 す こ と に な る 。 同 様 に 、 あ る プ ロ セ ス が setns(2) を 使 っ て 子 プ ロ セ ス を PID 名 前 空 間 に 参 加 さ せ た 場 合 、 子 プ ロ セ ス は setns(2) の 呼 び 出 し 元 と は 異 な る PID 名 前 空 間 に 属 す 。 子 プ ロ セ ス で getppid(2) を 呼 び 出 す と 0 が 返 さ れ る 。 プ ロ セ ス は (setns(2) を CLONE_NEWPID で 使 う な ど で ) 子 供 の PID 名 前 空 間 に 自 由 に 入 る こ と が で き る が 、 逆 の 方 向 に は 移 動 で き な い 。 つ ま り 、 プ ロ セ ス は 先 祖 の 名 前 空 間 (親 、 親 の 親 な ど ) に 入 る こ と は で き な い 。 PID 名 前 空 間 の 変 更 は 一 方 向 の 操 作 で あ る 。

setns(2)unshare(2) の 動 作
PID 名 前 空 間 の フ ァ イ ル デ ィ ス ク リ プ タ ー を 指 定 し て setns(2) を 呼 び 出 し た り 、 CLONE_NEWPID フ ラ グ 付 き で unshare(2) を 呼 び 出 し た り す る と 、 そ の 結 果 作 成 さ れ た 子 プ ロ セ ス は 呼 び 出 し 元 と は 異 な る PID 名 前 空 間 に 置 か れ る 。 し か し 、 こ れ ら の 呼 び 出 し で は 呼 び 出 し 元 プ ロ セ ス の PID 名 前 空 間 は 変 更 さ れ な い 。 な ぜ な ら 、 PID 名 前 空 間 を 変 更 し て し ま う と 、 呼 び 出 し 元 が 認 識 す る (getpid() が 返 す ) 自 分 の PID が 変 わ っ て し ま い 、 多 く の ア プ リ ケ ー シ ョ ン や ラ イ ブ ラ リ が 正 し く 動 作 し な く な る か ら で あ る 。 別 の 言 い 方 を す る と 、 あ る プ ロ セ ス が ど の PID 名 前 空 間 に 所 属 す る か は 、 そ の プ ロ セ ス が 作 成 さ れ た と き に 決 定 さ れ 、 そ れ 以 降 は 変 更 さ れ る こ と は な い 。 い ろ い ろ あ る が 、 プ ロ セ ス 間 の 親 子 関 係 に は 、 PID 名 前 空 間 の 親 子 関 係 が そ の ま ま 反 映 さ れ る と い う こ と だ 。 プ ロ セ ス の 親 プ ロ セ ス は 、 同 じ 名 前 空 間 に い る か 、 も し く は 直 接 の 親 PID 名 前 空 間 に い る か の い ず れ か で あ る 。

CLONE_NEWPID の 他 の CLONE_* フ ラ グ と の 互 換 性
CLONE_NEWPID
は い く つ か の 他 の CLONE_* フ ラ グ と 組 み 合 わ せ る こ と が で き な い 。

*

CLONE_THREAD は 、 プ ロ セ ス 内 の ス レ ッ ド 間 で 互 い に シ グ ナ ル を 送 信 で き る よ う に す る た め 、 同 じ PID 名 前 空 間 に 属 し て い る 必 要 が あ る 。 同 様 に 、 プ ロ セ ス 内 の 全 ス レ ッ ド が proc(5) フ ァ イ ル シ ス テ ム で 見 え る 必 要 が あ る 。

*

CLONE_SIGHAND は 、 同 じ PID 名 前 空 間 で あ る 必 要 が あ る 。 さ も な け れ ば 、 シ グ ナ ル が 送 信 さ れ た 際 に 、 シ グ ナ ル を 送 信 し た プ ロ セ ス の プ ロ セ ス ID を 意 味 の あ る 形 で エ ン コ ー ド す る こ と が で き な い (sigaction(2) の siginfo_t 型 の 説 明 を 参 照 )。 複 数 の PID 名 前 空 間 に 属 す る プ ロ セ ス 間 で 一 つ の シ グ ナ ル キ ュ ー を 共 有 す る と 、 う ま く 動 か な く な る 。

*

CLONE_VM は 、 全 ス レ ッ ド が 同 じ PID 名 前 空 間 に 属 し て い る 必 要 が あ る 。 な ぜ な ら 、 コ ア ダ ン プ の 観 点 か ら 見 る と 、 2 つ の プ ロ セ ス が 同 じ ア ド レ ス 空 間 を 共 有 し て い れ ば 、 こ れ ら は ス レ ッ ド で あ り 、 コ ア ダ ン プ が 一 緒 に 行 わ れ る か ら で あ る 。 コ ア ダ ン プ が 書 き 込 ま れ る 際 に 、 各 ス レ ッ ド の PID が コ ア ダ ン プ に 書 き 込 ま れ る 。 も し プ ロ セ ス ID の い く つ か が 親 PID 名 前 空 間 に 属 し て い た と す る と 、 プ ロ セ ス ID の 書 き 込 み は 意 味 を 持 た な く な っ て し ま う 。

ま と め る と 、 CLONE_THREAD, CLONE_SIGHAND, CLONE_VM で は 技 術 的 な 要 件 と し て PID 名 前 空 間 が 共 有 さ れ て い る 点 が あ る 。 (さ ら に clone(2) で は CLONE_THREADCLONE_SIGHAND が 指 定 さ れ た 際 に は CLONE_VM が 指 定 さ れ て い る 必 要 が あ る 点 に も 注 意 。 ) し た が っ て 、 以 下 の よ う な 順 序 で 呼 び 出 し を 行 う と (エ ラ ー EINVAL で ) 失 敗 す る 。

unshare(CLONE_NEWPID);
clone(..., CLONE_VM, ...); /* Fails */

setns(fd, CLONE_NEWPID);
clone(..., CLONE_VM, ...); /* Fails */

clone(..., CLONE_VM, ...);
setns(fd, CLONE_NEWPID); /* Fails */

clone(..., CLONE_VM, ...);
unshare(CLONE_NEWPID); /* Fails */

/proc と PID 名 前 空 間
/proc
フ ァ イ ル シ ス テ ム は 、 /proc の マ ウ ン ト を 行 っ た プ ロ セ ス の PID 名 前 空 間 で 見 え る プ ロ セ ス だ け を 表 示 す る 。 た と え 、 そ の /proc フ ァ イ ル シ ス テ ム が 他 の 名 前 空 間 の プ ロ セ ス か ら 参 照 さ れ た と し て も 、 そ う で あ る 。 新 し い PID 名 前 空 間 を 作 成 し た 後 、 子 プ ロ セ ス が 、 自 身 の root デ ィ レ ク ト リ を 変 更 し 、 新 し い procfs イ ン ス タ ン ス を /proc に マ ウ ン ト す る の は ps(1) な ど の ツ ー ル が 正 し く 動 作 す る た め に も 有 用 で あ る 。 clone(2)flags 引 き 数 に CLONE_NEWNS も 指 定 さ れ て 新 し い マ ウ ン ト 名 前 空 間 が 同 時 に 作 成 さ れ た 場 合 は 、 root デ ィ レ ク ト リ を 変 更 す る 必 要 は な い 。 新 し い procfs イ ン ス タ ン ス を /proc に そ の ま ま マ ウ ン ト す る こ と が で き る 。 シ ェ ル か ら 、 コ マ ン ド で /proc の マ ウ ン ト を 行 う に は 次 の よ う に す る 。

$ mount −t proc proc /proc パ ス /proc/self に 対 し て readlink(2) を 呼 び 出 す と 、 procfs の マ ウ ン ト を 行 っ た プ ロ セ ス の PID 名 前 空 間 に お け る プ ロ セ ス ID が 得 ら れ る 。 こ れ は 調 査 目 的 で プ ロ セ ス が 他 の 名 前 空 間 で 自 身 の PID を 知 り た い 場 合 な ど に 役 立 つ 。 そ の 他 プ ロ セ ス ID が UNIX ド メ イ ン ソ ケ ッ ト 経 由 で 別 の PID 名 前 空 間 の プ ロ セ ス に 渡 さ れ る 場 合 (unix(7) の SCM_CREDENTIALS の 説 明 を 参 照 )、 プ ロ セ ス ID は 受 信 プ ロ セ ス の PID 名 前 空 間 で の 対 応 す る PID 値 に 翻 訳 さ れ る 。

準 拠

名 前 空 間 は Linux 独 自 の 機 能 で あ る 。

user_namespaces(7) 参 照 。

関 連 項 目

clone(2), setns(2), unshare(2), proc(5), credentials(7), capabilities(7), user_namespaces(7), switch_root(8)

こ の 文 書 に つ い て

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