大部分的Linux文件系統(如ext2、ext3)規定,一個文件由目錄項、inode和數據塊組成:
目錄項:包括文件名和inode節點號。
Inode:又稱文件索引節點,包含文件的基礎信息以及數據塊的指針。
數據塊:包含文件的具體內容。
文件數據都儲存在"塊"中,那麼很顯然,我們還必須找到一個地方儲存文件的元信息,比如文件的創建者、文件的創建日期、文件的大小等等。這種儲存文件元信息的區域就叫做inode,中文譯名為"索引節點"。
inode包含文件的元信息,具體來說有以下內容:
文件的字節數。
文件擁有者的User ID。
文件的Group ID。
文件的讀、寫、執行權限。
文件的時間戳,共有三個:ctime指inode上一次變動的時間,mtime指文件內容上一次變動的時間,atime指文件上一次打開的時間。
鏈接數,即有多少文件名指向這個inode。
文件數據block的位置。
可以用stat命令,查看某個文件的inode信息:
stat demo.txt總之,除了文件名以外的所有文件信息,都存在inode之中。至於為什麼沒有文件名,下文會有詳細解釋。
當查看某個文件時,會先從inode表中查出文件屬性及數據存放點,再從數據塊中讀取數據。
請看文件存儲結構示意圖:
每個inode節點的大小,一般是128字節或256字節。inode節點的總數,在格式化時就給定,一般是每1KB或每2KB就設置一個inode。假定在一塊1GB的硬盤中,每個inode節點的大小為128字節,每1KB就設置一個inode,那麼inode table的大小就會達到128MB,占整塊硬盤的12.8%。
查看每個硬盤分區的inode總數和已經使用的數量,可以使用df -i 命令。
查看每個inode節點的大小,可以用如下命令:
sudo dumpe2fs -h /dev/hda | grep "Inode size"由於每個文件都必須有一個inode,因此有可能發生inode已經用光,但是硬盤還未存滿的情況。這時,就無法在硬盤上創建新文件。
使用ls -i命令,可以看到文件名對應的inode號碼,例如:
ls -i demo.txt
目錄文件的結構非常簡單,就是一系列目錄項(dirent)的列表。每個目錄項,由兩部分組成:所包含文件的文件名,以及該文件名對應的inode號碼。
ls命令只列出目錄文件中的所有文件名:
ls /etcls -i命令列出整個目錄文件,即文件名和inode號碼:
ls -i /etc如果要查看文件的詳細信息,就必須根據inode號碼,訪問inode節點,讀取信息。ls -l命令列出文件的詳細信息。
ls -l /etc
ln命令可以創建硬鏈接,語法為:
ln source_file target_file運行上面這條命令以後,源文件與目標文件的inode號碼相同,都指向同一個inode。inode信息中有一項叫做"鏈接數",記錄指向該inode的文件名總數,這時就會增加1。反過來,刪除一個文件名,就會使得inode節點中的"鏈接數"減1。當這個值減到0,表明沒有文件名指向這個inode,系統就會回收這個inode號碼,以及其所對應block區域。
這裡順便說一下目錄文件的"鏈接數"。創建目錄時,默認會生成兩個目錄項:"."和".."。前者的inode號碼就是當前目錄的inode號碼,等同於當前目錄的"硬鏈接";後者的inode號碼就是當前目錄的父目錄的inode號碼,等同於父目錄的"硬鏈接"。所以,任何一個目錄的"硬鏈接"總數,總是等於2加上它的子目錄總數(含隱藏目錄),這裡的2是父目錄對其的“硬鏈接”和當前目錄下的".硬鏈接“。
ln -s命令可以創建軟鏈接,語法為:
ln source_file target_file