溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Linux文件系統(tǒng)基本概念是什么

發(fā)布時(shí)間:2021-11-30 09:25:51 來(lái)源:億速云 閱讀:98 作者:iii 欄目:系統(tǒng)運(yùn)維

這篇文章主要講解了“Linux文件系統(tǒng)基本概念是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Linux文件系統(tǒng)基本概念是什么”吧!

Linux 文件系統(tǒng)基本概念

Linux 在最初的設(shè)計(jì)是 MINIX1 文件系統(tǒng),它只支持 14 字節(jié)的文件名,它的最大文件只支持到 64 MB。在  MINIX 1 之后的文件系統(tǒng)是 ext 文件系統(tǒng)。ext 系統(tǒng)相較于 MINIX 1 來(lái)說(shuō),在支持字節(jié)大小和文件大小上均有很大提升,但是 ext 的速度仍沒(méi)有  MINIX 1 快,于是,ext 2 被開(kāi)發(fā)出來(lái),它能夠支持長(zhǎng)文件名和大文件,而且具有比 MINIX 1 更好的性能。這使他成為 Linux  的主要文件系統(tǒng)。只不過(guò) Linux 會(huì)使用 VFS 曾支持多種文件系統(tǒng)。在 Linux 鏈接時(shí),用戶可以動(dòng)態(tài)的將不同的文件系統(tǒng)掛載倒 VFS 上。

Linux 中的文件是一個(gè)任意長(zhǎng)度的字節(jié)序列,Linux 中的文件可以包含任意信息,比如 ASCII 碼、二進(jìn)制文件和其他類型的文件是不加區(qū)分的。

為了方便起見(jiàn),文件可以被組織在一個(gè)目錄中,目錄存儲(chǔ)成文件的形式在很大程度上可以作為文件處理。目錄可以有子目錄,這樣形成有層次的文件系統(tǒng),Linux  系統(tǒng)下面的根目錄是 / ,它通常包含了多個(gè)子目錄。字符 / 還用于對(duì)目錄名進(jìn)行區(qū)分,例如 「/usr/cxuan」 表示的就是根目錄下面的 usr  目錄,其中有一個(gè)叫做 cxuan 的子目錄。

下面我們介紹一下 Linux 系統(tǒng)根目錄下面的目錄名

  • /bin,它是重要的二進(jìn)制應(yīng)用程序,包含二進(jìn)制文件,系統(tǒng)的所有用戶使用的命令都在這里

  • /boot,啟動(dòng)包含引導(dǎo)加載程序的相關(guān)文件

  • /dev,包含設(shè)備文件,終端文件,USB 或者連接到系統(tǒng)的任何設(shè)備

  • /etc,配置文件,啟動(dòng)腳本等,包含所有程序所需要的配置文件,也包含了啟動(dòng)/停止單個(gè)應(yīng)用程序的啟動(dòng)和關(guān)閉 shell 腳本

  • /home,本地主要路徑,所有用戶用 home 目錄存儲(chǔ)個(gè)人信息

  • /lib,系統(tǒng)庫(kù)文件,包含支持位于 /bin 和 /sbin 下的二進(jìn)制庫(kù)文件

  • /lost+found,在根目錄下提供一個(gè)遺失+查找系統(tǒng),必須在 root 用戶下才能查看當(dāng)前目錄下的內(nèi)容

  • /media,掛載可移動(dòng)介質(zhì)

  • /mnt,掛載文件系統(tǒng)

  • /opt,提供一個(gè)可選的應(yīng)用程序安裝目錄

  • /proc,特殊的動(dòng)態(tài)目錄,用于維護(hù)系統(tǒng)信息和狀態(tài),包括當(dāng)前運(yùn)行中進(jìn)程信息

  • /root,root 用戶的主要目錄文件夾

  • /sbin,重要的二進(jìn)制系統(tǒng)文件

  • /tmp, 系統(tǒng)和用戶創(chuàng)建的臨時(shí)文件,系統(tǒng)重啟時(shí),這個(gè)目錄下的文件都會(huì)被刪除

  • /usr,包含絕大多數(shù)用戶都能訪問(wèn)的應(yīng)用程序和文件

  • /var,經(jīng)常變化的文件,諸如日志文件或數(shù)據(jù)庫(kù)等

在 Linux 中,有兩種路徑,一種是 絕對(duì)路徑(absolute path)  ,絕對(duì)路徑告訴你從根目錄下查找文件,絕對(duì)路徑的缺點(diǎn)是太長(zhǎng)而且不太方便。還有一種是 相對(duì)路徑(relative path)  ,相對(duì)路徑所在的目錄也叫做工作目錄(working directory)。

如果 /usr/local/books 是工作目錄,那么 shell 命令

cp books books-replica

就表示的是相對(duì)路徑,而

cp /usr/local/books/books /usr/local/books/books-replica

則表示的是絕對(duì)路徑。

在 Linux  中經(jīng)常出現(xiàn)一個(gè)用戶使用另一個(gè)用戶的文件或者使用文件樹(shù)結(jié)構(gòu)中的文件。兩個(gè)用戶共享同一個(gè)文件,這個(gè)文件位于某個(gè)用戶的目錄結(jié)構(gòu)中,另一個(gè)用戶需要使用這個(gè)文件時(shí),必須通過(guò)絕對(duì)路徑才能引用到他。如果絕對(duì)路徑很長(zhǎng),那么每次輸入起來(lái)會(huì)變的非常麻煩,所以  Linux 提供了一種 鏈接(link) 機(jī)制。

舉個(gè)例子,下面是一個(gè)使用鏈接之前的圖

Linux文件系統(tǒng)基本概念是什么

以上所示,比如有兩個(gè)工作賬戶 jianshe 和 cxuan,jianshe 想要使用 cxuan 賬戶下的 A 目錄,那么它可能會(huì)輸入  /usr/cxuan/A ,這是一種未使用鏈接之后的圖。

使用鏈接后的示意如下

Linux文件系統(tǒng)基本概念是什么

現(xiàn)在,jianshe 可以創(chuàng)建一個(gè)鏈接來(lái)使用 cxuan 下面的目錄了。‘

當(dāng)一個(gè)目錄被創(chuàng)建出來(lái)后,有兩個(gè)目錄項(xiàng)也同時(shí)被創(chuàng)建出來(lái),它們就是 . 和 ..  ,前者代表工作目錄自身,后者代表該目錄的父目錄,也就是該目錄所在的目錄。這樣一來(lái),在 /usr/jianshe 中訪問(wèn) cxuan 中的目錄就是  ../cxuan/xxxLinux  文件系統(tǒng)不區(qū)分磁盤的,這是什么意思呢?一般來(lái)說(shuō),一個(gè)磁盤中的文件系統(tǒng)相互之間保持獨(dú)立,如果一個(gè)文件系統(tǒng)目錄想要訪問(wèn)另一個(gè)磁盤中的文件系統(tǒng),在 Windows  中你可以像下面這樣。

Linux文件系統(tǒng)基本概念是什么

兩個(gè)文件系統(tǒng)分別在不同的磁盤中,彼此保持獨(dú)立。

而在 Linux 中,是支持掛載的,它允許一個(gè)磁盤掛在到另外一個(gè)磁盤上,那么上面的關(guān)系會(huì)變成下面這樣

Linux文件系統(tǒng)基本概念是什么

掛在之后,兩個(gè)文件系統(tǒng)就不再需要關(guān)心文件系統(tǒng)在哪個(gè)磁盤上了,兩個(gè)文件系統(tǒng)彼此可見(jiàn)。

Linux 文件系統(tǒng)的另外一個(gè)特性是支持  加鎖(locking)。在一些應(yīng)用中會(huì)出現(xiàn)兩個(gè)或者更多的進(jìn)程同時(shí)使用同一個(gè)文件的情況,這樣很可能會(huì)導(dǎo)致競(jìng)爭(zhēng)條件(race  condition)。一種解決方法是對(duì)其進(jìn)行加不同粒度的鎖,就是為了防止某一個(gè)進(jìn)程只修改某一行記錄從而導(dǎo)致整個(gè)文件都不能使用的情況。

POSIX  提供了一種靈活的、不同粒度級(jí)別的鎖機(jī)制,允許一個(gè)進(jìn)程使用一個(gè)不可分割的操作對(duì)一個(gè)字節(jié)或者整個(gè)文件進(jìn)行加鎖。加鎖機(jī)制要求嘗試加鎖的進(jìn)程指定其「要加鎖的文件,開(kāi)始位置以及要加鎖的字節(jié)」

Linux  系統(tǒng)提供了兩種鎖:「共享鎖和互斥鎖」。如果文件的一部分已經(jīng)加上了共享鎖,那么再加排他鎖是不會(huì)成功的;如果文件系統(tǒng)的一部分已經(jīng)被加了互斥鎖,那么在互斥鎖解除之前的任何加鎖都不會(huì)成功。為了成功加鎖、請(qǐng)求加鎖的部分的所有字節(jié)都必須是可用的。

在加鎖階段,進(jìn)程需要設(shè)計(jì)好加鎖失敗后的情況,也就是判斷加鎖失敗后是否選擇阻塞,如果選擇阻塞式,那么當(dāng)已經(jīng)加鎖的進(jìn)程中的鎖被刪除時(shí),這個(gè)進(jìn)程會(huì)解除阻塞并替換鎖。如果進(jìn)程選擇非阻塞式的,那么就不會(huì)替換這個(gè)鎖,會(huì)立刻從系統(tǒng)調(diào)用中返回,標(biāo)記狀態(tài)碼表示是否加鎖成功,然后進(jìn)程會(huì)選擇下一個(gè)時(shí)間再次嘗試。

加鎖區(qū)域是可以重疊的。下面我們演示了三種不同條件的加鎖區(qū)域。

Linux文件系統(tǒng)基本概念是什么

如上圖所示,A 的共享鎖在第四字節(jié)到第八字節(jié)進(jìn)行加鎖

Linux文件系統(tǒng)基本概念是什么

如上圖所示,進(jìn)程在 A 和 B 上同時(shí)加了共享鎖,其中 6 - 8 字節(jié)是重疊鎖

Linux文件系統(tǒng)基本概念是什么

如上圖所示,進(jìn)程 A 和 B 和 C 同時(shí)加了共享鎖,那么第六字節(jié)和第七字節(jié)是共享鎖。

如果此時(shí)一個(gè)進(jìn)程嘗試在第 6 個(gè)字節(jié)處加鎖,此時(shí)會(huì)設(shè)置失敗并阻塞,由于該區(qū)域被 A B C 同時(shí)加鎖,那么只有等到 A B C  都釋放鎖后,進(jìn)程才能加鎖成功。

Linux 文件系統(tǒng)調(diào)用

許多系統(tǒng)調(diào)用都會(huì)和文件與文件系統(tǒng)有關(guān)。我們首先先看一下對(duì)單個(gè)文件的系統(tǒng)調(diào)用,然后再來(lái)看一下對(duì)整個(gè)目錄和文件的系統(tǒng)調(diào)用。

為了創(chuàng)建一個(gè)新的文件,會(huì)使用到 creat 方法,注意沒(méi)有 e。

?這里說(shuō)一個(gè)小插曲,曾經(jīng)有人問(wèn) UNIX 創(chuàng)始人 Ken Thompson,如果有機(jī)會(huì)重新寫 UNIX ,你會(huì)怎么辦,他回答自己要把 creat 改成  create ,哈哈哈哈。?

這個(gè)系統(tǒng)調(diào)用的兩個(gè)參數(shù)是文件名和保護(hù)模式

fd = creat("aaa",mode);

這段命令會(huì)創(chuàng)建一個(gè)名為 aaa 的文件,并根據(jù) mode 設(shè)置文件的保護(hù)位。這些位決定了哪個(gè)用戶可能訪問(wèn)文件、如何訪問(wèn)。

creat 系統(tǒng)調(diào)用不僅僅創(chuàng)建了一個(gè)名為 aaa 的文件,還會(huì)打開(kāi)這個(gè)文件。為了允許后續(xù)的系統(tǒng)調(diào)用訪問(wèn)這個(gè)文件,這個(gè) creat 系統(tǒng)調(diào)用會(huì)返回一個(gè)  非負(fù)整數(shù), 這個(gè)就叫做 文件描述符(file descriptor),也就是上面的 fd。

如果在已經(jīng)存在的文件上調(diào)用了 creat 系統(tǒng)調(diào)用,那么該文件中的內(nèi)容會(huì)被清除,從 0 開(kāi)始。通過(guò)設(shè)置合適的參數(shù),open  系統(tǒng)調(diào)用也能夠創(chuàng)建文件。

下面讓我們看一看主要的系統(tǒng)調(diào)用,如下表所示

系統(tǒng)調(diào)用描述
fd = creat(name,mode)一種創(chuàng)建一個(gè)新文件的方式
fd = open(file, ...)打開(kāi)文件讀、寫或者讀寫
s = close(fd)關(guān)閉一個(gè)打開(kāi)的文件
n = read(fd, buffer, nbytes)從文件中向緩存中讀入數(shù)據(jù)
n = write(fd, buffer, nbytes)從緩存中向文件中寫入數(shù)據(jù)
position = lseek(fd, offset, whence)移動(dòng)文件指針
s = stat(name, &buf)獲取文件信息
s = fstat(fd, &buf)獲取文件信息
s = pipe(&fd[0])創(chuàng)建一個(gè)管道
s = fcntl(fd,...)文件加鎖等其他操作

為了對(duì)一個(gè)文件進(jìn)行讀寫的前提是先需要打開(kāi)文件,必須使用 creat 或者 open 打開(kāi),參數(shù)是打開(kāi)文件的方式,是只讀、可讀寫還是只寫。open  系統(tǒng)調(diào)用也會(huì)返回文件描述符。打開(kāi)文件后,需要使用 close 系統(tǒng)調(diào)用進(jìn)行關(guān)閉。close 和 open 返回的 fd 總是未被使用的最小數(shù)量。

?什么是文件描述符?文件描述符就是一個(gè)數(shù)字,這個(gè)數(shù)字標(biāo)示了計(jì)算機(jī)操作系統(tǒng)中打開(kāi)的文件。它描述了數(shù)據(jù)資源,以及訪問(wèn)資源的方式。?

  • 當(dāng)程序要求打開(kāi)一個(gè)文件時(shí),內(nèi)核會(huì)進(jìn)行如下操作

  • 授予訪問(wèn)權(quán)限

  • 在全局文件表(global file table)中創(chuàng)建一個(gè)條目(entry)向軟件提供條目的位置

文件描述符由唯一的非負(fù)整數(shù)組成,系統(tǒng)上每個(gè)打開(kāi)的文件至少存在一個(gè)文件描述符。文件描述符最初在 Unix 中使用,并且被包括 Linux,macOS 和  BSD 在內(nèi)的現(xiàn)代操作系統(tǒng)所使用。

當(dāng)一個(gè)進(jìn)程成功訪問(wèn)一個(gè)打開(kāi)的文件時(shí),內(nèi)核會(huì)返回一個(gè)文件描述符,這個(gè)文件描述符指向全局文件表的 entry 項(xiàng)。這個(gè)文件表項(xiàng)包含文件的 inode  信息,字節(jié)位移,訪問(wèn)限制等。例如下圖所示

Linux文件系統(tǒng)基本概念是什么

默認(rèn)情況下,前三個(gè)文件描述符為 STDIN(標(biāo)準(zhǔn)輸入)、STDOUT(標(biāo)準(zhǔn)輸出)、STDERR(標(biāo)準(zhǔn)錯(cuò)誤)。

標(biāo)準(zhǔn)輸入的文件描述符是 0 ,在終端中,默認(rèn)為用戶的鍵盤輸入

標(biāo)準(zhǔn)輸出的文件描述符是 1 ,在終端中,默認(rèn)為用戶的屏幕

與錯(cuò)誤有關(guān)的默認(rèn)數(shù)據(jù)流是 2,在終端中,默認(rèn)為用戶的屏幕。

在簡(jiǎn)單聊了一下文件描述符后,我們繼續(xù)回到文件系統(tǒng)調(diào)用的探討。

在文件系統(tǒng)調(diào)用中,開(kāi)銷最大的就是 read 和 write 了。read 和 write 都有三個(gè)參數(shù)

  • 文件描述符:告訴需要對(duì)哪一個(gè)打開(kāi)文件進(jìn)行讀取和寫入

  • 緩沖區(qū)地址:告訴數(shù)據(jù)需要從哪里讀取和寫入哪里

  • 統(tǒng)計(jì):告訴需要傳輸多少字節(jié)

這就是所有的參數(shù)了,這個(gè)設(shè)計(jì)非常簡(jiǎn)單輕巧。

雖然幾乎所有程序都按順序讀取和寫入文件,但是某些程序需要能夠隨機(jī)訪問(wèn)文件的任何部分。與每個(gè)文件相關(guān)聯(lián)的是一個(gè)指針,該指針指示文件中的當(dāng)前位置。順序讀取(或?qū)懭?時(shí),它通常指向要讀取(寫入)的下一個(gè)字節(jié)。如果指針在讀取  1024 個(gè)字節(jié)之前位于 4096 的位置,則它將在成功讀取系統(tǒng)調(diào)用后自動(dòng)移至 5120 的位置。

Lseek 系統(tǒng)調(diào)用會(huì)更改指針位置的值,以便后續(xù)對(duì) read 或 write 的調(diào)用可以在文件中的任何位置開(kāi)始,甚至可以超出文件末尾。

?lseek = Lseek ,段首大寫。?

lseek 避免叫做 seek 的原因就是 seek 已經(jīng)在之前 16 位的計(jì)算機(jī)上用于搜素功能了。

Lseek 有三個(gè)參數(shù):第一個(gè)是文件的文件描述符,第二個(gè)是文件的位置;第三個(gè)告訴文件位置是相對(duì)于文件的開(kāi)頭,當(dāng)前位置還是文件的結(jié)尾

lseek(int fildes, off_t offset, int whence);

lseek 的返回值是更改文件指針后文件中的絕對(duì)位置。lseek  是唯一從來(lái)不會(huì)造成真正磁盤查找的系統(tǒng)調(diào)用,它只是更新當(dāng)前的文件位置,這個(gè)文件位置就是內(nèi)存中的數(shù)字。

對(duì)于每個(gè)文件,Linux 都會(huì)跟蹤文件模式(常規(guī),目錄,特殊文件),大小,最后修改時(shí)間以及其他信息。程序能夠通過(guò) stat  系統(tǒng)調(diào)用看到這些信息。第一個(gè)參數(shù)就是文件名,第二個(gè)是指向要放置請(qǐng)求信息結(jié)構(gòu)的指針。這些結(jié)構(gòu)的屬性如下圖所示。

存儲(chǔ)文件的設(shè)備
存儲(chǔ)文件的設(shè)備
i-node 編號(hào)
文件模式(包括保護(hù)位信息)
文件鏈接的數(shù)量
文件所有者標(biāo)識(shí)
文件所屬的組
文件大小(字節(jié))
創(chuàng)建時(shí)間
最后一個(gè)修改/訪問(wèn)時(shí)間

fstat 調(diào)用和 stat 相同,只有一點(diǎn)區(qū)別,fstat 可以對(duì)打開(kāi)文件進(jìn)行操作,而 stat 只能對(duì)路徑進(jìn)行操作。

pipe 文件系統(tǒng)調(diào)用被用來(lái)創(chuàng)建 shell  管道。它會(huì)創(chuàng)建一系列的偽文件,來(lái)緩沖和管道組件之間的數(shù)據(jù),并且返回讀取或者寫入緩沖區(qū)的文件描述符。在管道中,像是如下操作

sort <in | head &ndash;40

sort 進(jìn)程將會(huì)輸出到文件描述符1,也就是標(biāo)準(zhǔn)輸出,寫入管道中,而 head 進(jìn)程將從管道中讀入。在這種方式中,sort 只是從文件描述符 0  中讀取并寫入到文件描述符 1 (管道)中,甚至不知道它們已經(jīng)被重定向了。如果沒(méi)有重定向的話,sort 會(huì)自動(dòng)的從鍵盤讀入并輸出到屏幕中。

最后一個(gè)系統(tǒng)調(diào)用是 fcntl,它用來(lái)鎖定和解鎖文件,應(yīng)用共享鎖和互斥鎖,或者是執(zhí)行一些文件相關(guān)的其他操作。

現(xiàn)在我們來(lái)關(guān)心一下和整體目錄和文件系統(tǒng)相關(guān)的系統(tǒng)調(diào)用,而不是把精力放在單個(gè)的文件上,下面列出了這些系統(tǒng)調(diào)用,我們一起來(lái)看一下。

系統(tǒng)調(diào)用描述
s = mkdir(path,mode)創(chuàng)建一個(gè)新的目錄
s = rmdir(path)移除一個(gè)目錄
s = link(oldpath,newpath)創(chuàng)建指向已有文件的鏈接
s = unlink(path)取消文件的鏈接
s = chdir(path)改變工作目錄
dir = opendir(path)打開(kāi)一個(gè)目錄讀取
s = closedir(dir)關(guān)閉一個(gè)目錄
dirent = readdir(dir)讀取一個(gè)目錄項(xiàng)
rewinddir(dir)回轉(zhuǎn)目錄使其在此使用

可以使用 mkdir 和 rmdir 創(chuàng)建和刪除目錄。但是需要注意,只有目錄為空時(shí)才可以刪除。

創(chuàng)建一個(gè)指向已有文件的鏈接時(shí)會(huì)創(chuàng)建一個(gè)目錄項(xiàng)(directory entry)。系統(tǒng)調(diào)用 link 來(lái)創(chuàng)建鏈接,oldpath  代表已有的路徑,newpath 代表需要鏈接的路徑,使用 unlink 可以刪除目錄項(xiàng)。當(dāng)文件的最后一個(gè)鏈接被刪除時(shí),這個(gè)文件會(huì)被自動(dòng)刪除。

使用 chdir 系統(tǒng)調(diào)用可以改變工作目錄。

最后四個(gè)系統(tǒng)調(diào)用是用于讀取目錄的。和普通文件類似,他們可以被打開(kāi)、關(guān)閉和讀取。每次調(diào)用 readdir  都會(huì)以固定的格式返回一個(gè)目錄項(xiàng)。用戶不能對(duì)目錄執(zhí)行寫操作,但是可以使用 creat 或者 link 在文件夾中創(chuàng)建一個(gè)目錄,或使用 unlink  刪除一個(gè)目錄。用戶不能在目錄中查找某個(gè)特定文件,但是可以使用 rewindir 作用于一個(gè)打開(kāi)的目錄,使他能在此從頭開(kāi)始讀取。

Linux 文件系統(tǒng)的實(shí)現(xiàn)

下面我們主要討論一下 虛擬文件系統(tǒng)(Virtual File System)。VFS 對(duì)高層進(jìn)程和應(yīng)用程序隱藏了 Linux  支持的所有文件系統(tǒng)的區(qū)別,以及文件系統(tǒng)是存儲(chǔ)在本地設(shè)備,還是需要通過(guò)網(wǎng)絡(luò)訪問(wèn)遠(yuǎn)程設(shè)備。設(shè)備和其他特殊文件和 VFS 層相關(guān)聯(lián)。接下來(lái),我們就會(huì)探討一下第一個(gè)  Linux 廣泛傳播的文件系統(tǒng):ext2。隨后,我們就會(huì)探討 ext4 文件系統(tǒng)所做的改進(jìn)。各種各樣的其他文件系統(tǒng)也正在使用中。所有 Linux  系統(tǒng)都可以處理多個(gè)磁盤分區(qū),每個(gè)磁盤分區(qū)上都有不同的文件系統(tǒng)。

Linux 虛擬文件系統(tǒng)

為了能夠使應(yīng)用程序能夠在不同類型的本地或者遠(yuǎn)程設(shè)備上的文件系統(tǒng)進(jìn)行交互,因?yàn)樵?Linux 當(dāng)中文件系統(tǒng)千奇百種,比較常見(jiàn)的有  EXT3、EXT4,還有基于內(nèi)存的 ramfs、tmpfs 和基于網(wǎng)絡(luò)的 nfs,和基于用戶態(tài)的 fuse,當(dāng)然 fuse  應(yīng)該不能完全的文件系統(tǒng),只能算是一個(gè)能把文件系統(tǒng)實(shí)現(xiàn)放到用戶態(tài)的模塊,滿足了內(nèi)核文件系統(tǒng)的接口,他們都是文件系統(tǒng)的一種實(shí)現(xiàn)。對(duì)于這些文件系統(tǒng),Linux  做了一層抽象就是 VFS虛擬文件系統(tǒng),

下表總結(jié)了 VFS 支持的四個(gè)主要的文件系統(tǒng)結(jié)構(gòu)。

對(duì)象描述
超級(jí)塊特定的文件系統(tǒng)
Dentry目錄項(xiàng),路徑的一個(gè)組成部分
I-node特定的文件
File跟一個(gè)進(jìn)程相關(guān)聯(lián)的打開(kāi)文件

超級(jí)塊(superblock) 包含了有關(guān)文件系統(tǒng)布局的重要信息,超級(jí)塊如果遭到破壞那么就會(huì)導(dǎo)致整個(gè)文件系統(tǒng)不可讀。

i-node 索引節(jié)點(diǎn),包含了每一個(gè)文件的描述符。

?在 Linux 中,目錄和設(shè)備也表示為文件,因?yàn)樗鼈兙哂袑?duì)應(yīng)的 i-node?

超級(jí)塊和索引塊所在的文件系統(tǒng)都在磁盤上有對(duì)應(yīng)的結(jié)構(gòu)。

為了便于某些目錄操作和路徑遍歷,比如 /usr/local/cxuan,VFS 支持一個(gè) dentry 數(shù)據(jù)結(jié)構(gòu),該數(shù)據(jù)結(jié)構(gòu)代表著目錄項(xiàng)。這個(gè)  dentry  數(shù)據(jù)結(jié)構(gòu)有很多東西(http://books.gigatux.nl/mirror/kerneldevelopment/0672327201/ch22lev1sec7.html)這個(gè)數(shù)據(jù)結(jié)構(gòu)由文件系統(tǒng)動(dòng)態(tài)創(chuàng)建。

目錄項(xiàng)被緩存在 dentry_cache 緩存中。例如,緩存條目會(huì)緩存 /usr 、 /usr/local  等條目。如果多個(gè)進(jìn)程通過(guò)硬連接訪問(wèn)相同的文件,他們的文件對(duì)象將指向此緩存中的相同條目。

最后,文件數(shù)據(jù)結(jié)構(gòu)是代表著打開(kāi)的文件,也代表著內(nèi)存表示,它根據(jù) open 系統(tǒng)調(diào)用創(chuàng)建。它支持 「read、write、sendfile、lock」  和其他在我們之前描述的系統(tǒng)調(diào)用中。

在 VFS 下實(shí)現(xiàn)的實(shí)際文件系統(tǒng)不需要在內(nèi)部使用完全相同的抽象和操作。但是,它們必須在語(yǔ)義上實(shí)現(xiàn)與 VFS 對(duì)象指定的文件系統(tǒng)操作相同的文件系統(tǒng)操作。四個(gè)  VFS 對(duì)象中每個(gè)對(duì)象的操作數(shù)據(jù)結(jié)構(gòu)的元素都是指向基礎(chǔ)文件系統(tǒng)中功能的指針。

Linux Ext2 文件系統(tǒng)

現(xiàn)在我們一起看一下 Linux 中最流行的一個(gè)磁盤文件系統(tǒng),那就是 ext2 。Linux 的第一個(gè)版本用于 MINIX1  文件系統(tǒng),它的文件名大小被限制為最大 64 MB。MINIX 1 文件系統(tǒng)被永遠(yuǎn)的被它的擴(kuò)展系統(tǒng) ext 取代,因?yàn)?ext 允許更長(zhǎng)的文件名和文件大小。由于  ext 的性能低下,ext 被其替代者 ext2 取代,ext2 目前仍在廣泛使用。

一個(gè) ext2 Linux 磁盤分區(qū)包含了一個(gè)文件系統(tǒng),這個(gè)文件系統(tǒng)的布局如下所示

Linux文件系統(tǒng)基本概念是什么

Boot 塊也就是第 0 塊不是讓 Linux 使用的,而是用來(lái)加載和引導(dǎo)計(jì)算機(jī)啟動(dòng)代碼的。在塊 0  之后,磁盤分區(qū)被分成多個(gè)組,這些組與磁盤柱面邊界所處的位置無(wú)關(guān)。

第一個(gè)塊是 超級(jí)塊(superblock)。它包含有關(guān)文件系統(tǒng)布局的信息,包括 i-node、磁盤塊數(shù)量和以及空閑磁盤塊列表的開(kāi)始。下一個(gè)是  組描述符(group descriptor),其中包含有關(guān)位圖的位置,組中空閑塊和 i-node 的數(shù)量以及組中的目錄數(shù)量的信息。這些信息很重要,因?yàn)?ext2  會(huì)在磁盤上均勻分布目錄。

圖中的兩個(gè)位圖用來(lái)記錄空閑塊和空閑 i-node,這是從 MINIX 1文件系統(tǒng)繼承的選擇,大多數(shù) UNIX  文件系統(tǒng)使用位圖而不是空閑列表。每個(gè)位圖的大小是一個(gè)塊。如果一個(gè)塊的大小是 1 KB,那么就限制了塊組的數(shù)量是 8192 個(gè)塊和 8192 個(gè)  i-node。塊的大小是一個(gè)嚴(yán)格的限制,塊組的數(shù)量不固定,在 4KB 的塊中,塊組的數(shù)量增大四倍。

在超級(jí)塊之后分布的是 i-node 它們自己,i-node 取值范圍是 1 - 某些最大值。每個(gè) i-node 是 128 字節(jié)的 long  ,這些字節(jié)恰好能夠描述一個(gè)文件。i-node 包含了統(tǒng)計(jì)信息(包含了 stat 系統(tǒng)調(diào)用能獲得的所有者信息,實(shí)際上 stat 就是從 i-node  中讀取信息的),以及足夠的信息來(lái)查找保存文件數(shù)據(jù)的所有磁盤塊。

在 i-node 之后的是 數(shù)據(jù)塊(data  blocks)。所有的文件和目錄都保存在這。如果一個(gè)文件或者目錄包含多個(gè)塊,那么這些塊在磁盤中的分布不一定是連續(xù)的,也有可能不連續(xù)。事實(shí)上,大文件塊可能會(huì)被拆分成很多小塊散布在整個(gè)磁盤上。

對(duì)應(yīng)于目錄的 i-node 分散在整個(gè)磁盤組上。如果有足夠的空間,ext2 會(huì)把普通文件組織到與父目錄相同的塊組中,而把同一塊上的數(shù)據(jù)文件組織成初始  i-node 節(jié)點(diǎn)。位圖用來(lái)快速確定新文件系統(tǒng)數(shù)據(jù)的分配位置。在分配新的文件塊時(shí),ext2  也會(huì)給該文件預(yù)分配許多額外的數(shù)據(jù)塊,這樣可以減少將來(lái)向文件寫入數(shù)據(jù)時(shí)產(chǎn)生的文件碎片。這種策略在整個(gè)磁盤上實(shí)現(xiàn)了文件系統(tǒng)的  負(fù)載,后續(xù)還有對(duì)文件碎片的排列和整理,而且性能也比較好。

為了達(dá)到訪問(wèn)的目的,需要首先使用 Linux 系統(tǒng)調(diào)用,例如 open,這個(gè)系統(tǒng)調(diào)用會(huì)確定打開(kāi)文件的路徑。路徑分為兩種,相對(duì)路徑 和  絕對(duì)路徑。如果使用相對(duì)路徑,那么就會(huì)從當(dāng)前目錄開(kāi)始查找,否則就會(huì)從根目錄進(jìn)行查找。

目錄文件的文件名最高不能超過(guò) 255 個(gè)字符,它的分配如下圖所示

Linux文件系統(tǒng)基本概念是什么

每一個(gè)目錄都由整數(shù)個(gè)磁盤塊組成,這樣目錄就可以整體的寫入磁盤。在一個(gè)目錄中,文件和子目錄的目錄項(xiàng)都是未經(jīng)排序的,并且一個(gè)挨著一個(gè)。目錄項(xiàng)不能跨越磁盤塊,所以通常在每個(gè)磁盤塊的尾部會(huì)有部分未使用的字節(jié)。

上圖中每個(gè)目錄項(xiàng)都由四個(gè)固定長(zhǎng)度的屬性和一個(gè)長(zhǎng)度可變的屬性組成。第一個(gè)屬性是 i-node 節(jié)點(diǎn)數(shù)量,文件 first 的 i-node 編號(hào)是 19  ,文件 second 的編號(hào)是 42,目錄 third 的 i-node 編號(hào)是 88。緊隨其后的是  rec_len域,表明目錄項(xiàng)大小是多少字節(jié),名稱后面會(huì)有一些擴(kuò)展,當(dāng)名字以未知長(zhǎng)度填充時(shí),這個(gè)域被用來(lái)尋找下一個(gè)目錄項(xiàng),直至最后的未使用。這也是圖中箭頭的含義。緊隨其后的是  類型域:F 表示的是文件,D 表示的是目錄,最后是固定長(zhǎng)度的文件名,上面的文件名的長(zhǎng)度依次是 5、6、5,最后以文件名結(jié)束。

rec_len 域是如何擴(kuò)展的呢?如下圖所示

Linux文件系統(tǒng)基本概念是什么

我們可以看到,中間的 second 被移除了,所以將其所在的域變?yōu)榈谝粋€(gè)目錄項(xiàng)的填充。當(dāng)然,這個(gè)填充可以作為后續(xù)的目錄項(xiàng)。

由于目錄是按照線性的順序進(jìn)行查找的,因此可能需要很長(zhǎng)時(shí)間才能在大文件末尾找到目錄項(xiàng)。因此,系統(tǒng)會(huì)為近期的訪問(wèn)目錄維護(hù)一個(gè)緩存。這個(gè)緩存用文件名來(lái)查找,如果緩存命中,那么就會(huì)避免線程搜索這樣昂貴的開(kāi)銷。組成路徑的每個(gè)部分都在目錄緩存中保存一個(gè)  dentry 對(duì)象,并且通過(guò) i-node 找到后續(xù)的路徑元素的目錄項(xiàng),直到找到真正的文件 i - node。

比如說(shuō)要使用絕對(duì)路徑來(lái)尋找一個(gè)文件,我們暫定這個(gè)路徑是 /usr/local/file,那么需要經(jīng)過(guò)如下幾個(gè)步驟:

首先,系統(tǒng)會(huì)確定根目錄,它通常使用 2 號(hào) i -node ,也就是索引 2 節(jié)點(diǎn),因?yàn)樗饕?jié)點(diǎn) 1 是 ext2 /3/4  文件系統(tǒng)上的壞塊索引節(jié)點(diǎn)。系統(tǒng)會(huì)將一項(xiàng)放在 dentry 緩存中,以應(yīng)對(duì)將來(lái)對(duì)根目錄的查找。

然后,在根目錄中查找字符串 usr,得到 /usr 目錄的 i - node 節(jié)點(diǎn)號(hào)。/usr 的 i - node 同樣也進(jìn)入 dentry  緩存。然后節(jié)點(diǎn)被取出,并從中解析出磁盤塊,這樣就可以讀取 /usr 目錄并查找字符串 local 了。一旦找到這個(gè)目錄項(xiàng),目錄 /usr/local 的 i -  node 節(jié)點(diǎn)就可以從中獲得。有了 /usr/local 的 i - node 節(jié)點(diǎn)號(hào),就可以讀取 i - node 并確定目錄所在的磁盤塊。最后,從  /usr/local 目錄查找 file 并確定其 i - node 節(jié)點(diǎn)呢號(hào)。

如果文件存在,那么系統(tǒng)會(huì)提取 i - node 節(jié)點(diǎn)號(hào)并把它作為索引在 i - node 節(jié)點(diǎn)表中定位相應(yīng)的 i - node 節(jié)點(diǎn)并裝入內(nèi)存。i -  node 被存放在 i - node 節(jié)點(diǎn)表(i-node table) 中,節(jié)點(diǎn)表是一個(gè)內(nèi)核數(shù)據(jù)結(jié)構(gòu),它會(huì)持有當(dāng)前打開(kāi)文件和目錄的 i - node  節(jié)點(diǎn)號(hào)。下面是一些 Linux 文件系統(tǒng)支持的 i - node 數(shù)據(jù)結(jié)構(gòu)。

屬性字節(jié)描述
Mode2文件屬性、保護(hù)位、setuid 和 setgid 位
Nlinks2指向 i - node 節(jié)點(diǎn)目錄項(xiàng)的數(shù)目
Uid2文件所有者的 UID
Gid2文件所有者的 GID
Size4文件字節(jié)大小
Addr6012 個(gè)磁盤塊以及后面 3 個(gè)間接塊的地址
Gen1每次重復(fù)使用 i - node 時(shí)增加的代號(hào)
Atime4最近訪問(wèn)文件的時(shí)間
Mtime4最近修改文件的時(shí)間
Ctime4最近更改 i - node 的時(shí)間

現(xiàn)在我們來(lái)一起探討一下文件讀取過(guò)程,還記得 read 函數(shù)是如何調(diào)用的嗎?

n = read(fd,buffer,nbytes);

當(dāng)內(nèi)核接管后,它會(huì)從這三個(gè)參數(shù)以及內(nèi)部表與用戶有關(guān)的信息開(kāi)始。內(nèi)部表的其中一項(xiàng)是文件描述符數(shù)組。文件描述符數(shù)組用文件描述符  作為索引并為每一個(gè)打開(kāi)文件保存一個(gè)表項(xiàng)。

文件是和 i - node 節(jié)點(diǎn)號(hào)相關(guān)的。那么如何通過(guò)一個(gè)文件描述符找到文件對(duì)應(yīng)的 i - node 節(jié)點(diǎn)呢?

這里使用的一種設(shè)計(jì)思想是在文件描述符表和 i - node 節(jié)點(diǎn)表之間插入一個(gè)新的表,叫做 打開(kāi)文件描述符(open-file-description  table)。文件的讀寫位置會(huì)在打開(kāi)文件描述符表中存在,如下圖所示

Linux文件系統(tǒng)基本概念是什么

我們使用 shell 、P1 和 P2 來(lái)描述一下父進(jìn)程、子進(jìn)程、子進(jìn)程的關(guān)系。Shell 首先生成 P1,P1 的數(shù)據(jù)結(jié)構(gòu)就是 Shell  的一個(gè)副本,因此兩者都指向相同的打開(kāi)文件描述符的表項(xiàng)。當(dāng) P1 運(yùn)行完成后,Shell 的文件描述符仍會(huì)指向 P1 文件位置的打開(kāi)文件描述。然后 Shell  生成了 P2,新的子進(jìn)程自動(dòng)繼承文件的讀寫位置,甚至 P2 和 Shell 都不知道文件具體的讀寫位置。

上面描述的是父進(jìn)程和子進(jìn)程這兩個(gè) 相關(guān)  進(jìn)程,如果是一個(gè)不相關(guān)進(jìn)程打開(kāi)文件時(shí),它將得到自己的打開(kāi)文件描述符表項(xiàng),以及自己的文件讀寫位置,這是我們需要的。

?因此,打開(kāi)文件描述符相當(dāng)于是給相關(guān)進(jìn)程提供同一個(gè)讀寫位置,而給不相關(guān)進(jìn)程提供各自私有的位置。?

i - node 包含三個(gè)間接塊的磁盤地址,它們每個(gè)指向磁盤塊的地址所能夠存儲(chǔ)的大小不一樣。

Linux Ext4 文件系統(tǒng)

為了防止由于系統(tǒng)崩潰和電源故障造成的數(shù)據(jù)丟失,ext2  系統(tǒng)必須在每個(gè)數(shù)據(jù)塊創(chuàng)建之后立即將其寫入到磁盤上,磁盤磁頭尋道操作導(dǎo)致的延遲是無(wú)法讓人忍受的。為了增強(qiáng)文件系統(tǒng)的健壯性,Linux 依靠日志文件系統(tǒng),ext3  是一個(gè)日志文件系統(tǒng),它在 ext2 文件系統(tǒng)的基礎(chǔ)之上做了改進(jìn),ext4 也是 ext3 的改進(jìn),ext4 也是一個(gè)日志文件系統(tǒng)。ext4 改變了 ext3  的塊尋址方案,從而支持更大的文件和更大的文件系統(tǒng)大小。下面我們就來(lái)描述一下 ext4 文件系統(tǒng)的特性。

具有記錄的文件系統(tǒng)最基本的功能就是記錄日志,這個(gè)日志記錄了按照順序描述所有文件系統(tǒng)的操作。通過(guò)順序?qū)懗鑫募到y(tǒng)數(shù)據(jù)或元數(shù)據(jù)的更改,操作不受磁盤訪問(wèn)期間磁盤頭移動(dòng)的開(kāi)銷。最終,這個(gè)變更會(huì)寫入并提交到合適的磁盤位置上。如果這個(gè)變更在提交到磁盤前文件系統(tǒng)宕機(jī)了,那么在重啟期間,系統(tǒng)會(huì)檢測(cè)到文件系統(tǒng)未正確卸載,那么就會(huì)遍歷日志并應(yīng)用日志的記錄來(lái)對(duì)文件系統(tǒng)進(jìn)行更改。

Ext4 文件系統(tǒng)被設(shè)計(jì)用來(lái)高度匹配 ext2 和 ext3 文件系統(tǒng)的,盡管 ext4  文件系統(tǒng)在內(nèi)核數(shù)據(jù)結(jié)構(gòu)和磁盤布局上都做了變更。盡管如此,一個(gè)文件系統(tǒng)能夠從 ext2 文件系統(tǒng)上卸載后成功的掛載到 ext4  文件系統(tǒng)上,并提供合適的日志記錄。

日志是作為循環(huán)緩沖區(qū)管理的文件。日志可以存儲(chǔ)在與主文件系統(tǒng)相同或者不同的設(shè)備上。日志記錄的讀寫操作會(huì)由單獨(dú)的 JBD(Journaling Block  Device) 來(lái)扮演。

JBD 中有三個(gè)主要的數(shù)據(jù)結(jié)構(gòu),分別是 「log  record(日志記錄)、原子操作和事務(wù)」。一個(gè)日志記錄描述了一個(gè)低級(jí)別的文件系統(tǒng)操作,這個(gè)操作通常導(dǎo)致塊內(nèi)的變化。因?yàn)橄袷?write  這種系統(tǒng)調(diào)用會(huì)包含多個(gè)地方的改動(dòng) --- i - node 節(jié)點(diǎn),現(xiàn)有的文件塊,新的文件塊和空閑列表等。相關(guān)的日志記錄會(huì)以原子性的方式分組。ext4  會(huì)通知系統(tǒng)調(diào)用進(jìn)程的開(kāi)始和結(jié)束,以此使 JBD 能夠確保原子操作的記錄都能被應(yīng)用,或者一個(gè)也不被應(yīng)用。最后,主要從效率方面考慮,JBD  會(huì)視原子操作的集合為事務(wù)。一個(gè)事務(wù)中的日志記錄是連續(xù)存儲(chǔ)的。只有在所有的變更一起應(yīng)用到磁盤后,日志記錄才能夠被丟棄。

由于為每個(gè)磁盤寫出日志的開(kāi)銷會(huì)很大,所以 ext4  可以配置為保留所有磁盤更改的日志,或者僅僅保留與文件系統(tǒng)元數(shù)據(jù)相關(guān)的日志更改。僅僅記錄元數(shù)據(jù)可以減少系統(tǒng)開(kāi)銷,提升性能,但不能保證不會(huì)損壞文件數(shù)據(jù)。其他的幾個(gè)日志系統(tǒng)維護(hù)著一系列元數(shù)據(jù)操作的日志,例如  SGI 的 XFS。

/proc 文件系統(tǒng)

另外一個(gè) Linux 文件系統(tǒng)是 /proc (process) 文件系統(tǒng)

?它的主要思想來(lái)源于貝爾實(shí)驗(yàn)室開(kāi)發(fā)的第 8 版的 UNIX,后來(lái)被 BSD 和 System V 采用。?

然而,Linux 在一些方面上對(duì)這個(gè)想法進(jìn)行了擴(kuò)充。它的基本概念是為系統(tǒng)中的每個(gè)進(jìn)程在 /proc 中創(chuàng)建一個(gè)目錄。目錄的名字就是進(jìn)程  PID,以十進(jìn)制數(shù)進(jìn)行表示。例如,/proc/1024 就是一個(gè)進(jìn)程號(hào)為 1024  的目錄。在該目錄下是進(jìn)程信息相關(guān)的文件,比如進(jìn)程的命令行、環(huán)境變量和信號(hào)掩碼等。事實(shí)上,這些文件在磁盤上并不存在磁盤中。當(dāng)需要這些信息的時(shí)候,系統(tǒng)會(huì)按需從進(jìn)程中讀取,并以標(biāo)準(zhǔn)格式返回給用戶。

許多 Linux 擴(kuò)展與 /proc 中的其他文件和目錄有關(guān)。它們包含各種各樣的關(guān)于  CPU、磁盤分區(qū)、設(shè)備、中斷向量、內(nèi)核計(jì)數(shù)器、文件系統(tǒng)、已加載模塊等信息。非特權(quán)用戶可以讀取很多這樣的信息,于是就可以通過(guò)一種安全的方式了解系統(tǒng)情況。

NFS 網(wǎng)絡(luò)文件系統(tǒng)

從一開(kāi)始,網(wǎng)絡(luò)就在 Linux 中扮演了很重要的作用。下面我們會(huì)探討一下 NFS(Network File System) 網(wǎng)絡(luò)文件系統(tǒng),它在現(xiàn)代  Linux 操作系統(tǒng)的作用是將不同計(jì)算機(jī)上的不同文件系統(tǒng)鏈接成一個(gè)邏輯整體。

NFS 架構(gòu)NFS 最基本的思想是允許任意選定的一些客戶端和服務(wù)器共享一個(gè)公共文件系統(tǒng)。在許多情況下,所有的客戶端和服務(wù)器都會(huì)在同一個(gè) LAN(Local  Area Network)  局域網(wǎng)內(nèi)共享,但是這并不是必須的。也可能是下面這樣的情況:如果客戶端和服務(wù)器距離較遠(yuǎn),那么它們也可以在廣域網(wǎng)上運(yùn)行??蛻舳丝梢允欠?wù)器,服務(wù)器可以是客戶端,但是為了簡(jiǎn)單起見(jiàn),我們說(shuō)的客戶端就是消費(fèi)服務(wù),而服務(wù)器就是提供服務(wù)的角度來(lái)聊。

每一個(gè) NFS  服務(wù)都會(huì)導(dǎo)出一個(gè)或者多個(gè)目錄供遠(yuǎn)程客戶端訪問(wèn)。當(dāng)一個(gè)目錄可用時(shí),它的所有子目錄也可用。因此,通常整個(gè)目錄樹(shù)都會(huì)作為一個(gè)整體導(dǎo)出。服務(wù)器導(dǎo)出的目錄列表會(huì)用一個(gè)文件來(lái)維護(hù),這個(gè)文件是  /etc/exports,當(dāng)服務(wù)器啟動(dòng)后,這些目錄可以自動(dòng)的被導(dǎo)出??蛻舳送ㄟ^(guò)掛載這些導(dǎo)出的目錄來(lái)訪問(wèn)它們。當(dāng)一個(gè)客戶端掛載了一個(gè)遠(yuǎn)程目錄,這個(gè)目錄就成為客戶端目錄層次的一部分,如下圖所示。

Linux文件系統(tǒng)基本概念是什么

在這個(gè)示例中,一號(hào)客戶機(jī)掛載到服務(wù)器的 bin 目錄下,因此它現(xiàn)在可以使用 shell 訪問(wèn) /bin/cat 或者其他任何一個(gè)目錄。同樣,客戶機(jī) 1  也可以掛載到 二號(hào)服務(wù)器上從而訪問(wèn) /usr/local/projects/proj1 或者其他目錄。二號(hào)客戶機(jī)同樣可以掛載到二號(hào)服務(wù)器上,訪問(wèn)路徑是  /mnt/projects/proj2。

從上面可以看到,由于不同的客戶端將文件掛載到各自目錄樹(shù)的不同位置,同一個(gè)文件在不同的客戶端有不同的訪問(wèn)路徑和不同的名字。掛載點(diǎn)一般通常在客戶端本地,服務(wù)器不知道任何一個(gè)掛載點(diǎn)的存在。

NFS 協(xié)議

由于 NFS 的協(xié)議之一是支持 異構(gòu)  系統(tǒng),客戶端和服務(wù)器可能在不同的硬件上運(yùn)行不同的操作系統(tǒng),因此有必要在服務(wù)器和客戶端之間進(jìn)行接口定義。這樣才能讓任何寫一個(gè)新客戶端能夠和現(xiàn)有的服務(wù)器一起正常工作,反之亦然。

NFS 就通過(guò)定義兩個(gè)客戶端 - 服務(wù)器協(xié)議從而實(shí)現(xiàn)了這個(gè)目標(biāo)。協(xié)議就是客戶端發(fā)送給服務(wù)器的一連串的請(qǐng)求,以及服務(wù)器發(fā)送回客戶端的相應(yīng)答復(fù)。

第一個(gè) NFS  協(xié)議是處理掛載??蛻舳丝梢韵蚍?wù)器發(fā)送路徑名并且請(qǐng)求服務(wù)器是否能夠?qū)⒎?wù)器的目錄掛載到自己目錄層次上。因?yàn)榉?wù)器不關(guān)心掛載到哪里,因此請(qǐng)求不會(huì)包含掛載地址。如果路徑名是合法的并且指定的目錄已經(jīng)被導(dǎo)出,那么服務(wù)器會(huì)將文件  句柄 返回給客戶端。

?文件句柄包含唯一標(biāo)識(shí)文件系統(tǒng)類型,磁盤,目錄的i節(jié)點(diǎn)號(hào)和安全性信息的字段。?

隨后調(diào)用讀取和寫入已安裝目錄或其任何子目錄中的文件,都將使用文件句柄。

當(dāng) Linux 啟動(dòng)時(shí)會(huì)在多用戶之前運(yùn)行 shell 腳本 /etc/rc  ??梢詫燧d遠(yuǎn)程文件系統(tǒng)的命令寫入該腳本中,這樣就可以在允許用戶登陸之前自動(dòng)掛載必要的遠(yuǎn)程文件系統(tǒng)。大部分 Linux  版本是支持自動(dòng)掛載的。這個(gè)特性會(huì)支持將遠(yuǎn)程目錄和本地目錄進(jìn)行關(guān)聯(lián)。

相對(duì)于手動(dòng)掛載到 /etc/rc 目錄下,自動(dòng)掛載具有以下優(yōu)勢(shì)

  • 如果列出的 /etc/rc  目錄下出現(xiàn)了某種故障,那么客戶端將無(wú)法啟動(dòng),或者啟動(dòng)會(huì)很困難、延遲或者伴隨一些出錯(cuò)信息,如果客戶根本不需要這個(gè)服務(wù)器,那么手動(dòng)做了這些工作就白費(fèi)了。

  • 允許客戶端并行的嘗試一組服務(wù)器,可以實(shí)現(xiàn)一定程度的容錯(cuò)率,并且性能也可以得到提高。

另一方面,我們默認(rèn)在自動(dòng)掛載時(shí)所有可選的文件系統(tǒng)都是相同的。由于 NFS  不提供對(duì)文件或目錄復(fù)制的支持,用戶需要自己確保這些所有的文件系統(tǒng)都是相同的。因此,大部分的自動(dòng)掛載都只應(yīng)用于二進(jìn)制文件和很少改動(dòng)的只讀的文件系統(tǒng)。

第二個(gè) NFS  協(xié)議是為文件和目錄的訪問(wèn)而設(shè)計(jì)的??蛻舳四軌蛲ㄟ^(guò)向服務(wù)器發(fā)送消息來(lái)操作目錄和讀寫文件??蛻舳艘部梢栽L問(wèn)文件屬性,比如文件模式、大小、上次修改時(shí)間。NFS  支持大多數(shù)的 Linux 系統(tǒng)調(diào)用,但是 open 和 close 系統(tǒng)調(diào)用卻不支持。

?不支持 open 和 close 并不是一種疏忽,而是一種刻意的設(shè)計(jì),完全沒(méi)有必要在讀一個(gè)文件之前對(duì)其進(jìn)行打開(kāi),也沒(méi)有必要在讀完時(shí)對(duì)其進(jìn)行關(guān)閉。?

NFS 使用了標(biāo)準(zhǔn)的 UNIX 保護(hù)機(jī)制,使用 rwx 位來(lái)標(biāo)示所有者(owner)、組(groups)、其他用戶 。最初,每個(gè)請(qǐng)求消息都會(huì)攜帶調(diào)用者的  groupId 和 userId,NFS  會(huì)對(duì)其進(jìn)行驗(yàn)證。事實(shí)上,它會(huì)信任客戶端不會(huì)發(fā)生欺騙行為??梢允褂霉€密碼來(lái)創(chuàng)建一個(gè)安全密鑰,在每次請(qǐng)求和應(yīng)答中使用它驗(yàn)證客戶端和服務(wù)器。

NFS 實(shí)現(xiàn)

即使客戶端和服務(wù)器的代碼實(shí)現(xiàn)是獨(dú)立于 NFS 協(xié)議的,大部分的 Linux 系統(tǒng)會(huì)使用一個(gè)下圖的三層實(shí)現(xiàn),頂層是系統(tǒng)調(diào)用層,系統(tǒng)調(diào)用層能夠處理  open 、 read 、 close 這類的系統(tǒng)調(diào)用。在解析和參數(shù)檢查結(jié)束后調(diào)用第二層,虛擬文件系統(tǒng) (VFS) 層。

Linux文件系統(tǒng)基本概念是什么

VFS 層的任務(wù)是維護(hù)一個(gè)表,每個(gè)已經(jīng)打開(kāi)的文件都在表中有一個(gè)表項(xiàng)。VFS 層為每一個(gè)打開(kāi)的文件維護(hù)著一個(gè)虛擬i節(jié)點(diǎn),簡(jiǎn)稱為 v - node。v  節(jié)點(diǎn)用來(lái)說(shuō)明文件是本地文件還是遠(yuǎn)程文件。如果是遠(yuǎn)程文件的話,那么 v - node  會(huì)提供足夠的信息使客戶端能夠訪問(wèn)它們。對(duì)于本地文件,會(huì)記錄其所在的文件系統(tǒng)和文件的 i-node ,因?yàn)楝F(xiàn)代操作系統(tǒng)能夠支持多文件系統(tǒng)。雖然 VFS 是為了支持  NFS 而設(shè)計(jì)的,但是現(xiàn)代操作系統(tǒng)都會(huì)使用 VFS,而不管有沒(méi)有 NFS。

感謝各位的閱讀,以上就是“Linux文件系統(tǒng)基本概念是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Linux文件系統(tǒng)基本概念是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI