1. 程式人生 > >從檔案 I/O 看 Linux 的虛擬檔案系統

從檔案 I/O 看 Linux 的虛擬檔案系統

1 引言

Linux 中允許眾多不同的檔案系統共存,如 ext2, ext3, vfat 等。通過使用同一套檔案 I/O 系統呼叫即可對 Linux 中的任意檔案進行操作而無需考慮其所在的具體檔案系統格式;更進一步,對檔案的操作可以跨檔案系統而執行。如圖 1 所示,我們可以使用 cp 命令從 vfat 檔案系統格式的硬碟拷貝資料到 ext3 檔案系統格式的硬碟;而這樣的操作涉及到兩個不同的檔案系統。


圖 1. 跨檔案系統的檔案操作
圖片示例_跨檔案系統的檔案操作

“一切皆是檔案”是 Unix/Linux 的基本哲學之一。不僅普通的檔案,目錄、字元裝置、塊裝置、套接字等在 Unix/Linux 中都是以檔案被對待;它們雖然型別不同,但是對其提供的卻是同一套操作介面。


圖 2. 一切皆是檔案
圖片示例_一切皆是檔案

而虛擬檔案系統正是實現上述兩點 Linux 特性的關鍵所在。虛擬檔案系統(Virtual File System, 簡稱 VFS),是 Linux 核心中的一個軟體層,用於給使用者空間的程式提供檔案系統介面;同時,它也提供了核心中的一個抽象功能,允許不同的檔案系統共存。系統中所有的檔案系統不但依賴 VFS 共存,而且也依靠 VFS 協同工作。

為了能夠支援各種實際檔案系統,VFS 定義了所有檔案系統都支援的基本的、概念上的介面和資料結構;同時實際檔案系統也提供 VFS 所期望的抽象介面和資料結構,將自身的諸如檔案、目錄等概念在形式上與VFS的定義保持一致。換句話說,一個實際的檔案系統想要被 Linux 支援,就必須提供一個符合VFS標準的介面,才能與 VFS 協同工作。實際檔案系統在統一的介面和資料結構下隱藏了具體的實現細節,所以在VFS 層和核心的其他部分看來,所有檔案系統都是相同的。圖3顯示了VFS在核心中與實際的檔案系統的協同關係。


圖3. VFS在核心中與其他的核心模組的協同關係
圖片示例_VFS在核心中與其他的核心模組的協同關係

VFS即虛擬檔案系統是Linux檔案系統中的一個抽象軟體層;因為它的支援,眾多不同的實際檔案系統才能在Linux中共存,跨檔案系統操作才能實現。VFS藉助它四個主要的資料結構即超級塊、索引節點、目錄項和檔案物件以及一些輔助的資料結構,向Linux中不管是普通的檔案還是目錄、裝置、套接字等都提供同樣的操作介面,如開啟、讀寫、關閉等。只有當把控制權傳給實際的檔案系統時,實際的檔案系統才會做出區分,對不同的檔案型別執行不同的操作。由此可見,正是有了VFS的存在,跨檔案系統操作才能執行,Unix/Linux中的“一切皆是檔案”的口號才能夠得以實現。

從本質上講,檔案系統是特殊的資料分層儲存結構,它包含檔案、目錄和相關的控制資訊。為了描述 這個結構,Linux引入了一些基本概念:

檔案 一組在邏輯上具有完整意義的資訊項的系列。在Linux中,除了普通檔案,其他諸如目錄、裝置、套接字等 也以檔案被對待。總之,“一切皆檔案”。

目錄 目錄好比一個資料夾,用來容納相關檔案。因為目錄可以包含子目錄,所以目錄是可以層層巢狀,形成 檔案路徑。在Linux中,目錄也是以一種特殊檔案被對待的,所以用於檔案的操作同樣也可以用在目錄上。

目錄項 在一個檔案路徑中,路徑中的每一部分都被稱為目錄項;如路徑/home/source/helloworld.c中,目錄 /, home, source和檔案 helloworld.c都是一個目錄項。

索引節點 用於儲存檔案的元資料的一個數據結構。檔案的元資料,也就是檔案的相關資訊,和檔案本身是兩個不同 的概念。它包含的是諸如檔案的大小、擁有者、建立時間、磁碟位置等和檔案相關的資訊。

超級塊 用於儲存檔案系統的控制資訊的資料結構。描述檔案系統的狀態、檔案系統型別、大小、區塊數、索引節 點數等,存放於磁碟的特定扇區中。

關於檔案系統的三個易混淆的概念:

建立 以某種方式格式化磁碟的過程就是在其之上建立一個檔案系統的過程。建立文現系統時,會在磁碟的特定位置寫入 關於該檔案系統的控制資訊。

註冊 向核心報到,宣告自己能被核心支援。一般在編譯核心的時侯註冊;也可以載入模組的方式手動註冊。註冊過程實 際上是將表示各實際檔案系統的資料結構struct file_system_type 例項化。

安裝 也就是我們熟悉的mount操作,將檔案系統加入到Linux的根檔案系統的目錄樹結構上;這樣檔案系統才能被訪問。

VFS依靠四個主要的資料結構和一些輔助的資料結構來描述其結構資訊,這些資料結構表現得就像是物件; 每個主要物件中都包含由操作函式表構成的操作物件,這些操作物件描述了核心針對這幾個主要的物件可以進行的操作。

相關推薦

檔案 I/O Linux虛擬檔案系統

1 引言Linux 中允許眾多不同的檔案系統共存,如 ext2, ext3, vfat 等。通過使用同一套檔案 I/O 系統呼叫即可對 Linux 中的任意檔案進行操作而無需考慮其所在的具體檔案系統格式;更進一步,對檔案的操作可以跨檔案系統而執行。如圖 1 所示,我們可以使用

C++---檔案I/O,C++裡對檔案的操作--例子--檔案的複製

依然還是從一個程式說起:將一個檔案複製到另一個檔案 C語言來實現: #include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]){ FILE *in,*out; int ch;//gets

檔案I/O-002.lseek空洞檔案

/* 製造空洞檔案,空洞的部分寫為0 od -c file.hole od觀察檔案的實際內容,od -c 以字元形式列印 */ #include <unistd.h> #include <fcntl.h> #include <stdlib.h&

C標準庫I/OLinux檔案I/O

I/O分類:     有兩種I/O,一是檔案I/O,而我們c語言的封裝叫標準I/O,他們有什麼區別那?顯然標準I/O是基於檔案I/O的,標準IO呼叫了檔案IO,也優化了檔案IO,例如引入快取機制。     所以C標準

Linux環境程式設計-檔案I/O

這一章的IO是基礎IO,不帶緩衝的IO,每個read和write都呼叫核心中的一個系統呼叫,包含open,read,write,lseek以及close幾個函式。 只要設計多個程序間的共享資源,原子操作就很重要,這一章通過檔案IO與相關函式來討論,進一步討論多個

Linux 系統程式設計學習-檔案I/O操作

一、非緩衝檔案操作 執行非緩衝檔案操作後,應用程式將立即獲取或傳送資料,非緩衝檔案操作的函式只有:read(),write()。 從檔案中將資訊講到到指定的記憶體區域中read(檔案識別符號,記憶體塊指標,記憶體塊長度); 返回值是實際讀取的長度,沒有讀取到資料返回0,錯誤

linux系統程式設計之檔案I/O

一、檔案描述符              linux系統中,所有開啟的檔案都對應一個數字,這個數字由系統來分配,稱為檔案描述符。        PCB程序控制塊裡有檔案描述符表,以陣列形式存放於核心區。         一個程序預設開啟3個檔案描述符  STDIN_FILE

Linux系統檔案I/O程式設計(二)---檔案鎖函式

檔案鎖     上一節:http://blog.csdn.net/mybelief321/article/details/8989755講述的5個基本函式函式open()、read()、write()、lseek()和close()實現的檔案的開啟、讀/寫等操作,本節將討論

Linux 之 POSIX 檔案 I/O 操作函式

(1)檔案描述符與檔案流轉換操作 /*成功返回檔案描述符,失敗返回-1*/ int fileno(FILE* stream); /*成功返回檔案流,失敗返回NULL*/ FILE* fdopen(int fd,char* mode); (2)修改檔案描

[溫故而知新] 《Linux/Unix系統程式設計手冊》——檔案I/O

本文對檔案IO這一塊做一些梳理,記錄思考的一些問題和一些待解決的問題,後續會繼續更新。 I hear and I forget,I see and I remember,I do and I understand. Part 1 :通用I

Linux系統檔案I/O程式設計(一)---open()等基本函式

Linux檔案I/O系統概述     虛擬檔案系統(VFS)     Linux系統成功的關鍵因素之一就是具有與其他作業系統和諧共存的能力。Linux系統的檔案系統由兩層結構構建:第一層是虛擬檔案系統(VFS),第二層是各種不同的具體的檔案系統。     VFS就是把各種具

Linux學習之檔案I/O操作

Linux將所有的硬體裝置也當作檔案來處理,因此,檔案輸入輸出也是對裝置進行操作的基礎。檔案的IO有兩種: (1) 非緩衝檔案操作:            這種操作方式便於對較小規模的檔案的讀寫和對實施行要求很高的裝置的資料進行通訊,這類操作是系統呼叫提供的;並且系統只提供

linux檔案I-O操作(系統I-O

我們都知道linux下所有裝置都是以檔案存在的,所以當我們需要用到這些裝置的時候,首先就需要開啟它們,下面我們來詳細瞭解一下檔案I/O操作。 用到的檔案I/O有以下幾個操作:開啟檔案、讀檔案、寫檔案、關閉檔案等,對應用到的函式有:open、read、write、close、

檔案I/O相關函式

open()和openat()函式: #include <fcntl.h> // 成功返回檔案描述符,出錯返回-1 int open(const char *path, int oflag, ... /* mode_t mode */); int openat(int fd, const

[Unix環境高階程式設計] 檔案I/O

1.引言 UNIX系統中的大多數檔案I/O只需要用到5個函式:open、read、write、lseek以及close,這裡所涉及到的函式經常被稱為不帶緩衝的I/O1。只要涉及在多個程序之間共享資源,原子操作的概念就變得非常重要,我們將通過I/O和open函式的引數來討論此概念,dup、

第二十章:非同步和檔案I/O.(六)

非同步儲存程式設定正如您在第6章“按鈕單擊”中發現的那樣,您可以將程式設定儲存在Application類維護的名為Properties的字典中。您在“屬性”字典中放置的任何內容都將在程式進入睡眠狀態時儲存,並在程式恢復或重新啟動時恢復。有時在更改時儲存此字典中的設定很方便,有時候等到在App類中呼叫OnSle

sysbench的CPU,檔案I/O,OLTP三種基準測試

sysbench是一款多執行緒系統壓測工具,可以執行多種型別的基準測試,它不僅設計用來測試資料的效能,也可以測試執行資料庫的服武器的效能 一,CPU基準測試 最典型的子系統測試 該測試使用64位整數,測試計算素數直到某個最大值所需要的時間 GNU/Linux伺服器: 檢視CPU配

第二十章:非同步和檔案I/O.(九)

跨平臺檔案I / O的第一個鏡頭在一般情況下,您將使用DependencyService為您的Xamarin.Forms應用程式提供對檔案I / O功能的訪問。從之前對DependencyService的探索中可以瞭解到,您可以在Portable Class Library專案中的介面中定義所需的函式,而實現

python檔案I/O

常用的有:讀取鍵盤輸入,開啟關閉檔案 一、讀取鍵盤輸入(這裡只說2.X版本的用法吧) raw_input() input() 先說raw_input() ,將輸入作為字串看待,返回字串型別,不顯示結尾的符號 input(),可接收一個python表示式返回結果,也可以顯示鍵盤輸入的字元 二、開啟關

Python入門(十)檔案I/O

Python 檔案I/O 本章只講述所有基本的的I/O函式,更多函式請參考Python標準文件。 列印到螢幕 最簡單的輸出方法是用print語句,你可以給它傳遞零個或多個用逗號隔開的表示式。此函式把你傳遞的表示式轉換成一個字串表示式,並將結果寫到標準輸出如下: #!/usr/