linux掛載機制,訪問父目錄的細節是怎樣的?
linux 中可以將文件系統掛載在不同的目錄下,根據目錄項中的文件名對應的inode編號找到相應的文件。但有一點不太理解,如下圖,sda2掛載在/目錄下,sda6掛載在/home目錄下
若當前在/home目錄下,父目錄(/)與當前目錄(/home)的inode編號都是2,即便它們的目錄項在不同的磁碟中,但在當前的目錄下,訪問父目錄是怎麼找到父目錄的inode塊的,據我所知目錄項里只有簡單的幾條信息,包括inode編號,文件名,並不包括inode塊所在的磁碟設備位置,請問訪問父目錄(相對路徑)時,是怎麼找到父目錄的inode塊的?
目錄項的結構:
可能我理解的會不正確,因為我已經很久沒有碰內核了。但是根據我的模糊記憶,在多掛載文件系統下,決定一個文件,需要的是inode號(ino_t) + 設備號(dev_t)。所以你看到的/home inode 2隻是表明那一個磁碟的root路徑,但是你訪問的父目錄的inode 2,是另一個磁碟設備的root路徑,然後你訪問父目錄那一個文件,是由inode + dev_t共同決定的,不僅僅是inode.
今天剛到看到這塊。每個在內存里的inode里都有一個超級塊的指針,每個mount出來的目錄都對應一個超級塊。所以不同超級塊里的inode的序號不需要不一樣。inode里有個dentry的指針,裡面包含了目錄信息和父節點的dentry指針,可以提供父目錄的信息。
VFS是在內存中建立,與硬碟文件系統無關。文件的定位是path_lookup()函數實現的,其中的__follow_mount()跟蹤掛載點。細節太多了,谷歌下就知道了
做了一個實驗,mount了一個文件到/home目錄下,然後再查home目錄的i結點信息,發現它的inode號由原來的7位數變成了跟根目錄一樣的2,應該是因為mount過程中會屏蔽掉原來的inode號(這樣做兩個影響:一,讓/home目錄下原有的文件暫時不可被訪問;二, 讓/home目錄指向新掛載的設備或文件)。
VFS層會維護mount的一些信息,有個vfsmount結構體,可以關注一下,應該能找到答案。參考一下VFS樹
mount 表是存在內存中的,解析路徑的時候會先去看這個表,然後決定是去哪個設備中找。
你的 sda2 根目錄下的 .. 文件項應該是指向自己的,因為它是一個設備的根目錄,並不知道自己被掛載在哪裡。
參考文獻:torvalds/linux
mark 明天去實驗室測試一下,順便看下代碼,再來回答!題主這個問題問的很好!
推薦閱讀:
※在Linux內核模塊中對空指針解引用,為什麼內核不掛?
※使用Bioconda管理Linux系統中的生物信息軟體
※沒有 Linux 和開源軟體的世界會變得怎麼樣
※獲取自旋鎖和禁止中斷的時候為什麼不能睡眠?