Linux 最經典的一句話是:「一切皆文件」,不僅普通的文件和目錄,就連塊設備、管道、 等,也都是統一交給文件系統管理的。
Linux 文件系統會為每個文件分配兩個數據結構:索引節點(index node)和目錄項( entry),它們主要用來記錄文件的元信息和目錄層次結構。
管理文件的兩大數據結構:
索引節點,也就是 inode,用來記錄文件的元信息,比如 inode 編號、文件大小、訪問權限、創建時間、修改時間、數據在磁盤的位置等等。索引節點是文件的唯一標識,它們之間一一對應,也同樣都會被存儲在硬盤中,所以索引節點同樣占用磁盤空間。
目錄項,也就是 ,用來記錄文件的名字、索引節點指針以及與其他目錄項的層級關聯關系。多個目錄項關聯起來,就會形成目錄結構,但它與索引節點不同的是,目錄項是由內核維護的一個數據結構,不存放于磁盤,而是緩存在內存。
細節提醒:
由于索引節點唯一標識一個文件,而目錄項記錄著文件的名,所以目錄項和索引節點的關系是多對一,也就是說,一個文件可以有多個別字。比如,硬鏈接的實現就是多個目錄項中的索引節點指向同一個文件。注意,目錄也是文件,也是用索引節點唯一標識,和普通文件不同的是,普通文件在磁盤里面保存的是文件數據,而目錄文件在磁盤里面保存子目錄或文件。
注意區分目錄項和目錄
雖然名字很相近,但是它們不是一個東西,目錄其實是個文件數據結構讀取文件,可以叫做目錄文件,持久化存儲在磁盤,而目錄項是內核一個數據結構,是目錄文件對應數據區(data block)里面存放的內容,目錄由多個目錄項組成。如果查詢目錄頻繁從磁盤讀,效率會很低,所以內核會把已經讀過的目錄用目錄項這個數據結構緩存在內存,下次再次讀到相同的目錄時,只需從內存讀就可以,大大提高了文件系統的效率。注意,目錄項這個數據結構不只是表示目錄,也是可以表示文件的。
文件數據是如何存儲在磁盤
磁盤讀寫的最小單位是扇區數據結構讀取文件,扇區的大小只有 512B 大小,但是對于操作系統來說,如果每次讀寫都以這么小為單位,那這讀寫的效率會非常低。
所以,文件系統把多個扇區組成了一個邏輯塊,每次讀寫的最小單位就是邏輯塊(數據塊),Linux 中的邏輯塊大小為 4KB,即連續八個 組成一個 block,也就是一次性讀寫 8 個扇區,這將大大提高了磁盤的讀寫的效率。