0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux文件系統(tǒng)層的主要結(jié)構(gòu)

科技綠洲 ? 來源:Linux開發(fā)架構(gòu)之路 ? 作者:Linux開發(fā)架構(gòu)之路 ? 2023-11-10 10:37 ? 次閱讀

Linux 文件系統(tǒng)體系結(jié)構(gòu)是一個對復(fù)雜系統(tǒng)進行抽象化的有趣例子。通過使用一組通用的 API 函數(shù),Linux 可以在許多種存儲設(shè)備上支持許多種文件系統(tǒng)。例如,read 函數(shù)調(diào)用可以從指定的文件描述符讀取一定數(shù)量的字節(jié)。

read 函數(shù)不了解文件系統(tǒng)的類型,比如 ext3 或 NFS。它也不了解文件系統(tǒng)所在的存儲媒體,比如 AT Attachment Packet Interface(ATAPI)磁盤、Serial-Attached SCSI(SAS)磁盤或 Serial Advanced Technology Attachment(SATA)磁盤。

但是,當(dāng)通過調(diào)用 read 函數(shù)讀取一個文件時,數(shù)據(jù)會正常返回。本文講解這個機制的實現(xiàn)方法并介紹 Linux 文件系統(tǒng)層的主要結(jié)構(gòu)。

什么是文件系統(tǒng)?

首先回答最常見的問題,“什么是文件系統(tǒng)”。文件系統(tǒng)是對一個存儲設(shè)備上的數(shù)據(jù)和元數(shù)據(jù)進行組織的機制。由于定義如此寬泛,支持它的代碼會很有意思。正如前面提到的,有許多種文件系統(tǒng)和媒體。由于存在這么多類型,可以預(yù)料到 Linux 文件系統(tǒng)接口實現(xiàn)為分層的體系結(jié)構(gòu),從而將用戶接口層、文件系統(tǒng)實現(xiàn)和操作存儲設(shè)備的驅(qū)動程序分隔開。

掛裝

在 Linux 中將一個文件系統(tǒng)與一個存儲設(shè)備關(guān)聯(lián)起來的過程稱為掛裝(mount)。使用 mount 命令將一個文件系統(tǒng)附著到當(dāng)前文件系統(tǒng)層次結(jié)構(gòu)中(根)。在執(zhí)行掛裝時,要提供文件系統(tǒng)類型、文件系統(tǒng)和一個掛裝點。

為了說明 Linux 文件系統(tǒng)層的功能(以及掛裝的方法),我們在當(dāng)前文件系統(tǒng)的一個文件中創(chuàng)建一個文件系統(tǒng)。實現(xiàn)的方法是,首先用 dd 命令創(chuàng)建一個指定大小的文件(使用 /dev/zero 作為源進行文件復(fù)制)—— 換句話說,一個用零進行初始化的文件,見清單 1。

清單 1. 創(chuàng)建一個經(jīng)過初始化的文件

$ dd if=/dev/zero of=file.img bs=1k count=10000
10000+0 records in
10000+0 records out
$

現(xiàn)在有了一個 10MB 的 file.img 文件。使用 losetup 命令將一個循環(huán)設(shè)備與這個文件關(guān)聯(lián)起來,讓它看起來像一個塊設(shè)備,而不是文件系統(tǒng)中的常規(guī)文件:

$ losetup /dev/loop0 file.img
$

這個文件現(xiàn)在作為一個塊設(shè)備出現(xiàn)(由 /dev/loop0 表示)。然后用 mke2fs 在這個設(shè)備上創(chuàng)建一個文件系統(tǒng)。這個命令創(chuàng)建一個指定大小的新的 ext2 文件系統(tǒng),見清單 2。

清單 2. 用循環(huán)設(shè)備創(chuàng)建 ext2 文件系統(tǒng)

$ mke2fs -c /dev/loop0 10000
mke2fs 1.35 (28-Feb-2004)
max_blocks 1024000, rsv_groups = 1250, rsv_gdb = 39
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
2512 inodes, 10000 blocks
500 blocks (5.00%) reserved for the super user
...
$

使用 mount 命令將循環(huán)設(shè)備(/dev/loop0)所表示的 file.img 文件掛裝到掛裝點 /mnt/point1。注意,文件系統(tǒng)類型指定為 ext2。掛裝之后,就可以將這個掛裝點當(dāng)作一個新的文件系統(tǒng),比如使用 ls 命令,見清單 3。

清單 3. 創(chuàng)建掛裝點并通過循環(huán)設(shè)備掛裝文件系統(tǒng)

$ mkdir /mnt/point1
$ mount -t ext2 /dev/loop0 /mnt/point1
$ ls /mnt/point1
lost+found
$

如清單 4 所示,還可以繼續(xù)這個過程:在剛才掛裝的文件系統(tǒng)中創(chuàng)建一個新文件,將它與一個循環(huán)設(shè)備關(guān)聯(lián)起來,再在上面創(chuàng)建另一個文件系統(tǒng)。

清單 4. 在循環(huán)文件系統(tǒng)中創(chuàng)建一個新的循環(huán)文件系統(tǒng)

$ dd if=/dev/zero of=/mnt/point1/file.img bs=1k count=1000
1000+0 records in
1000+0 records out
$ losetup /dev/loop1 /mnt/point1/file.img
$ mke2fs -c /dev/loop1 1000
mke2fs 1.35 (28-Feb-2004)
max_blocks 1024000, rsv_groups = 125, rsv_gdb = 3
Filesystem label=
...
$ mkdir /mnt/point2
$ mount -t ext2 /dev/loop1 /mnt/point2
$ ls /mnt/point2
lost+found
$ ls /mnt/point1
file.img lost+found
$

通過這個簡單的演示很容易體會到 Linux 文件系統(tǒng)(和循環(huán)設(shè)備)是多么強大??梢园凑障嗤姆椒ㄔ谖募嫌醚h(huán)設(shè)備創(chuàng)建加密的文件系統(tǒng)??梢栽谛枰獣r使用循環(huán)設(shè)備臨時掛裝文件,這有助于保護數(shù)據(jù)。

文件系統(tǒng)體系結(jié)構(gòu)

既然已經(jīng)看到了文件系統(tǒng)的構(gòu)造方法,現(xiàn)在就看看 Linux 文件系統(tǒng)層的體系結(jié)構(gòu)。本文從兩個角度考察 Linux 文件系統(tǒng)。首先采用高層體系結(jié)構(gòu)的角度。然后進行深層次討論,介紹實現(xiàn)文件系統(tǒng)層的主要結(jié)構(gòu)。

高層體系結(jié)構(gòu)

盡管大多數(shù)文件系統(tǒng)代碼在內(nèi)核中(后面討論的用戶空間文件系統(tǒng)除外),但是圖 1 所示的體系結(jié)構(gòu)顯示了用戶空間和內(nèi)核中與文件系統(tǒng)相關(guān)的主要組件之間的關(guān)系。

圖 1. Linux 文件系統(tǒng)組件的體系結(jié)構(gòu)

圖片

用戶空間包含一些應(yīng)用程序(例如,文件系統(tǒng)的使用者)和 GNU C 庫(glibc),它們?yōu)槲募到y(tǒng)調(diào)用(打開、讀取、寫和關(guān)閉)提供用戶接口。系統(tǒng)調(diào)用接口的作用就像是交換器,它將系統(tǒng)調(diào)用從用戶空間發(fā)送到內(nèi)核空間中的適當(dāng)端點。

VFS 是底層文件系統(tǒng)的主要接口。這個組件導(dǎo)出一組接口,然后將它們抽象到各個文件系統(tǒng),各個文件系統(tǒng)的行為可能差異很大。有兩個針對文件系統(tǒng)對象的緩存(inode 和 dentry)。它們緩存最近使用過的文件系統(tǒng)對象。

每個文件系統(tǒng)實現(xiàn)(比如 ext2、JFS 等等)導(dǎo)出一組通用接口,供 VFS 使用。緩沖區(qū)緩存會緩存文件系統(tǒng)和相關(guān)塊設(shè)備之間的請求。例如,對底層設(shè)備驅(qū)動程序的讀寫請求會通過緩沖區(qū)緩存來傳遞。這就允許在其中緩存請求,減少訪問物理設(shè)備的次數(shù),加快訪問速度。以最近使用(LRU)列表的形式管理緩沖區(qū)緩存。注意,可以使用 sync 命令將緩沖區(qū)緩存中的請求發(fā)送到存儲媒體(迫使所有未寫的數(shù)據(jù)發(fā)送到設(shè)備驅(qū)動程序,進而發(fā)送到存儲設(shè)備)。

這就是 VFS 和文件系統(tǒng)組件的高層情況?,F(xiàn)在,討論實現(xiàn)這個子系統(tǒng)的主要結(jié)構(gòu)。

主要結(jié)構(gòu)

Linux 以一組通用對象的角度看待所有文件系統(tǒng)。這些對象是超級塊(superblock)、inode、dentry 和文件。超級塊在每個文件系統(tǒng)的根上,超級塊描述和維護文件系統(tǒng)的狀態(tài)。文件系統(tǒng)中管理的每個對象(文件或目錄)在 Linux 中表示為一個 inode。inode 包含管理文件系統(tǒng)中的對象所需的所有元數(shù)據(jù)(包括可以在對象上執(zhí)行的操作)。

另一組結(jié)構(gòu)稱為 dentry,它們用來實現(xiàn)名稱和 inode 之間的映射,有一個目錄緩存用來保存最近使用的 dentry。dentry 還維護目錄和文件之間的關(guān)系,從而支持在文件系統(tǒng)中移動。最后,VFS 文件表示一個打開的文件(保存打開的文件的狀態(tài),比如寫偏移量等等)。

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

VFS 作為文件系統(tǒng)接口的根層。VFS 記錄當(dāng)前支持的文件系統(tǒng)以及當(dāng)前掛裝的文件系統(tǒng)。

可以使用一組注冊函數(shù)在 Linux 中動態(tài)地添加或刪除文件系統(tǒng)。內(nèi)核保存當(dāng)前支持的文件系統(tǒng)的列表,可以通過 /proc 文件系統(tǒng)在用戶空間中查看這個列表。這個虛擬文件還顯示當(dāng)前與這些文件系統(tǒng)相關(guān)聯(lián)的設(shè)備。在 Linux 中添加新文件系統(tǒng)的方法是調(diào)用 register_filesystem。這個函數(shù)的參數(shù)定義一個文件系統(tǒng)結(jié)構(gòu)(file_system_type)的引用,這個結(jié)構(gòu)定義文件系統(tǒng)的名稱、一組屬性和兩個超級塊函數(shù)。也可以注銷文件系統(tǒng)。

在注冊新的文件系統(tǒng)時,會把這個文件系統(tǒng)和它的相關(guān)信息添加到 file_systems 列表中(見圖 2 和 linux/ include/ linux/ mount.h)。這個列表定義可以支持的文件系統(tǒng)。在命令行上輸入 cat /proc/filesystems,就可以查看這個列表。

圖 2. 向內(nèi)核注冊的文件系統(tǒng)

圖片

VFS 中維護的另一個結(jié)構(gòu)是掛裝的文件系統(tǒng)(見圖 3)。這個結(jié)構(gòu)提供當(dāng)前掛裝的文件系統(tǒng)(見 linux /include /linux/fs.h)。它鏈接下面討論的超級塊結(jié)構(gòu)。

圖 3. 掛裝的文件系統(tǒng)列表

圖片

超級塊

超級塊結(jié)構(gòu)表示一個文件系統(tǒng)。它包含管理文件系統(tǒng)所需的信息,包括文件系統(tǒng)名稱(比如 ext2)、文件系統(tǒng)的大小和狀態(tài)、塊設(shè)備的引用和元數(shù)據(jù)信息(比如空閑列表等等)。超級塊通常存儲在存儲媒體上,但是如果超級塊不存在,也可以實時創(chuàng)建它。可以在 ./linux/include/linux/fs.h 中找到超級塊結(jié)構(gòu)(見圖 4)。

圖 4. 超級塊結(jié)構(gòu)和 inode 操作

圖片

超級塊中的一個重要元素是超級塊操作的定義。這個結(jié)構(gòu)定義一組用來管理這個文件系統(tǒng)中的 inode 的函數(shù)。例如,可以用 alloc_inode 分配 inode,用 destroy_inode 刪除 inode??梢杂?read_inode和 write_inode 讀寫 inode,用 sync_fs 執(zhí)行文件系統(tǒng)同步??梢栽?./linux /include/ linux/fs.h 中找到 super_operations 結(jié)構(gòu)。每個文件系統(tǒng)提供自己的 inode 方法,這些方法實現(xiàn)操作并向 VFS 層提供通用的抽象。

inode和dentry

inode 表示文件系統(tǒng)中的一個對象,它具有惟一標識符。各個文件系統(tǒng)提供將文件名映射為惟一 inode 標識符和 inode 引用的方法。

圖 5 顯示 inode 結(jié)構(gòu)的一部分以及兩個相關(guān)結(jié)構(gòu)。請?zhí)貏e注意 inode_operations 和file_operations。這些結(jié)構(gòu)表示可以在這個 inode 上執(zhí)行的操作。inode_operations 定義直接在 inode 上執(zhí)行的操作,而 file_operations 定義與文件和目錄相關(guān)的方法(標準系統(tǒng)調(diào)用)。

圖 5. inode 結(jié)構(gòu)和相關(guān)聯(lián)的操作

圖片

inode 和目錄緩存分別保存最近使用的 inode 和 dentry。注意,對于 inode 緩存中的每個 inode,在目錄緩存中都有一個對應(yīng)的 dentry。可以在 ./linux/include/linux/fs.h 中找到 inode 和dentry 結(jié)構(gòu)。

緩沖區(qū)緩存

除了各個文件系統(tǒng)實現(xiàn)(可以在 ./linux/fs 中找到)之外,文件系統(tǒng)層的底部是緩沖區(qū)緩存。這個組件跟蹤來自文件系統(tǒng)實現(xiàn)和物理設(shè)備(通過設(shè)備驅(qū)動程序)的讀寫請求。為了提高效率,Linux 對請求進行緩存,避免將所有請求發(fā)送到物理設(shè)備。緩存中緩存最近使用的緩沖區(qū)(頁面),這些緩沖區(qū)可以快速提供給各個文件系統(tǒng)。

有趣的文件系統(tǒng)

本文沒有討論 Linux 中可用的具體文件系統(tǒng),但是值得在這里稍微提一下。Linux 支持許多種文件系統(tǒng),包括 MINIX、MS-DOS 和 ext2 等老式文件系統(tǒng)。Linux 還支持 ext3、JFS 和 ReiserFS 等新的日志型文件系統(tǒng)。另外,Linux 支持加密文件系統(tǒng)(比如 CFS)和虛擬文件系統(tǒng)(比如 /proc)。

最后一種值得注意的文件系統(tǒng)是 Filesystem in Userspace(FUSE)。這種文件系統(tǒng)可以將文件系統(tǒng)請求通過 VFS 發(fā)送回用戶空間。所以,如果您有興趣創(chuàng)建自己的文件系統(tǒng),那么通過使用 FUSE 進行開發(fā)是一種不錯的方法。

結(jié)束語

盡管文件系統(tǒng)的實現(xiàn)并不復(fù)雜,但它是可伸縮和可擴展的體系結(jié)構(gòu)的好例子。文件系統(tǒng)體系結(jié)構(gòu)已經(jīng)發(fā)展了許多年,并成功地支持了許多不同類型的文件系統(tǒng)和許多目標存儲設(shè)備類型。由于使用了基于插件的體系結(jié)構(gòu)和多層的函數(shù)間接性,Linux 文件系統(tǒng)在近期的發(fā)展很值得關(guān)注。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11207

    瀏覽量

    208716
  • 文件系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    284

    瀏覽量

    19871
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4277

    瀏覽量

    62323
  • 元數(shù)據(jù)
    +關(guān)注

    關(guān)注

    0

    文章

    32

    瀏覽量

    9119
收藏 人收藏

    評論

    相關(guān)推薦

    Linux文件系統(tǒng)課程

    本章學(xué)習(xí)目標理解什么是文件系統(tǒng)了解文件系統(tǒng)工作原理理解Fedora Core Linux文件系統(tǒng)結(jié)構(gòu)掌握Fedora Core
    發(fā)表于 04-10 17:07 ?0次下載

    Linux虛擬文件系統(tǒng)實現(xiàn)技術(shù)探討

    文章論述了 Linux 文件系統(tǒng)的邏輯關(guān)系和邏輯結(jié)構(gòu),對VFS 中幾個主要的數(shù)據(jù)結(jié)構(gòu)進行了分析,剖析了L
    發(fā)表于 06-08 17:51 ?32次下載
    <b class='flag-5'>Linux</b>虛擬<b class='flag-5'>文件系統(tǒng)</b>實現(xiàn)技術(shù)探討

    Linux設(shè)備驅(qū)動開發(fā)詳解》第5章、Linux文件系統(tǒng)與設(shè)備文件系統(tǒng)

    Linux設(shè)備驅(qū)動開發(fā)詳解》第5章、Linux文件系統(tǒng)與設(shè)備文件系統(tǒng)
    發(fā)表于 10-27 14:13 ?0次下載
    《<b class='flag-5'>Linux</b>設(shè)備驅(qū)動開發(fā)詳解》第5章、<b class='flag-5'>Linux</b><b class='flag-5'>文件系統(tǒng)</b>與設(shè)備<b class='flag-5'>文件系統(tǒng)</b>

    linux文件系統(tǒng)基礎(chǔ)

    一 、linux文件結(jié)構(gòu) 文件結(jié)構(gòu)文件存放在磁盤等存貯設(shè)備上的組織方法。
    發(fā)表于 11-07 15:28 ?0次下載

    Linux 內(nèi)核/sys 文件系統(tǒng)介紹

    linux2.6內(nèi)核引入sysfs文件系統(tǒng),sysfs可以看成與proc,devfs和devpty同類別的文件系統(tǒng),該文件系統(tǒng)是虛擬的文件系統(tǒng)
    發(fā)表于 04-25 16:20 ?4255次閱讀
    <b class='flag-5'>Linux</b> 內(nèi)核/sys <b class='flag-5'>文件系統(tǒng)</b>介紹

    你需要了解的Linux文件系統(tǒng)

    Linux文件系統(tǒng)中的文件是數(shù)據(jù)的集合,文件系統(tǒng)不僅包含著文件中的數(shù)據(jù)而且還有系統(tǒng)
    發(fā)表于 04-25 17:44 ?726次閱讀
    你需要了解的<b class='flag-5'>Linux</b><b class='flag-5'>文件系統(tǒng)</b>

    可以了解的Linux 文件系統(tǒng)結(jié)構(gòu)

    Linux中的文件是什么?它的文件系統(tǒng)又是什么?那些配置文件又在哪里?我下載好的程序保存在哪里了?在 Linux
    發(fā)表于 04-27 14:06 ?706次閱讀
    可以了解的<b class='flag-5'>Linux</b> <b class='flag-5'>文件系統(tǒng)</b><b class='flag-5'>結(jié)構(gòu)</b>

    Linux嵌入式文件系統(tǒng)如何構(gòu)建

    Linux支持多種文件系統(tǒng),同樣,嵌入式Linux也支持多種文件系統(tǒng)。雖然在嵌入式系統(tǒng)中,由于資源受限的原因,它的
    發(fā)表于 06-18 09:23 ?977次閱讀

    Linux文件系統(tǒng)解析

    Linux 中,最直觀、最可見的部分就是 文件系統(tǒng)(file system)。下面我們就來一起探討一下關(guān)于 Linux 中國的文件系統(tǒng),系統(tǒng)
    的頭像 發(fā)表于 09-16 11:29 ?2425次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>文件系統(tǒng)</b>解析

    Linux文件系統(tǒng)與持久性內(nèi)存

    的方法,包括數(shù)據(jù)結(jié)構(gòu)和訪問方法,到存儲設(shè)備。 按照某種文件系統(tǒng)類型格式化的一塊存儲介質(zhì)。我們常說在某個目錄下掛載或卸載文件系統(tǒng), 這里的文件系統(tǒng)就是這種意思。 內(nèi)核中負責(zé)管理和存儲
    的頭像 發(fā)表于 11-26 14:34 ?2482次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>文件系統(tǒng)</b>與持久性內(nèi)存

    嵌入式Linux開發(fā)之文件系統(tǒng)目錄結(jié)構(gòu)介紹

    前言Linux文件系統(tǒng),顧名思義:文件是數(shù)據(jù)的集合,文件系統(tǒng)不僅包含著文件中的數(shù)據(jù)而且還有文件系統(tǒng)
    發(fā)表于 11-01 16:31 ?3次下載
    嵌入式<b class='flag-5'>Linux</b>開發(fā)之<b class='flag-5'>文件系統(tǒng)</b>目錄<b class='flag-5'>結(jié)構(gòu)</b>介紹

    Linux 文件系統(tǒng)主要結(jié)構(gòu)

    Linux 文件系統(tǒng)體系結(jié)構(gòu)是一個對復(fù)雜系統(tǒng)進行抽象化的有趣例子。通過使用一組通用的 API 函數(shù),Linux 可以在許多種存儲設(shè)備上支持許
    的頭像 發(fā)表于 06-22 11:48 ?962次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>文件系統(tǒng)</b><b class='flag-5'>層</b>的<b class='flag-5'>主要</b><b class='flag-5'>結(jié)構(gòu)</b>

    適用于Linux的最佳通用文件系統(tǒng) Linux文件系統(tǒng)的安裝

    為您的計算機選擇正確的文件系統(tǒng)可能是一個困難的過程。您可能會想知道:為什么文件系統(tǒng)很重要?有沒有適用于安裝 Linux 的特定文件系統(tǒng)? 事實證明,有兩種
    發(fā)表于 08-03 10:22 ?316次閱讀
    適用于<b class='flag-5'>Linux</b>的最佳通用<b class='flag-5'>文件系統(tǒng)</b> <b class='flag-5'>Linux</b><b class='flag-5'>文件系統(tǒng)</b>的安裝

    Linux文件系統(tǒng)特點

    ,近期經(jīng)常被讀取和寫入,文件系統(tǒng)應(yīng)該有緩存。 文件應(yīng)該用文件夾的形式組織起來,方便管理和查詢。 Linux內(nèi)核要在自己的內(nèi)存里面維護一套數(shù)
    的頭像 發(fā)表于 11-09 14:48 ?1098次閱讀
    <b class='flag-5'>Linux</b>的<b class='flag-5'>文件系統(tǒng)</b>特點

    Linux文件系統(tǒng)的掛載過程

    Linux文件系統(tǒng)(rootfs)是Linux系統(tǒng)中所有其他文件系統(tǒng)和目錄的起點,它是內(nèi)核啟動時掛載的第一個
    的頭像 發(fā)表于 10-05 16:50 ?232次閱讀