名 前
path_resolution − フ ァ イ ル の パ ス 名 の 解 決 方 法
説 明
い く つ か の UNIX/Linux シ ス テ ム コ ー ル は 、 1 つ 以 上 の フ ァ イ ル 名 を 引 き 数 と し て 持 つ 。 フ ァ イ ル 名 (ま た は パ ス 名 ) は 以 下 の よ う に し て 解 決 さ れ る 。 ス テ ッ プ 1: 解 決 過 程 を 開 始 す る パ ス 名 が '/' 文 字 で 始 ま っ て い る 場 合 、 デ ィ レ ク ト リ 検 索 の 開 始 点 は 呼 び 出 し 元 の プ ロ セ ス の ル ー ト デ ィ レ ク ト リ に な る 。 (プ ロ セ ス は ル ー ト デ ィ レ ク ト リ を 親 プ ロ セ ス か ら 継 承 す る 。 通 常 は 、 こ れ が フ ァ イ ル 階 層 の ル ー ト デ ィ レ ク ト リ に な る 。 プ ロ セ ス は chroot(2) シ ス テ ム コ ー ル を 使 っ て 別 の ル ー ト デ ィ レ ク ト リ を 取 得 す る こ と も で き る 。 こ の 場 合 、 そ の プ ロ セ ス と CLONE_NEWNS フ ラ グ を 設 定 し て clone(2) を 呼 び 出 す こ と に よ っ て 開 始 さ れ た そ の プ ロ セ ス の 子 孫 は 、 完 全 に プ ラ イ ベ ー ト な マ ウ ン ト 名 前 空 間 を 取 得 で き る 。 ) パ ス 名 の '/' の 部 分 は 、 こ の よ う に し て 扱 わ れ る 。 パ ス 名 が '/' 文 字 で 始 ま っ て い な い 場 合 、 解 決 過 程 に お け る デ ィ レ ク ト リ 検 索 の 開 始 点 は 、 プ ロ セ ス の 現 在 の 作 業 (working) デ ィ レ ク ト リ と な る 。 (こ れ も 親 プ ロ セ ス か ら 継 承 さ れ る 。 こ れ は chdir(2) シ ス テ ム コ ー ル を 使 う こ と で 変 更 で き る 。 )
'/' 文 字 で 始 ま る パ ス 名 は 絶 対 パ ス 名 と 呼 ば れ 、 '/' 文 字 で 始 ま ら な い パ ス 名 は 相 対 パ ス 名 と 呼 ば れ る 。 ス テ ッ プ 2: パ ス を 辿 る 現 在 の 検 索 デ ィ レ ク ト リ を デ ィ レ ク ト リ 検 索 の 開 始 点 と す る 。 そ し て 、 パ ス 名 の 最 後 の 構 成 要 素 (component) で な い 各 構 成 要 素 に つ い て 、 現 在 の 検 索 デ ィ レ ク ト リ で 検 索 を 行 う 。 こ こ で 構 成 要 素 は '/' で 区 切 ら れ た 部 分 文 字 列 で あ る 。 プ ロ セ ス が 現 在 の 検 索 デ ィ レ ク ト リ の 検 索 許 可 を 持 た な い 場 合 、 EACCES エ ラ ー が 返 さ れ る ("Permission denied")。 構 成 要 素 が 見 つ か ら な い 場 合 、 ENOENT エ ラ ー が 返 さ れ る ("No such file or directory")。 構 成 要 素 は 見 つ か っ た が 、 デ ィ レ ク ト リ で も シ ン ボ リ ッ ク リ ン ク で も な い 場 合 、 ENOTDIR エ ラ ー が 返 さ れ る ("Not a directory")。 構 成 要 素 が 見 つ か っ て 、 か つ デ ィ レ ク ト リ で あ る 場 合 、 現 在 の 検 索 デ ィ レ ク ト リ を そ の デ ィ レ ク ト リ に 設 定 し 、 次 の 構 成 要 素 に 移 動 す る 。 構 成 要 素 が 見 つ か っ て 、 か つ シ ン ボ リ ッ ク リ ン ク (symlink) で あ る 場 合 、 (現 在 の 検 索 デ ィ レ ク ト リ を デ ィ レ ク ト リ 検 索 の 開 始 点 と し て ) 最 初 に そ の シ ン ボ リ ッ ク リ ン ク を 解 決 す る 。 結 果 が デ ィ レ ク ト リ で な い 場 合 、 ENOTDIR エ ラ ー が 返 さ れ る 。 シ ン ボ リ ッ ク リ ン ク の 解 決 が 成 功 し て デ ィ レ ク ト リ が 返 さ れ た 場 合 、 そ の デ ィ レ ク ト リ を 現 在 の 検 索 デ ィ レ ク ト リ と し て 設 定 し 、 次 の 構 成 要 素 に 移 動 す る 。 解 決 過 程 に 再 帰 が 含 ま れ る 点 に 注 意 す る こ と 。 カ ー ネ ル を ス タ ッ ク オ ー バ ー フ ロ ー や サ ー ビ ス 拒 否 (denial of service) か ら 守 る た め 、 再 帰 の 最 大 の 深 さ と シ ン ボ リ ッ ク リ ン ク を 辿 る 最 大 回 数 に 制 限 が あ る 。 最 大 値 を 超 え た 場 合 ELOOP エ ラ ー が 返 さ れ る ("Too many levels of symbolic links")。 ス テ ッ プ 3: 最 後 の エ ン ト リ ー を 見 つ け る パ ス 名 の 最 後 の 構 成 要 素 の 検 索 は 、 前 の ス テ ッ プ で 説 明 し た 他 の 全 て の 構 成 要 素 と 同 じ よ う に 実 行 さ れ る が 、 2 つ の 違 い が あ る 。 (i) 最 後 の 構 成 要 素 は デ ィ レ ク ト リ で あ る 必 要 が な い (パ ス 解 決 過 程 に 関 す る 限 り は ど ち ら で も 構 わ な い — 特 定 の シ ス テ ム コ ー ル が 要 求 す る も の に よ っ て 、 デ ィ レ ク ト リ で な け れ ば な ら な い 場 合 も あ る し 、 デ ィ レ ク ト リ 以 外 で な け れ ば な ら な い 場 合 も あ る )。 (ii) 構 成 要 素 が 見 つ か ら な い 場 合 に エ ラ ー に す る 必 要 は な い — そ の 構 成 要 素 を 作 成 す る だ け で よ い 場 合 も あ る 。 最 後 の エ ン ト リ ー の 詳 細 な 扱 い は 、 特 定 の シ ス テ ム コ ー ル の man ペ ー ジ で 説 明 さ れ て い る 。
. と
.. 慣 習 と し て 、
全 て の デ ィ レ
ク ト リ は エ ン
ト リ ー "." と
".." を 持 つ 。 こ
れ ら は そ れ ぞ
れ 、 そ の デ ィ
レ ク ト リ 自 身
と そ の 親 デ ィ
レ ク ト リ を 参
照 す る 。 パ ス
解 決 過 程 で は
、 こ れ ら の エ
ン ト リ ー が 物
理 的 な フ ァ イ
ル シ ス テ ム に
実 際 に 存 在 す
る か 否 か に 関
わ ら ず 、 慣 習
的 な 意 味 を 持
つ と 仮 定 す る
。 ル ー ト よ り
上 に 辿 る こ と
は で き な い :
"/.." は "/" と 同
じ で あ る 。 マ
ウ ン ト 位 置
"mount dev path" コ マ ン
ド を 実 行 し た
後 、 パ ス 名
"path" は デ バ イ
ス "dev" 上 の フ ァ
イ ル シ ス テ ム
階 層 の ル ー ト
デ ィ レ ク ト リ
を 参 照 す る よ
う に な り 、 以
前 の 位 置 を 参
照 し な い 。 マ
ウ ン ト さ れ た
フ ァ イ ル シ ス
テ ム の 外 に 出
る こ と が で き
る : "path/.." は "dev"
上 の フ ァ イ ル
シ ス テ ム 階 層
の 外 で あ る
"path" の 親 デ ィ
レ ク ト リ を 参
照 す る 。 末 尾
の ス ラ ッ シ ュ
パ ス 名 が '/' で 終
わ っ て い る 場
合 、 ス テ ッ プ 2
に お い て 、 そ
の 前 に あ る 構
成 要 素 の 解 決
法 を 次 の よ う
に 強 制 す る : そ
の 構 成 要 素 が
存 在 し な け れ
ば な ら ず 、 デ
ィ レ ク ト リ と
し て 解 決 さ れ
る 。 存 在 し な
い 場 合 は 、 末
尾 の '/' が 無 視 さ
れ る 。 (ま た 同
様 に 、 末 尾 に '/'
が あ る パ ス 名
は 、 '.' を 末 尾 に
加 え て 得 ら れ
る パ ス 名 と 等
し い 。 ) 最 後 が
シ ン ボ リ ッ ク
リ ン ク の と き
パ ス 名 の 最 後
の 構 成 要 素 が
シ ン ボ リ ッ ク
リ ン ク で あ る
場 合 、 参 照 さ
れ る フ ァ イ ル
を シ ン ボ リ ッ
ク リ ン ク と す
る か 、 そ の 内
容 に つ い て パ
ス を 解 決 し た
結 果 と す る か
は 、 シ ス テ ム
コ ー ル に 依 存
す る 。 た と え
ば 、 シ ス テ ム
コ ー ル lstat(2) は シ
ン ボ リ ッ ク リ
ン ク に 作 用 す
る 。 一 方 、 stat(2)
は シ ン ボ リ ッ
ク リ ン ク で 指
さ れ た フ ァ イ
ル に 作 用 す る
。 長 さ の 制 限
パ ス 名 に は 最
大 長 が あ る 。
パ ス 名 (ま た は
シ ン ボ リ ッ ク
リ ン ク を 解 決
す る と き に 得
ら れ る 中 間 パ
ス 名 ) が 長 す ぎ
る 場 合 、 ENAMETOOLONG
エ ラ ー が 返 さ
れ る ("Filename too long")。
空 の パ ス 名 元
々 の UNIX で は 、 空
の パ ス 名 は 現
在 の デ ィ レ ク
ト リ を 参 照 し
て い た 。 最 近
、 POSIX で は 空 の パ
ス 名 を 解 決 す
る べ き で は な
い と い う 決 定
が な さ れ た 。
こ の 場 合 、 Linux は
ENOENT を 返 す 。
許 可 フ ァ イ ル
の 許 可 ビ ッ ト
は 、 3 組 の 3 ビ ッ
ト か ら 構 成 さ
れ る 。 chmod(1) と
stat(2) を 参 照 す る
こ と 。 呼 び 出
し 元 の プ ロ セ
ス の 実 効 ユ ー
ザ ー ID が フ ァ イ
ル の 所 有 者 ID と
等 し い 場 合 、 3
つ の う ち 最 初
の グ ル ー プ が
使 わ れ る 。 フ
ァ イ ル の グ ル
ー プ ID が 呼 び 出
し 元 の プ ロ セ
ス の 実 効 グ ル
ー プ ID ま た は
(setgroups(2) で 設 定 さ
れ る ) 呼 び 出 し
元 の プ ロ セ ス
の 補 助 (supplementary) グ ル
ー プ ID と 等 し い
場 合 、 3 つ の う
ち 2 番 目 の グ ル
ー プ が 使 わ れ
る 。 ど ち ら に
も 当 て は ま ら
な い 場 合 、 3 番
目 の グ ル ー プ
が 使 わ れ る 。
3 ビ ッ ト が 使 わ れ る 場 合 、 最 初 の ビ ッ ト は 読 み 込 み 許 可 を 決 定 し 、 2 番 目 の ビ ッ ト は 書 き 込 み 許 可 を 決 定 す る 。 ま た 3 番 目 の ビ ッ ト は 、 通 常 の フ ァ イ ル の 場 合 は 実 行 許 可 を 表 し 、 デ ィ レ ク ト リ の 場 合 は 検 索 許 可 を 表 す 。
Linux は 、 許 可 の チ ェ ッ ク に お い て 、 実 効 ユ ー ザ ー ID で は な く fsuid を 使 う 。 通 常 は fsuid は 実 効 ユ ー ザ ー ID と 等 し い が 、 fsuid は シ ス テ ム コ ー ル setfsuid(2) で 変 更 す る こ と が で き る 。
(こ こ で "fsuid" は "file system user ID" を 表 し て い る 。 こ の 概 念 は 「 プ ロ セ ス が 同 じ 実 効 ユ ー ザ ー ID を 持 つ プ ロ セ ス に 同 時 に シ グ ナ ル を 送 る こ と が で き る 」 と い う ユ ー ザ ー 空 間 NFS サ ー バ を 実 装 す る 際 に 必 要 で あ っ た 。 こ れ は 今 で は 廃 れ て し ま っ た 。 setfsuid(2) を 使 う べ き で は な い 。 同 様 に 、 Linux で は 実 効 グ ル ー プ ID の 代 わ り に fsgid ("フ ァ イ ル シ ス テ ム グ ル ー プ ID") を 使 う 。 setfsgid(2) を 参 照 す る こ と 。 許 可 の 確 認 を ス キ ッ プ す る : ス ー パ ー ユ ー ザ ー と ケ ー パ ビ リ テ ィ 伝 統 的 な UNIX シ ス テ ム で は 、 ス ー パ ー ユ ー ザ ー (root, ユ ー ザ ー ID 0) は 非 常 に 強 力 で あ り 、 フ ァ イ ル ア ク セ ス 時 の 許 可 に よ る 制 限 を 全 て ス キ ッ プ す る 。
Linux で は 、 ス ー パ ー ユ ー ザ ー 権 限 が 複 数 の ケ ー パ ビ リ テ ィ に 分 割 さ れ て い る (capabilities(7) 参 照 )。 フ ァ イ ル の 許 可 の 確 認 に は 、 CAP_DAC_OVERRIDE と CAP_DAC_READ_SEARCH の 2つ の ケ ー パ ビ リ テ ィ が 関 係 す る (プ ロ セ ス の fsuid が 0 の 場 合 、 そ の プ ロ セ ス は こ れ ら の ケ ー パ ビ リ テ ィ を 持 つ )。
CAP_DAC_OVERRIDE ケ ー パ ビ リ テ ィ は 全 て の 許 可 チ ェ ッ ク を 上 書 き す る 。 実 際 に は 、 対 象 と な る フ ァ イ ル の 3 つ の 実 行 許 可 ビ ッ ト の う ち の 少 な く と も 1 つ が 設 定 さ れ て い る 場 合 の み 、 実 行 を 許 可 す る 。
CAP_DAC_READ_SEARCH ケ ー パ ビ リ テ ィ は 、 デ ィ レ ク ト リ に 対 し て 読 み 込 み と 検 索 を 許 可 し 、 通 常 の フ ァ イ ル に 対 し て 読 み 込 み を 許 可 す る 。
関 連 項 目
readlink(2), capabilities(7), credentials(7), symlink(7)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。