名 前
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_t の si_pid フ ィ ー ル ド は 0 に な る 。 ) SIGKILL と SIGSTOP は 例 外 と し て 扱 わ れ 、 こ れ ら の シ グ ナ ル が 先 祖 の 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_THREAD か CLONE_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/ に 書 か れ て い る 。