Linux 檔案系統模型

2022-02-08 21:35:56 字數 2842 閱讀 3518

在 linux 環境下有過一些經歷的同學可能都會遇到乙個問題,這個問題就是往機器上插入 u盤 或者其他外接裝置的時候,居然經常沒有反應,上網查詢之後別人會教你怎麼用幾條命令然後你就可以像操作正常檔案一樣操作這些裝置了(當然,現在很多流行的桌面linux環境例如 ubuntu/centos 都支援自動掛載了)。

在 linux 中,為了適應不同的格式的檔案系統(ext4/nfs),也就是說可以支援同時使用不同檔案系統的檔案,做了一層抽象,也就是所謂的 vfs(virtual file system),整個 linux 的檔案層級可以這麼抽象得概括一下:

vfs 對上層應用程式和程序隱藏了底層複雜的各種檔案系統細節,也就是程序不需要知道檔案系統是存放在本地的硬碟或者是 u盤 還是乙個網路的檔案系統,同時,vfs 對下層提供了一系列抽象的介面,從而使得上層應用可以使用同一的介面從而訪問不同**的裝置。需要注意的是,因為 vfs 是乙個抽象的概念,所以很多裡面的元素都是和具體的檔案系統名稱相同,在本文中,如果沒有將具體的檔案系統,那麼所說的名詞(例如 inode/superblock)都是描述 vfs,而不是具體的檔案系統。

在 vfs 中,有四個重要的資料結構,他們分別是:

所以當我們在程序中開啟一些檔案的時候,記憶體中的物件模型應該是這樣的:

所謂的具體檔案系統就是在我們平時使用過程中,當新裝乙個 os 或者新加了一塊儲存,一般情況下都是不能直接掛載使用的,因為你的磁碟沒有設定檔案系統,即使掛載上去了,我們的 os 也是不能識別的。那麼,特殊情況是什麼呢,那就是你想象這麼一種情況,你有兩台配置什麼的一模一樣的機器 a 和 b,一台在家裡,一台在其他場所,你想在使用兩台機器的時候都使用同乙個環境(os/soft等等),那麼你在任意一台機器上安裝配置好環境,然後在兩條機器上都通用這個安裝了你需要環境的磁碟,這樣,你就經常性的在兩台機器中往返攜帶磁碟,而且機器 a 上工作完好的磁碟直接拔下來裝到機器 b 中也是正常工作的,並不需要你在機器 b 上又重新設定一下檔案系統,雖然你可能覺得這個例子有點傻,但是,這個在雲環境確實很方便的實現。

ok,話不多說,來看看 linux 中乙個經典的 ext2 檔案系統。在 ext2 檔案系統中,這個檔案系統所管理的磁碟(可以不是乙個完整的磁碟,例如磁碟大小為 1t,這裡可以只給 40g)被劃分為均等大小的 block,而 block 的大小是可變的,通俗點說/info/liuliqiang/da/info/liuliqiang/db都是使用的 ext2 的檔案系統,但是 da 的 block 大小是 1024 byte,而 db 的 block 大小卻是 4096 byte。

在 ext2 檔案系統中,磁碟位置中最開始的 1024 bytes 是 superblock,也就說 superblock 的大小是 1024 bytes。有乙個屬性需要我們注意,那就是 magic,ext2 檔案系統和 ext3 檔案系統的 magic 都是 0xef53,這說明了 ext2 和 ext3 的相容性很好!,還有乙個屬性叫block_size,它用於表示這個 ext2 檔案系統中 block 的大小,前面說了,這是可變的。

ext2 的檔案系統被均分為了block,那麼我們要怎麼儲存檔案呢?接著往下看,在 ext2 檔案系統中,不同數量的block被聚成了所謂的block group,每個block group都會對應乙個block group description,這些group description會被放在一起,位置緊跟在 superblock後面。

每個block group都包含inode tableblock bitmap,通過這個inode table,我們就可以得到乙個個的inode了,然後inode裡面儲存了block的指標資訊,這樣我們就得到了真實的磁碟資料。這些inode tableblock bitmap等資訊都是放在block group的開頭,一塊接著一塊,就組成了所謂的 ext2 檔案系統。

看完抽象的虛擬檔案系統和真實的檔案系統,那麼我們是時候結合兩者進行統一得看一看了。

當我們系統啟動載入的時候,會構建乙個 dentry 的目錄樹,這個目錄樹和具體的 os 目錄樹是兩碼事,預設建立出來的時候的目錄樹只有乙個真實的 rootfs 檔案系統,然後目錄樹中的其他目錄都是為以後掛載其他真實的檔案系統提供的掛載點。例如我們的 ext2 檔案系統就是掛載到其中的某個目錄中,這樣就掛載上了。

然後是開啟檔案,開啟檔案之後,我們建立了這個檔案的 fd,fd 會對應到 dentry 和 vfs i-node,通過 dentry 我們就可以找到對應的檔案系統(因為它是掛載在 dentry 中的),然後通過 vfs i-node 我們就可以獲取到檔案的具體內容,這樣就完成了整個 vfs 到 ext2 真實檔案系統的轉換。

本文從概括性的角度描述了 linux 下,檔案操作的抽象與具體的結合,但是,對於 linux 的 io 來說,這還只是冰山一角,而我再後續的文章中也將結合自身的思考和認識,更多得挖掘一些細節。最後,感謝下面 reference 的這些文章的幫助,讓我了解得更清楚一些。

unix環境高階程式設計

現代作業系統(第3版)

linux 虛擬系統檔案交換器剖析

從檔案 i/o 看 linux 的虛擬檔案系統

解析 linux 中的 vfs 檔案系統機制

ext2 檔案系統的硬碟布局

linux 檔案系統 Linux 檔案系統結構介紹

ubuntu 像所有類unix系統一樣 在分層樹中組織檔案,其中的關係就像父母和孩子一樣。目錄可以包含其他目錄以及常規檔案,它們是樹的 葉子 樹的任何元素都可以通過路徑名引用 絕對路徑以字元 標識根目錄,其中包含所有其他目錄和檔案 開頭,然後列出必須遍歷以到達該元素的每個子目錄,每個子目錄用 符號分...

Linux檔案系統

linux目錄結構 根目錄 bin 可執行檔案目錄 boot 核心引導檔案 vmlinuz,initrd.img等 dev 裝置檔案儲存目錄,應用程式對這些檔案讀寫和控制可訪問實際裝置 etc 系統配置和一些伺服器配置檔案的位置,如帳號及密碼配置檔案。home 普通使用者目錄 lib 庫檔案目錄 l...

Linux檔案系統

之前對磁碟分割槽已經有了詳細的描述,這篇主要介紹檔案系統 linux的檔案系統是出了名的 下面就 大概介紹下 可以把檔案系統大概分成 superblock inodeblock datablock 三部分 superblock superblock記錄檔案系統的基本資訊比如每塊資料塊的大小,空閒磁碟...