檔案系統與儲存

路徑解析(path resolution,路徑走訪)

當你給系統一條像 /usr/local/bin/python 的路徑,那個字串並不是一個檔案——它是通往一個檔案的指路,一步一步地讀。核心必須循這份指路:從某處開始,在目前目錄裡找到下一個名字,走進它,重複下去,直到最後一個名字命名了你要的檔案。把一條路徑字串變成真正的 inode,就叫做路徑解析,常稱為路徑走訪。

以下是 /usr/local/bin/python 的走訪。(1) 因為路徑以 / 開頭,從檔案系統的根 inode 開始。(2) 讀根目錄的目錄項、找到 usr、取其 inode;確認它是目錄、且你對它有執行(搜尋)權限。(3) 在 usr 裡找 local、取其 inode、查權限。(4) 在 local 裡找 bin。(5) 在 bin 裡找 python、取其 inode——那就是目標。每一步核心先查目錄項快取,只在未命中時才從磁碟讀目錄區塊。像 ../data 這樣的相對路徑不從根開始,而是從行程的目前工作目錄開始。若某元件是符號連結,核心便代換成連結所存的路徑繼續走訪——並對它願意循的符號連結數設上限(ELOOP),使一個指向自己的連結不會永遠繞圈。

為何重要:路徑解析正是權限、符號連結與掛載點逐元件生效之處。跨入一個掛載的檔案系統發生在走訪途中:當某元件是掛載點,走訪便從底下目錄的 inode 跳到所掛載檔案系統的根。它也解釋了一個微妙的安全點——你需要對路徑上每一個目錄都有執行(搜尋)權限,而不只是最終檔案;而若某元件在檢查與使用之間被掉包成符號連結,便可能發生 TOCTOU 競爭,這正是為何存在像帶 O_NOFOLLOW 的 openat() 與整個 *at 系列這種更安全的介面。

解析 "/usr/local/bin/python": / -> 根 inode 2 (需要 x 權限) usr -> inode 12 (目錄,x 可) local -> inode 940 (目錄,x 可) bin -> inode 951 (目錄,x 可) python -> inode 9032 <- 目標

走訪把路徑字串一次一個元件地變成 inode,並在每個目錄檢查搜尋權限。

你需要對路徑中每一個目錄都有執行(搜尋)權限,而不只是對檔案有讀取權限。此外,路徑途中遇到的符號連結會被展開、走訪繼續,這正是為何在檢查與使用之間惡意掉包符號連結(TOCTOU 競爭)是真實的危害——對不可信路徑請偏好使用帶 O_NOFOLLOW 的 openat()。

又稱
pathname lookupname resolutionpath walk路徑查找路徑走訪