Linux檔案系統 概述

2021-06-04 06:14:39 字數 2649 閱讀 7116

對於乙個作業系統來說,最主要的兩個模組就是檔案系統和程序管理。在linux中,檔案具有廣泛的含義,凡是能夠產生或者消耗資訊的都是檔案。linux除了支援自身的ext2檔案系統外,還支援其他各種不同的檔案系統。那麼這一目的是如何實現的呢?很容易想到的思路是,在各種不同的檔案系統之上增加乙個中間層,用於隔離各個具體檔案系統的差異,為上層使用者提供乙個統一的介面。實際上,linux正是這麼做的,它在具體的檔案系統上引入了乙個統一的、抽象的、虛擬的檔案系統介面,即所謂的vfs(virtual filesystem system,虛擬檔案系統),來隱藏具體檔案系統的實現細節。這個介面主要由一些抽象的、標準的檔案操作組成,並以系統呼叫的形式提供給使用者,如read(),wirte(),lseek()。vfs與具體的檔案系統之間的介面是明確定義的,其核心是乙個叫做file_operations的資料結構,其成員幾乎全為函式指標,每種檔案系統都有自己的file_operations資料結構,其中儲存了該檔案系統對vfs中的各個介面的實現**,如果具體的檔案系統不支援某種操作,其file_operations結構中的相應函式指標就為null。file_operations的定義如下:

/*

* note:

* read, write, poll, fsync, readv, writev can be called

* without the big kernel lock held in all filesystems.

*/struct file_operations ;

linux中vfs和具體檔案系統的關係可以用下圖來說明:

當程序通過open()系統呼叫開啟檔案時,該程序就與具體的檔案建立起了聯絡,乙個「已開啟的檔案」在系統中表現為乙個file資料結構,其定義如下:

struct file ;
當對檔案進行讀寫等操作時,通過f_op指標呼叫該檔案所屬的檔案系統(比如ext2,fat32,ntfs等)提供的檔案操作函式即可。

同乙個檔案可以被多個程序開啟,乙個程序也可以開啟多個檔案,程序與該程序開啟的檔案(file結構)之間的這種關係在系統是如何來描述的呢?答案在task_struct資料結構中,linux將程序開啟的檔案作為程序的一項資源記錄在程序的task_struct資料結構中:

struct task_struct ;
其中fs指向乙個fs_struct結構,描述了該與該程序有關的檔案系統的資訊,比如程序的當前工作目錄、程序的根目錄、程序替換目錄等;而files指向乙個files_struct結構,描述了該程序開啟的檔案的資訊。我們來看一下files_struct的定義:

/*

* open file table structure

*/struct files_struct ;

前面說過,已開啟的檔案在系統中表現為乙個file結構,files_struct結構中的fd_array指標陣列記錄了該程序開啟的檔案的file結構。當開啟乙個檔案後,我們就可以通過read、write等系統呼叫來對該檔案進行操作了,在呼叫read等系統呼叫時,會傳遞乙個所謂的「檔案描述符」的引數,以read為例,read()系統呼叫的原型如下:

ssize_t read(int fd, void *buf, size_t count);

其中的引數fd即為檔案描述符,那麼這個檔案描述符到底是什麼東東呢,為啥根據這個fd引數就可以確定要操作的檔案呢?關鍵就在於fd_array這個陣列,系統通過fd_array[fd]指標即可確定要操作的檔案,例如fd_arrar[0]指向的file結構代表就是標準輸入裝置。通過file結構中的f_op,我們就可以得到操作該檔案的**,但是如何得到該檔案的內容呢?要找到答案,還是要回到file結構的定義,在file結構中,有乙個f_dentry成員,指向乙個叫做dentry的結構。dentry中記錄著檔案的各種屬性,比如檔名、訪問許可權等,其定義如下:

struct dentry ;
其中d_name記錄著檔名,d_flags記錄著檔案的訪問許可權等資訊。這裡我們需要注意的是d_inode這個成員,該成員是乙個指標,指向inode結構。inode結構中提供了檔案的資料在儲存介質上的位置和分布資訊,從這裡可以看出,dentry和inode反應了檔案的兩個方面,即dentry和inode從兩個不同的角度來描述檔案,其中dentry所代表的是邏輯上的檔案,只關注檔案的屬性,而不關注其儲存,而inode多代表的是物理意義上的檔案,記錄的是其物理上的屬性,它們之間是多對一的關係(即同乙個物理檔案可以有多個檔名)。dentry中還有乙個d_op成員,指向dentry_operations結構,與file_operations相似,該結構也是為了隔離具體檔案系統對目錄的操作差別而引入vfs的,每個具體的檔案系統都會提供自己的dentry_operations。定義如下:

struct dentry_operations ;
其中d_delete用於「刪除檔案」,d_release用於「關閉檔案」,d_compare用於檔名的比較。

其實,,vfs和具體檔案系統的介面除了file_operations和dentry_operations外,還包括一些其他的資料結構,其中最主要的是inode_operations,該結構定義了操作inode的介面。

至此,我們對linux檔案系統有了乙個基本的了解,下圖很好地說明了反應了linux檔案系統的內部結構:

Linux 檔案系統概述

二 檔案系統的型別 三 linux 檔案系統的選擇和安全性 2 ext2 ext3及reiserfs檔案系統的安全性 四 linux 支援的檔案系統 五 檔案系統的特性 六 在linux中,檔案系統的建立和掛載 七 關於本文 八 參考文件 九 相關文件 合理規劃您的硬碟分割槽 2 檔案系統的建立 這...

Linux 檔案系統概述

來自 linuxsir.org 摘要 本文通過檔案系統的定義說起,然後通過引文簡單的介紹了一下檔案系統型別 對linux常用的ext2 ext3及reiserfs 根據本人使用經驗也泛泛的談了談,但並不是專業的。如何閱讀本文,還是用mks理論告訴我們的方法 一分為二,邊看邊批吧 目錄索引 一 什麼是...

Linux檔案系統概述

類似於windows的各個盤,linux系統也可以將磁碟 flash等儲存裝置劃分為若干個分割槽,在不同分割槽存放不同類別的檔案 檔案系統此時指的是分割槽上檔案的集合 與windows的c盤類似,linux一樣要在乙個分割槽上存放系統啟動所必需的檔案,如核心映像檔案 在嵌入式中,核心一般單獨存放在乙...