Linux 文件系統基礎知識補充

linux 文件管理簡介

一個文件系統的功能是什麼?

1、 創建、刪除、打開、讀取、寫入等文件操作

2、 文件要以一定的方式進行組織管理,比如目錄結構等形式

文件系統的底層依託 是 可以存儲東西的存儲器,比如內存、硬盤等存儲器。

常見的文件系統

ext3 和 ext4

block

硬盤被分爲若干個 block,一個 block 的大小爲 4KB。

通過 block 位圖來標記一個 block 是否空閒,也就是一個 block ,4K, 有 4 * 1024 * 8 個 bit ,可以表示 128M 的空間。

每次分配的時候,從位圖中找到一個 位圖中爲 0 的對應的 block,並將其位圖中的 bit 置爲 1

每次回收的時候,將位圖中對應的 bit 置爲 0,

inode

一個文件和文件夾都是對應着一個 inode。

每個 Inode 都有一個唯一的 ID。

inode 中記錄了文件對應的詳細信息,比如 id,更改時間、所屬用戶、所屬組等信息,以及對應的存儲的 block 信息。

文件的具體內容和屬性是分開存放的,屬性存放在 inode 中,具體的內容可以通過 inode 中的指針進行讀取。

inode 中通過 inode 位圖來標識一個 inode 是否空閒。

位圖存在一個 block 中,也就是說一個 block 可以記錄 410248 個 inode 的狀態

塊組

block 位圖 + inode 位圖 + 對應的 inode 列表 + 對應的 block 稱爲 一個 塊組

塊組描述符表

一個硬盤可以分爲 多個 塊組,通過塊組描述符表來記錄對應的塊組信息。

讀取 一個塊組描述符 可以快速得出對應的塊組的 inode 和 block 的信息,比如空閒 block 的個數、空閒 inode 的個數。block 位圖的地址範圍、inode 位圖地址的範圍等信息。

超級塊

超級塊中記錄了整個文件系統中的信息,比如 block 的大小,inode 的大小,文件系統中可用的 inode 個數、文件系統中可用的 block 的個數。塊組描述符列表的地址範圍。

文件系統結構圖

ext3 和 ext4 中文件具體信息存放的方式不一樣。

ext3 架構圖

ext3 中,每個 innode 對應着 block 數組,前 12 個爲直接映射,後 3 個爲間接映射。

ext4 的架構圖

ext3 有一個缺點:當組織大文件的時候,每個 block 都用一個記錄項來記錄,會導致索引項增多,索引項會額外浪費空間,而且會降低大文件的讀取效率。

ext4 通過一個多叉樹來組織大文件,分爲葉子節點和非葉子節點,非葉子節點用來記錄索引信息,而葉子節點用來記錄實際的 block 信息,不會挨個記錄,而是通過 start 和 end 開始和結束地址來記錄若干個 block,提高大文件的讀取效率。

目錄

一個操作系統中存在很多個文件,怎麼有效的管理文件呢?

Linux 採用的樹狀結構,也就是目錄結構,通過目錄來管理文件

這裏面有一個非常關鍵的問題,目錄怎麼存儲。

在 Linux 中,目錄也被當作一個文件,也有對應的 inode,只不過目錄文件中存儲的是目錄下的文件和目錄信息

爲了快速的在目錄文件中檢索對應的文件或者目錄,引入了 哈希索引,通過對文件或者目錄名字來進行哈希,每個哈希值對應的有一個塊號,對應的塊中存儲的有對應的文件信息和目錄信息。

通過對文件名字進行哈希值可以快速找到對應的塊號。

硬鏈接和軟鏈接

虛擬文件系統 VFS

Linux 中一切皆文件,無論是塊設備、共享內存、socket、字符設備、進程信息都可以通過操作文件的的統一接口來訪問對應的資源,比如 open()、read()、write()。這就依靠於 Linux 的虛擬文件系統 VFS

掛載 mount

塊設備、內存、字符設備等要想被使用,都要有一定的文件系統,然後將其掛載到 Linux 中的目錄中。

這個目錄可以是根目錄,也可以是其他文件系統下的目錄。

這些掛載信息被保存在根分區中,在 Linux 初始化的時候被取出,加載到內存中。

根分區是用來引導 Linux 加載的,是必須的,根分區會掛載到根目錄 /。

掛載信息中記錄了對應的文件系統的超級塊信息、以及對應的掛載目錄信息。

內存中會維護一個目錄樹,最一開始之後只有根目錄,通過掛載信息中的文件系統超級塊信息和掛載目錄信息,就可以逐漸的擴展目錄樹。

訪問文件

Linux 需要通過 一個文件路徑 來 訪問對應的文件。

首先獲取根目錄對應的 inode,然後通過根目錄的 inode 獲取對應的目錄信息和文件信息, 通過遍歷根目錄中的目錄來找到二級目錄對應的 inode,就這樣不斷的向下尋找就可以找到對應的文件的 inode 了。

FD 就是進程的文件描述符表的對應的文件記錄的索引下標,是一個非負的整數

通過 inode 中的設備編號和對應的驅動程序,就可以通過驅動程序 + inode 的文件信息,就可以對文件進行操作了。

這樣就實現了 VFS 的功能了,虛擬文件管理。進程只需要通過 open()、read() 和 fd 就可以操作對應的文件了。

值得注意的是,當讀取文件的時候,有以下兩個步驟:

文件緩存

內存和磁盤都是分頁來進行管理的,也就是 4K,寫入磁盤或者讀取文件的時候,也是按照 來讀取。

爲了減少訪問磁盤的次數,Linux 在內核空間開啓了一片內存作爲緩存,然後將讀取的文件按照 page 放入到緩存中,當再次需要該文件對應的 page 的時候,會先查看緩存中是否存在對應的 page,如果存在,直接從緩存拷貝到用戶態。如果不存在,纔會訪問磁盤。

當寫對應的 page 的時候,先將其寫入到緩存中,等待系統或者用戶調用 sync(),纔將文件寫入到磁盤上。當文件寫入到緩存中後,對應的緩存就爲髒頁了,在內存緊張的時候,或者刷盤的時候,會將其寫入到磁盤中。

緩存中的 page 是通過 inode 和對應的偏移 offset 來唯一標識的

來源: https://blog.csdn.net/qq_40276626/article/details/120478538

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/-8G8OC47SsLOLka5-mkHNA