Linux文件系統(tǒng)解析
時間:2021-08-19 16:35:41
手機看文章
掃描二維碼
隨時隨地手機看文章
[導讀]文件系統(tǒng)定義在計算機出現(xiàn)之前其實就有文件系統(tǒng)的概念了,此時的文件系統(tǒng)指的是用于管理(存儲和檢索)紙質(zhì)文件的系統(tǒng),而在計算機發(fā)明之后,文件系統(tǒng)逐漸指的是管理存儲介質(zhì)的系統(tǒng),它通過簡單的接口給用戶,方便用戶使用存儲設備。在學習Linux的時候,我們通常會看到這樣一句話,Linux中一...
文件系統(tǒng)定義
在計算機出現(xiàn)之前其實就有文件系統(tǒng)的概念了,此時的文件系統(tǒng)指的是用于管理(存儲和檢索)紙質(zhì)文件的系統(tǒng),而在計算機發(fā)明之后,文件系統(tǒng)逐漸指的是管理存儲介質(zhì)的系統(tǒng),它通過簡單的接口給用戶,方便用戶使用存儲設備。在學習 Linux 的時候,我們通常會看到這樣一句話,Linux中一切皆文件,也就是說,不管是普通的文件和目錄,還是包括塊設備、管道、socket等,也都是交給文件系統(tǒng)去管理的。文件系統(tǒng)是操作系統(tǒng)中負責管理持久數(shù)據(jù)的子系統(tǒng),換言之,也就是負責把用戶的文件存到磁盤硬件中,它是一個磁盤上的目錄結(jié)構(gòu),是一個組織文件的方法,并且在一個磁盤上,可以包含一個或者多個文件系統(tǒng)。下面,我們從用戶的角度和操作系統(tǒng)的角度兩個層面來闡述文件系統(tǒng)的相關(guān)概念。用戶角度
要認識 Linux 的文件系統(tǒng),從分區(qū)和目錄結(jié)構(gòu)說起,首先我們先來看下windows,這是大多數(shù)人使用最多的一個操作系統(tǒng),當打開我的電腦的時候,映入眼簾的是大致是這樣一個一張圖:也就是說在 windows 下,磁盤被分為了 C 盤, D 盤。。。。這樣的一個目錄結(jié)構(gòu)。那對于?Linux
呢,它的目錄結(jié)構(gòu)是長啥樣,它有一個根目錄,而系統(tǒng)下的所有目錄都是從根目錄分離出去的,我們可以在?Ubuntu
終端運行如下命令來查看Linux
的目錄結(jié)構(gòu)。tree?-L?1?/
上述中,tree
表示將當前目錄以樹的結(jié)構(gòu)展示,-L
表示的是要顯示當目錄的第幾層,1
表示的是要顯示到第一層,最后面的?/
表示的也就是Linux
的根目錄,也就是說當前命令就是顯示根目錄下第一層目錄的信息,最終得到的結(jié)果如下所示:為了更好地理解每個目錄所代表的意思,我們看如下所示的內(nèi)容:/
|----bin?????---------------->?文件系統(tǒng)的起始位置,稱之為根
|----boot????---------------->?存放系統(tǒng)啟動時讀取的文件,包括系統(tǒng)核心文件
|----dev?????---------------->?存放設備文件接口,如打印機,硬盤等外圍設備
|----etc?????---------------->?存放與系統(tǒng)設置和管理相關(guān)的文件,如用戶賬號、密碼等
|????|
|----home????----------------->?存放用戶專屬目錄
|----lib?????----------------->?存放一些共享的函數(shù)庫
|----misc????----------------->?一個空目錄,供管理員存放公共雜物
|----proc????----------------->?存放系統(tǒng)核心和執(zhí)行程序之間的信息
|----root????----------------->?系統(tǒng)管理員(超級用戶)專用目錄
|----sbin????----------------->?與?/bin?類似,存放用于系統(tǒng)引導和管理命令,通常供?root?使用?
|----tmp?????----------------->?臨時目錄,供任何用戶存放臨時文件
|----usr?????----------------->?此目錄包含許多子目錄,用來存放系統(tǒng)命令和程序等信息
|----var?????----------------->?存放經(jīng)常變動的文件,如日志文件,臨時文件,電子郵箱
說到這,就有必要再說一下?Linux
下的路徑問題了,在Linux
中,Linux
的路徑分為絕對路徑和相對路徑- 絕對路徑:指的是一個文件或者目錄從根目錄開始的完整的路徑
- 相對路徑:是指一個文件或者目錄相對于向前工作目錄的路徑
- 任何不以
/
和~
開始的路徑均為相對路徑
Linux
的文件類型的,Linux 內(nèi)一切皆文件,那么對于 Linux 來說,其具有哪些文件類型呢,其主要有如下四種:- 普通文件
- 目錄文件
- 鏈接文件:其作用類似于?
windows
下的快捷方式,它本身不包含內(nèi)容,而是指向其他的文件或目錄 - 設備文件:存放在?
/dev
目錄下,如:hda,hdb,sda。。。
Linux
啟動的時候,首先掛載的是根文件系統(tǒng),之后可以自動或者手動掛載其他文件系統(tǒng),這些文件系統(tǒng)要掛載到掛載點上,與虛擬文件系統(tǒng)和通用塊設備層建立聯(lián)系。掛載,指的就是將設備文件中的頂級目錄連接到 Linux 根目錄下的某一目錄(最好是空目錄),訪問此目錄就等同于訪問設備文件。上述就是基于用戶的角度對文件系統(tǒng)進行了一個概述,接下來從操作系統(tǒng)的角度,更進一步地闡述操作系統(tǒng)。
操作系統(tǒng)角度
文件系統(tǒng)的層次
在上述中,闡述掛載的時候說到一個概念,就是說?Linux
在啟動的時候,首先掛載的是根文件系統(tǒng),然后再自動或者手動掛載其他文件系統(tǒng),這也是Linux
中支持不同文件系統(tǒng)的原因,而支持各種不同文件系統(tǒng)的這種機制又是什么呢?說到這里,就有必要提到Linux
的虛擬文件系統(tǒng)了,再敘述它的概念之前,我們先以宏觀的角度來看一下?Linux
下的文件系統(tǒng)的一個結(jié)構(gòu):由上圖可以知道,整個文件系統(tǒng)體系分為了三個層面,用戶層,內(nèi)核層,硬件層,用戶層是通過API通過系統(tǒng)調(diào)用調(diào)用的方式訪問虛擬文件系統(tǒng)。在內(nèi)核層,我們可以看到虛擬文件系統(tǒng)下連接了各種類型的文件系統(tǒng),其是對不同的文件系統(tǒng)的抽象,為上層應用提供了統(tǒng)一的 API 接口;上圖內(nèi)核層還有一層是各個文件系統(tǒng)之下的一層,這一層的作用是隱藏了不同硬件設備之間的細節(jié),為內(nèi)核提供了統(tǒng)一的 IO 操作接口。下面我們對整個文件系統(tǒng)從下到上對各個層的作用進行一個闡述:- Device Driver(硬盤驅(qū)動):常見的硬盤類型有
PATA,SATA
,在Linux
中,對于硬盤提供的驅(qū)動模塊一般都存放在內(nèi)核目錄樹drivers/ata
中,而對于一般通用的硬盤驅(qū)動,可能會直接被編譯到內(nèi)核中。 - 通用塊設備層(General Block Device Layer):不同的硬盤,會提供不同的 IO 接口,對于內(nèi)核來講,這種雜亂的接口是不利于管理的,因此就把這些接口進行了抽象,形成了一個統(tǒng)一的對外接口,這樣就不管你是什么存儲設備,操作他們的IO接口并沒有什么區(qū)別。
- 文件系統(tǒng)層:目前大多數(shù)
Linux
使用的是ex4
,與此同時,btrfs
也呼之欲出 - 虛擬文件系統(tǒng):正如不同的存儲設備具有不同的 IO 接口,那么不同的文件系統(tǒng)也具有不用的 API,內(nèi)核想實現(xiàn)的是不管是什么文件系統(tǒng),都采用的是相同的 API 進行操作,所以 VFS 就做了一個抽象,提供了統(tǒng)一的 API 接口,使之可以對不同的文件系統(tǒng)采用同樣的操作。
文件的使用
上述中,我們介紹了文件系統(tǒng)的層次,那么基于這樣一個層次,我們又應該如何使用文件呢?下圖是一個使用文件的流程圖:與其對應的代碼也比較簡單:fd?=?open(name,?flag);????/*?打開文件?*/
...
write(fd,?...);???????????/*?寫數(shù)據(jù)?*/
...
close(fd);????????????????/*?關(guān)閉文件?*/
上述就是往一個文件中寫數(shù)據(jù)的步驟,使用open
系統(tǒng)調(diào)用打開文件,open
的參數(shù)中包含文件的路徑名和文件名,使用write
寫數(shù)據(jù),其中write
使用open
所返回的文件描述符,使用完文件后,用close
系統(tǒng)關(guān)閉文件,避免資源的泄露。在打開了一個文件后,操作系統(tǒng)會跟蹤進程打開的所有文件,也就是說操作系統(tǒng)為每個進程維護一個打開文件表,文件表里的每一項代表的是文件描述符,所以說文件描述符是打開文件的標識。操作系統(tǒng)在打開文件表中維護著打開文件的狀態(tài)和信息:- 文件指針:系統(tǒng)跟蹤上次讀寫位置作為當前文件位置的指針,這個指針對于打開文件的某個進程來說是唯一的;
- 文件打開計數(shù)器:文件關(guān)閉時,操作系統(tǒng)必須重用其打開文件表目錄,否則表內(nèi)空間就不夠。因為多個進程可能打開同一個文件,所以系統(tǒng)在刪除打開文件條目之前,必須等待最后一個進程關(guān)閉文件,該計數(shù)器跟蹤打開和關(guān)閉數(shù)量,當該計數(shù)為 0 時,系統(tǒng)關(guān)閉文件,刪除該條目;
- 文件磁盤位置:大多數(shù)文件操作都需要系統(tǒng)修改文件的數(shù)據(jù),該信息保存在內(nèi)存中,以免每個操作都從磁盤中讀??;
- 訪問權(quán)限:每個進程打開文件都需要又一個訪問模式(創(chuàng)建、只讀、讀寫、添加等),該信息保存在進程的打開文件表中。
文件系統(tǒng)的IO類型
根據(jù)文件系統(tǒng)的讀寫差異,可以將IO分為四種類型:- 緩沖 I/O:是指利用標準庫緩存來加速文件的訪問,而標準庫內(nèi)部再通過系統(tǒng)調(diào)度訪問文件。
- 非緩沖I/O:是指直接通過系統(tǒng)調(diào)用來訪問文件,不再經(jīng)過標準庫緩存
此處標準庫緩存指的是利用棧、隊列等一些數(shù)據(jù)結(jié)構(gòu)進行的資源調(diào)度,而不是頁緩存。無論是否是緩沖IO,都會通過系統(tǒng)調(diào)用頁緩存來減少IO次數(shù)根據(jù)是否利用操作系統(tǒng)的頁緩存,可以把文件I/O分為直接I/O與非直接I/O
- 直接I/O:是指跳過操作系統(tǒng)的頁緩存,直接跟文件系統(tǒng)交互來訪問文件
- 非直接I/O:文件讀寫的時候,先要經(jīng)過系統(tǒng)的頁緩存,然后再由內(nèi)核或者是額外的系統(tǒng)調(diào)用,真正寫入存儲設備
通常,我們的 IO 都是非直接I/O根據(jù)應用程序是都阻塞自身運行,可以把文件 I/O 分為阻塞 I/O 和非阻塞 I/O
- 阻塞I/O,是指應用程序執(zhí)行 I/O 操作之后,如果沒有獲得響應,就會阻塞當前的線程,自然不能執(zhí)行其他任務
- 非阻塞I/O,是指應用程序執(zhí)行 I/O 操作之后,不會阻塞當前的線程,可以繼續(xù)執(zhí)行其他的任務,隨后再通過輪詢或者事件通知的形式,獲得調(diào)用的結(jié)果
通常情況下I/O都是阻塞的。網(wǎng)絡編程中是非阻塞的I/O,用在網(wǎng)絡套接字的 I/O 中根據(jù)是否等待響應結(jié)果,把文件分為同步IO和異步IO
- 同步IO:應用程序在執(zhí)行IO操作之后,要一直等到整個IO完成后,才獲得 IO 響應
- 異步IO:是指應用程序在執(zhí)行IO操作之后,不用等待完成,可以繼續(xù)做之后的事情,等到 IO 完成的時候,會通過事件通知的方式,告訴應用程序
文件的存儲
Linux
中所有文件都有一個唯一與之對應的索引節(jié)點,索引節(jié)點記錄了文件的元數(shù)據(jù),操作系統(tǒng)不是通過文件名,而是通過索引節(jié)點來管理文件,用目錄項來描述文件之間的關(guān)系。索引節(jié)點,也被稱之為是inode,用來記錄文件的元數(shù)據(jù),元數(shù)據(jù)就包括:node編號、文件大小、訪問權(quán)限、修改日期、數(shù)據(jù)的位置等。目錄項,也被稱為dentry
,用來記錄文件的名字、索引節(jié)點指針及與其他目錄項的關(guān)聯(lián)關(guān)系。多個關(guān)聯(lián)的目錄項,也就構(gòu)成了文件系統(tǒng)的目錄結(jié)構(gòu)。因此,索引節(jié)點相當?shù)挠谖募闹羔?,目錄項維護著文件的樹型關(guān)系下面是文件存儲各個部分邏輯關(guān)系的一個示意圖:上圖中,超級塊用來存儲著整個文件系統(tǒng)的狀態(tài),索引節(jié)點區(qū)用來存儲索引節(jié)點,數(shù)據(jù)塊區(qū)用來存儲文件的數(shù)據(jù),他們之間的關(guān)系在圖中也很清除了,就不進行贅述了。總結(jié)
Linux
是一個很龐大也很優(yōu)秀的系統(tǒng),在嵌入式行業(yè)也應用廣泛,筆者對于?Linux
的接觸不深,這也是最近對于學習?Linux
文件系統(tǒng)時的一個總結(jié),如果文中出現(xiàn)問題,歡迎各位及時給我提出來呀,我將不勝感激~