Linux下的文件系統

一、Linux下文件的內函

l  普通文件:例如保存在磁盤上的C文件、可執行的文件以及目錄等,這種文件的特性是數據在存儲設備上存放,內核提供了對數據的抽象訪問,此種文件爲一種字節流,訪問接口完全獨立於在磁盤上的存儲數據。

l  字符設備文件:是一種能夠像文件一樣被訪問的設備,例如控制檯、串口等。

l  塊設備文件:磁盤是此類設備文件的典型代表,與普通文件的區別是操作系統對數據的訪問進行的重新的格式設計。

l  Socket文件:它是UNIX中通過網絡進行通信的方式,對網絡的訪問可以通過文件描符的抽象實現,訪問網絡和訪問普通文件相似。

Linux中用戶空間對各種文件的操作是類似的,因爲虛擬文件系統VFS提供了同一套的API

二、普通文件

普通文件是指在硬盤、CDU盤等存儲介質上的數據和文件結構。在本節中所指的文件系統是一個狹義的概念產,僅僅按照普通文件在磁盤中的組織方式的不同來區分。

普通文件的概念與Windows下面的文件的概念是相同的。

三、設備文件

Linux下用設備文件來表示所支持設備的,每個設備文件除了設備名,還有3個屬性,即類型、主設備號、次設備號。

l  設備類型:設備屬性的第一個字符是這個設備文件的類型。第一個字符爲c,表明這個設備是一個字符設備文件。第一個字符爲b,表明這個設備是一個塊設備文件。Sdb1的第1個字符爲b,可知它是一個塊設備文件。

l  主設備號:每一個設備文件都有一個“主設備號”,使用ls –l命令輸出的第5個字段即爲主設備號。主設備號是表示系統存取這個設備的的“內核驅動”。驅動程序是UNIX內核中代碼的一部分,其作用是用來控制一種特殊設備的輸入輸出。大多數的UNIX操作系統都有多種設備驅動。Lsdev命令可以列出當前內核中配置的驅動程序,和這些驅動程序對應的設備號。

l  次設備號:每一個設備文件都有一個次設備號。“次設備號”是一個24位的16進制數字,其定義了這個設備在系統中的物理位置。設備存儲選項。

l  設備文件名:設備文件名用於表示設備的名稱,它遵循標準的命令方式,使得設備的分辨更容易。

1、  字符設備與塊設備

字符類型的設備可以一次數據讀寫過程中傳送任意大小的數據,多個字符的訪問是通過多次讀寫來完成的,通常用於訪問連續的字符。例如,終端、打印機、moderm和繪圖儀等設備是字符類型設備。

塊設備文件可以在一次讀寫過程中訪問固定大小的數據,通過塊設備文件進行數據讀寫的時候,系統先從內存的緩衝區中讀寫數據,而不是直接與設備進行數據讀寫,這種訪問方式可以大幅度地提高讀寫性能。常用的塊設備有硬盤、軟盤和CD-ROMRAM類型磁盤。

2、  設備文件的創建

設備文件是通mknod命令來創建的。

其參數有設備文件名NAME、操作模式TYPE、主設備號NAMJOR及設備號MINOR。主設備號和次設備號兩個參數合併成一個16位的無符號短整位,高8位表示主設備號,低8位表示次設備號。可以在include/Linux/major.h文件中找到所支持的主設備號。

設備文件通常位於/dev目錄下。

四、虛擬文件系統VFS

Linux的文件系統是由虛擬文件系統作爲媒介搭建起來的,虛擬文件系統VFSVirtual File Stytle)是由Linux內核層實現的一種架構,爲用戶空間提供統一的文件操作接口。它在內核內部爲不同的真實文件系統提供一致的抽象接口。

用戶應用程序通過系統調用,與內核中的虛擬文件系統交互,操作實際的文件系統和設備。Linux文件系統支持多種類型的文件,對多種類型的文件系統進行了很好的抽象。通過一組相同的系統調用接口,Linux可以在各種設備上實現多種不同的文件系統。

 VFS是文件系統的接口框架。這個組件導出一組接口,然後將它們抽象到各個文件系統,各個文件系統的具體實現方式差異很大。有兩個針對文件系統地象的緩存(inodedentry) ,它們緩存的對象是最近使用過的文件系統。

每個文件系統實現(例如ext2vfat等等)導出一組通用接口,供VFS使用。緩衝區用於緩存文件系統和相關塊設備二者之間的請求。對底層設備驅動程序的讀寫請求會通過緩衝區緩存來傳遞。這就允許在其中緩存請求,減少訪問物理設備的次數,加快訪問速度。以最近使用(LRU)列表的形式管理緩衝區緩存。可以使用sync命令緩衝區緩存中的請求發送到存儲媒體(迫使所有未寫的數據發送到設備驅動程序),進而發送到存儲設備)。

1、  文件系統類型

Linux的文件系統用一組通用對象來表示,這些對象是超級塊(superblock)、節點索引(inode)、目錄結構(dentry)和文件(file)

超級塊是每種文件系統的根,用於描述和維護文件系統的狀態。文件系統中管理的每個對象(文件或目錄)Linux中表示爲一個索引節點inode

Inode包含管理文件系統中的對象所需的所有元數據(包括可以在對象上執行的操作)。另一組結構稱爲dentry,它們用來實現名稱和inode之間的映射,有一個目錄緩存用來保存最近使用的dentry

Dentry還維護目錄和文件之間的關係,支持目錄和文件在文件系統中的移動。VFS文件表示一個打開的文件(保存打開的文件的狀態,像文件的讀偏移量和寫偏移量等)。

Linux的內核中保存系統所支持的文件系統的列表,可以使用一組註冊函數在Linux中動態地添加或刪除文件系統。在註冊新的文件系統時,會把這個文件系統和它的相關信息添加到file_systems列表,這個列表文件是/proc/filesystems

2、  超級塊

超級塊結構(struct super_block,可以從linux/fs.h文件中獲得此結構更多的信息)用來表示一個文件系統。這個結構包含一個文件系統所需要的信息,例如文件系統名稱、文件系統中最大文件的大小以及對inode塊的操作函數等。

Linux系統中每種文件類型都有一個超級塊,例如,如果系統中存在ext2vfat,則存在兩個超級塊,分別表示ext2文件系統和vfat文件系統。

超級塊中的一個重要元素是超級塊操作函數的定義。這個結構定義一組用來管理這個文件系統中的節點索引inode()刪除inodestruct super_operations結構定義在linux/include/linux/fs.h中。Linux文件系統中所支持的每個文件系統都實現一套自己的inode操作方法,這些方法實現超級塊所定義的功能並向VFS層提供通用的抽象。

3、  文件操作

在文件fs.h中定義了文件操作的結構,通常實際的文件系統都要實現對應的操作函數。例如,ext2文件系統實現瞭如下的文件操作,當打開一個ext2格式的文件時,系統調用ext2文件系統註冊的open()函數,即函數generic_file_open()

 

發佈了35 篇原創文章 · 獲贊 14 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章