1. 程式人生 > >Linux檔案系統與檔案屬性

Linux檔案系統與檔案屬性

磁碟和分割槽

    常規檔案和目錄通常存放在硬盤裡。可將每塊磁碟劃分為一個或多個不重疊的分割槽,核心將每個分割槽視為位於/dev路徑下單獨裝置。

    磁碟分割槽主要是以下三種之一:檔案系統、資料區域(可做裸裝置對其訪問)、交換區域(供虛擬記憶體使用)。

檔案系統

    檔案系統是對常規檔案和目錄的組織集合。在檔案系統中,用來分配空間的基本單位是邏輯塊,即檔案系統所在磁碟裝置上若干連續的物理塊。在ext2檔案系統中,邏輯塊的大小為1024、2048、4096位元組。

    磁碟分割槽和檔案系統之間的關係如下:

    檔案系統主要由以下部分組成:

  1. 引導塊:檔案系統的首塊
  2. 超級塊:包含檔案系統有關的引數資訊:i節點表容量、檔案系統中邏輯塊大小、以邏輯塊計數的檔案系統大小
  3. i節點表:檔案系統中每個檔案或者目錄在i節點表中都有對應著唯一一條記錄,記錄關於檔案的各種資訊。
  4. 資料塊:檔案系統中大部分空間都用於存放資料。

i節點

    針對檔案系統上的每個檔案,檔案系統的i節點表都會有一個i節點(索引節點)。主要記錄以下資訊:

  1. 檔案型別(常規檔案、目錄、符號連結、字元裝置等)
  2. 檔案屬主(UID)和檔案屬組(GID)
  3. 屬主、屬組、其他使用者的訪問許可權
  4. 3個時間戳(最後訪問時間、最後修改時間、檔案狀態最後改變時間)
  5. 檔案的硬連結數量
  6. 檔案大小,以位元組為單位
  7. 實際分配給檔案的塊數量
  8. 指向檔案資料塊的指標

    ext2檔案系統中,i節點結構如下。每個i節點包含15指標,其中前12個指標指向檔案前12個塊在檔案系統中的位置,接下來是一個指向指標塊的指標,提供了檔案第13個及後續資料塊的位置。指標塊中指標數量取決於檔案系統中塊的大小:

     這樣設計的優點:

  1. 在維持i節點結構大小固定的同時,支援任意大小的檔案
  2. 檔案系統即可以以不連續方式來儲存檔案塊,又可以通過lseek()隨機訪問檔案
  3. 因為大多數系統中的檔案是小檔案,這樣設計滿足快速對檔案資料塊的訪問,即通過i節點直接指標訪問。

虛擬檔案系統

    虛擬檔案系統是一種核心特性,通過為檔案系統建立抽象層來解決不同檔案系統的不同點。VFS針對檔案系統定義了一套通用的介面,所有與檔案互動的程式都按照這一介面來操作,這樣程式就只用訪問VFS介面,而不同瞭解不同檔案系統之間的具體實現細節。

檔案屬性

    通過系統呼叫stat()、lstat()、fstat()獲取檔案相關資訊。

#include <sys/stat.h>

int stat(const char *pathname,struct stat *statbuf);
int lstat(const char *pathname,struct stat *statbuf);
int fstat(int fd,struct stat *statbuf);

struct stat{
    dev_t st_dev;          //檔案駐留裝置id
    ino_t st_ino;          //檔案i節點
    mode_t st_mode;        //檔案型別
    nlink_t st_nlink;      //硬連結數
    uid_t st_uid;          //UID
    gid_t st_gid;          //GID
    dev_t st_rdev;         
    off_t st_size;         //檔案位元組數
    blksize_t st_blksize;  //IO最優塊大小  
    blkcnt_t st_blocks;    //總塊數
    time_t st_atime;       //時間戳
    time_t st_mtime;
    time_t st_ctime;

}

 

參考 《TLPI》、《APUE》