1. 程式人生 > >Linux 中檔名存在哪裡?

Linux 中檔名存在哪裡?

面試中被問到Linux系統下檔案的檔名放在了哪裡,沒答出來。:-(這裡總結下:

我們可以把一個磁碟分成一個或多個分割槽。每個分割槽可以包含一個檔案系統。
i節點是固定長度的記錄項,它包含了有關檔案的大部分資訊。可是就是不包含檔名!

inode包含檔案的元資訊,具體來說有以下內容:
  * 檔案的位元組數
  * 檔案擁有者的User ID
  * 檔案的Group ID
  * 檔案的讀、寫、執行許可權
  * 檔案的時間戳,共有三個:ctime指inode上一次變動的時間,mtime指檔案內容上一次變動的時間,atime指檔案上一次開啟的時間。
  * 連結數,即有多少檔名指向這個inode
  * 檔案資料block的位置

可以用stat命令,檢視某個檔案的inode資訊:

stat example.txt**

總之,除了檔名以外的所有檔案資訊,都存在inode之中。
這裡寫圖片描述
如果仔細得觀察硬碟中一個柱面組的i節點和資料塊部分,可以看到上圖的情況。
1. 在圖中有兩個目錄項指向同一個i節點。每個i節點中都有一個連結計數,其值是指向該i節點的目錄項數。只有當連結計數減少至0時。才可以刪除該檔案(也就是說可以釋放該檔案所佔用的硬碟空間了)。這就是為什麼“解除對一個檔案的連結”操作並不總是意味著“釋放該檔案佔用的磁碟塊”的原因。在stat結構中,連結計數包含在st_nlink成員中,其基本系統資料型別是nlink_t。這種連結型別稱為硬連結。
2. 另外一種連結型別稱為符號型別,對於這種連結,該檔案的實際內容(在資料塊中)包含了該符號連結所指向的檔案的名字。在下例中:

lrwxrwxrwx 1 root 7 Sep 1 12:33 lib -> usr/lib

該目錄項中的檔名是3字元的字串lib,而在該檔案中包含了7個數據位元組usr/lib。該i節點的檔案型別是S_IFLNK,於是系統知道這是個符號連結。
引入符號連結的原因是為了避開硬連結的一些限制:
(1)硬連結通常要求連結和檔案位於同一檔案系統中。
(2)只有root使用者才能建立目錄的硬連結
3. i節點包含了大多數與檔案有關的資訊:檔案系統、檔案訪問許可權位、檔案長度等等資訊。stat結構中的大多數資訊都取自i節點。只有兩項資料存放在目錄項中:檔名和i節點編號。


4. 每個檔案系統各自對他們的i節點進行編號,因此目錄項中的i節點編號數指向同一檔案系統中的相應i節點,不能使一個目錄項指向另一個檔案系統的i節點。這就是為什麼ln命令不能跨檔案系統的原因。