Linux檔案系統與檔案屬性
阿新 • • 發佈:2019-01-04
磁碟和分割槽
常規檔案和目錄通常存放在硬盤裡。可將每塊磁碟劃分為一個或多個不重疊的分割槽,核心將每個分割槽視為位於/dev路徑下單獨裝置。
磁碟分割槽主要是以下三種之一:檔案系統、資料區域(可做裸裝置對其訪問)、交換區域(供虛擬記憶體使用)。
檔案系統
檔案系統是對常規檔案和目錄的組織集合。在檔案系統中,用來分配空間的基本單位是邏輯塊,即檔案系統所在磁碟裝置上若干連續的物理塊。在ext2檔案系統中,邏輯塊的大小為1024、2048、4096位元組。
磁碟分割槽和檔案系統之間的關係如下:
檔案系統主要由以下部分組成:
- 引導塊:檔案系統的首塊
- 超級塊:包含檔案系統有關的引數資訊:i節點表容量、檔案系統中邏輯塊大小、以邏輯塊計數的檔案系統大小
- i節點表:檔案系統中每個檔案或者目錄在i節點表中都有對應著唯一一條記錄,記錄關於檔案的各種資訊。
- 資料塊:檔案系統中大部分空間都用於存放資料。
i節點
針對檔案系統上的每個檔案,檔案系統的i節點表都會有一個i節點(索引節點)。主要記錄以下資訊:
- 檔案型別(常規檔案、目錄、符號連結、字元裝置等)
- 檔案屬主(UID)和檔案屬組(GID)
- 屬主、屬組、其他使用者的訪問許可權
- 3個時間戳(最後訪問時間、最後修改時間、檔案狀態最後改變時間)
- 檔案的硬連結數量
- 檔案大小,以位元組為單位
- 實際分配給檔案的塊數量
- 指向檔案資料塊的指標
ext2檔案系統中,i節點結構如下。每個i節點包含15指標,其中前12個指標指向檔案前12個塊在檔案系統中的位置,接下來是一個指向指標塊的指標,提供了檔案第13個及後續資料塊的位置。指標塊中指標數量取決於檔案系統中塊的大小:
這樣設計的優點:
- 在維持i節點結構大小固定的同時,支援任意大小的檔案
- 檔案系統即可以以不連續方式來儲存檔案塊,又可以通過lseek()隨機訪問檔案
- 因為大多數系統中的檔案是小檔案,這樣設計滿足快速對檔案資料塊的訪問,即通過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》