Linux 文件與目錄

筆者在前文《Linux EXT2 文件系統中》中介紹了 EXT2 文件系統中的基本概念,本文繼續以 EXT2 文件系統爲例介紹文件系統是如何管理文件存儲的。html

inode

在前文介紹文件系統時咱們提到了 inode 和 data block。在 EXT2 文件系統中,inode 用來存放文件的元信息,data block 用來存放文件的內容。inode 包含的文件元信息有:node

  • 該文件的讀寫權限(rwx)
  • 該文件的擁有者和所屬組(owner/group)
  • 該文件的大小
  • 該文件的 ctime(建立時間)
  • 該文件的 atime(最近一次的讀取時間)
  • 該文件的 mtime(最近修改的時間)
  • 該文件的特殊標識,好比 SetUID 等
  • 該文件真正內容的指向(文件 data block 的位置)

總之,除了文件名以外的全部文件信息都存在 inode 中。咱們可使用 stat 命令來查看文件的 inode 信息:linux

$ stat test.txt

inode 的大小
inode 自己是會消耗磁盤空間的,咱們能夠經過下面的方式查看 inode 的大小:數據結構

$ sudo dumpe2fs -h /dev/sdd1 | grep "Inode size"

在筆者的機器上,輸出的結果以下:post

dumpe2fs 1.42.13 (17-May-2015)
Inode size:              256

也就是說一個 inode 佔用 256 個字節的磁盤空間。 spa

inode 耗盡問題
由於每一個文件須要佔用一個 inode,因此生產中會碰到 inode 耗盡致使沒法建立新文件的問題。咱們能夠經過 df 命令 的 -i 選項查看文件系統中 inode 的使用狀況:3d

$ df -i

文件

每一個文件都會佔用一個 inode,inode 內則有文件數據放置的 block 號碼。當咱們在 Linux 下的 ext2 文件系統中建立一個通常文件時,ext2 文件系統會分配一個 inode 與相對於該文件大小的 data block(一個或多個) 給該文件。inode 記錄該文件的權限與屬性,並記錄分配到的 data block 號碼。例如:假設一個 data block 的大小爲 4 KBytes,而要建立一個 100 Kbytes 的文件,linux 就會分配一個 inode 與 25 個data block 來儲存該文件!
單個文件,inode 和 data block 的示意圖(能夠簡單的理解爲下圖的樣子):unix

這種數據存取的方法咱們稱爲索引式文件系統(indexed allocation)。指針

雖然從實現的層面上來看,能夠直接從 inode 找到其對應的 data block,可是咱們卻不能經過 inode 直接訪問文件,由於這會破壞經過權限進行的訪問控制。例如,若是沒有遍歷目錄的權限,那麼不管文件上的權限是什麼,都不能訪問該目錄中的任何文件。若是能夠經過inode訪問文件,就能夠繞過目錄權限。code

目錄

注意,inode 自己並不記錄文件名,文件名的記錄是在目錄的 data block 當中。
目錄本質上也是一個文件,因此當咱們在 ext2 文件系統中建立一個目錄時,文件系統會分配一個 inode 和至少一塊 data block 給這個目錄。其中,inode 記錄該目錄相關的權限與屬性,並記錄分配到的 data block 號碼。而 data block 中則記錄着在這個目錄下的文件名(目錄也是文件)與該文件名的 inode 號碼。也就是說目錄所佔用的 data block 的內容記錄着相似下面的信息:

目錄項
文件名及其對應的 inode 被稱爲目錄項。其實,目錄項是內存中的數據結構,因此實際狀況是文件名對應的是指向 inode 的指針。咱們能夠經過下面的示意圖來理解 inode、目錄、文件以及目錄項之間的關係:

從磁盤讀取一個文件的過程

因爲目錄樹是由根目錄開始讀起,所以經過文件系統的掛載信息能夠找到掛載點的 inode 號,此時就可以獲得根目錄的 inode 內容,並經過這個 inode 讀取根目錄的 data block 中的文件名稱,再一層一層的往下查找,直到讀到正確的文件名。下面讓咱們經過讀取 /etc/passwd 文件來理解文件的讀取過程。

上面的 ls 命令使用 i 選項輸出了 /、 /etc、 /etc/passwd 的 inode 分別爲 二、432537七、4329700。
咱們經過當前用戶 nick 讀取 /etc/passwd 文件的內容,其過程以下:

  1. / 的 inode 號爲 2,權限信息容許咱們讀取 data block 中的內容(有 r 與 x)
  2. / 的 data block 中記錄的 etc/ 目錄的 inode 號爲 4325377
  3. etc/ 的 inode 中權限信息包含 rx,所以用戶 nick 能夠讀取 etc/ data block 的內容
  4. etc/ 的 data block 中記錄的 passwd 文件的 inode 號爲 4329700
  5. 文件 passwd 的 inode 中權限信息包含 r,所以用戶 nick 能夠讀取 passwd data block 的內容
  6. passwd 的 data block 中的內容被讀取出來

參考:
鳥哥的私房菜
理解inode
Linux inode 詳解
關於 inode
目錄項對象

相關文章
相關標籤/搜索