文件系統的魔法:讓計算機理解并存儲你的數據
- 一. 文件系統
- 1.1 塊
- 1.2 分區
- 1.3 inode(索引節點)
- 二. ext2文件系統
- 2.1 認識文件系統
- 2.2 Block Group (塊組)
- 2.2.1 Block Group 的基本概念
- 2.2.2 Block Group 的作用
- 2.3 塊組內部結構
- 2.3.1 超級塊(Super Block)
- 2.3.2 GDT(Group Descriptor Table)
- 2.3.3 塊位圖(Block Bitmap)
- 2.3.4 inode位圖(Inode Bitmap)
- 2.3.5 inode表
- 2.3.6 Data Block(數據塊)
- 2.4 目錄與文件名
- 2.5 路徑解析
- 2.5.1 路徑解析與文件系統一致性
- 2.6 路徑緩存
- 2.7 掛載分區
- 三. 最后
本文將介紹文件系統的基本概念及其重要性。文件系統作為操作系統的一部分,負責管理存儲設備上的數據存儲、讀取和組織方式。它提供了一種高效且可靠的方法來存儲和檢索文件,使得操作系統能夠有效地管理大量數據。本文將從文件系統的基本架構、常見類型、以及其在實際應用中的表現和優化策略等方面展開討論,旨在幫助讀者理解文件系統如何支持現代計算環境中的數據存儲需求。
💬 歡迎討論:如果你在學習過程中有任何問題或想法,歡迎在評論區留言,我們一起交流學習。你的支持是我繼續創作的動力! 👍
點贊、收藏與分享:覺得這篇文章對你有幫助嗎?別忘了點贊、收藏并分享給更多的小伙伴哦!你們的支持是我不斷進步的動力! 🚀
分享給更多人:如果你覺得這篇文章對你有幫助,歡迎分享給更多對Linux OS感興趣的朋友,讓我們一起進步!
一. 文件系統
打開的文件被內存管理著,實際是進程通過相關數據結構將每個對象進行關聯;而未被打開的文件被保存在磁盤上,一般是未被打開的文件占據最多。
1.1 塊
文件系統塊(也稱為磁盤塊)是操作系統用來管理磁盤空間的基本單位。它的引入主要解決了兩個問題:一個是磁盤的訪問效率,另一個是存儲空間的管理。塊的大小最常見為4KB,即八個扇區組成一個塊。塊是文件存取的最小單位。
LBA(Logical Block Address)邏輯塊地址,本質是線性地址。
塊號=LBA/8,因為LBA是線性的像數組一樣,8個扇區是一個塊。
LBA=塊號*8+n(n指的是指定扇區的第幾個位置)。
1.2 分區
文件系統分區是指將磁盤劃分為多個邏輯上獨立的區域,每個區域可以格式化為獨立的文件系統,用于存儲數據和文件。分區的引入主要是為了提高磁盤的管理效率,優化存儲空間的利用,同時也增強了系統的安全性和可擴展性。通過分區,操作系統能夠在同一物理磁盤上為不同類型的數據提供不同的存儲環境,例如操作系統、應用程序和用戶數據可以分別存儲在不同的分區中,從而避免它們之間的相互干擾。每個分區可以使用不同的文件系統格式(如NTFS、FAT32、ext4等),以滿足不同需求的性能和功能要求。此外,分區還可以提供數據隔離,一旦一個分區發生故障,其他分區的數據不會受到影響,增加了數據的安全性。通過分區,系統管理員可以更方便地管理磁盤,進行備份、恢復或擴展,也便于磁盤的高效利用和性能優化。
1.3 inode(索引節點)
文件=內容(數據)+ 屬性,文件的內容存儲在哪里呢???存在inode表中。
查看inode的命令格式:
ls -li
- 示例:
ls usercode.c -li
1061373 -rw-rw-r-- 1 wch_1 wch_1 404 Apr 12 17:37 usercode.c
- 1061273:inode編號
- -rw-rw-r-- :權限
- 1:硬鏈接數
- wch_1 :擁有者
- wch_1:所屬組
- 404:文件大小
- Apr 12 17:37:最近修改時間
- usercode.c:文件名
還有另一個方式:stat 文件名
- 示例:
stat usercode.c
inode是文件的唯一標識符,有且僅有一個,叫做inode號。
二. ext2文件系統
前言:文件系統有很多的分類,如:
- ext3/ext4: Linux 中廣泛使用的文件系統,ext4 是其更先進的版本,支持更大的文件系統和更高效的數據存儲。
- JFS(Journaled File System): IBM 開發的日志文件系統,廣泛應用于高性能服務器。
- ReiserFS: 另一個支持日志的文件系統,主要用于 Linux 系統。
雖然文件種類很多,本文章主要以ext2文件系統為例。
2.1 認識文件系統
文件系統的目的是組織和管理硬盤上的文件,確保文件能夠在磁盤上高效、安全地存儲和訪問。格式化硬盤是將硬盤轉化為特定文件系統的過程,這樣硬盤就能夠被操作系統識別并使用。文件系統的設計和選擇影響文件存儲的性能、安全性以及后續的擴展能力,因此根據應用需求選擇合適的文件系統非常重要。
“只要能管理一個分區,就能管理所有分區,也就能管理所有磁盤文件” 這句話的含義是:ext2 文件系統通過將硬盤分區劃分成多個相同大小的塊組來管理數據,每個塊組都有獨立的管理機制。只要操作系統能夠理解和管理一個分區中的塊組結構,它就能通過相同的方式管理其他分區和整個磁盤中的所有文件。這個設計使得文件系統管理的過程更加簡潔和高效,便于擴展。
上面可以看到分區的前面存在Boot Sector。下面將介紹一下它。
- Boot Sector(啟動扇區)
Boot Sector(啟動扇區)是計算機存儲設備(如硬盤、固態硬盤、U盤等)上的一個特殊區域,用于存放引導操作系統的相關信息。它是系統啟動過程中的重要組成部分,負責將操作系統加載到內存并開始執行。
- Boot Sector 是存儲設備上的特殊區域,負責啟動操作系統。
- 在傳統的 BIOS 系統中,它通常指的是 MBR,包含引導程序和分區表信息。
- 在現代的 UEFI 系統中,啟動信息存儲在 EFI System Partition (ESP) 中。
- Boot Sector 是計算機啟動過程的關鍵,確保操作系統能夠加載并執行。
2.2 Block Group (塊組)
Block Group 是一種用于文件系統中存儲和組織數據的結構,尤其在 ext2、ext3 和 ext4 等文件系統中應用廣泛。它是一種將文件系統數據劃分成更小單元的方式,以便提高磁盤訪問的效率并確保數據的組織性。
2.2.1 Block Group 的基本概念
在 ext2/3/4 文件系統中,磁盤分區(或硬盤)被劃分為多個 Block Group。每個 Block Group 是磁盤上的一個邏輯單位,通常由以下幾個部分組成:
- 數據塊(Data Blocks): 存儲文件的實際數據。
- inode 表(Inode Table): 存儲文件的元數據,如文件的權限、大小、創建時間等信息。
- 超級塊(Superblock): 存儲關于文件系統的總體信息,如文件系統的大小、已用空間、剩余空間等。
- 塊位圖(Block Bitmap): 用于標記哪些數據塊是空閑的,哪些是已經使用的。
- inode 位圖(Inode Bitmap): 用于標記哪些 inode 是空閑的,哪些是已經使用的。
2.2.2 Block Group 的作用
Block Group 的設計目的有幾個,主要包括以下幾點:
- 提高訪問效率: 將硬盤分為多個 Block Group 有助于提高文件系統的性能。每個 Block Group 內的數據結構相對獨立,這樣操作系統可以更快地定位文件。每個塊組中的 inode 表 和 數據塊盡量靠近,這樣可以減少磁盤尋道時間,提高文件讀取速度。
- 避免碎片化: 通過將文件的 inode 和 數據塊 組織在同一個塊組內,ext系列文件系統能有效地減少碎片化。這樣,文件的數據和它的元數據被存放在同一塊區域,讀寫操作更加連續,減少了由于尋址不連續帶來的磁盤碎片。
- 管理和分配空間 :每個 Block Group 都有一個獨立的位圖,標記數據塊和 inode
的使用情況。這使得文件系統可以靈活地管理磁盤空間,減少不必要的磁盤訪問和沖突。在一個文件系統中,如果所有數據都集中在一個大塊區域,訪問時可能需要更多的尋址和空間管理,使用Block Group 的方法可以使得空間管理更加高效。 - 容錯性與恢復:由于文件系統是通過多個塊組管理磁盤空間,一些塊組發生錯誤時,其他塊組仍然能夠正常工作,這提高了文件系統的容錯性。損壞的塊組可以通過文件系統的修復工具進行恢復,而不必影響整個磁盤。
下面將詳細介紹塊組內部的結構即功能。😆
2.3 塊組內部結構
2.3.1 超級塊(Super Block)
Superblock(超級塊)是文件系統中的一個重要結構,負責存儲有關文件系統的元數據。它是文件系統的核心部分之一,用于描述文件系統的總體信息,包括文件系統的大小、空閑空間、塊的大小、文件系統的狀態等。每個文件系統都有一個 超級塊,它是文件系統結構的關鍵。
Superblock 的作用
Superblock 存儲了文件系統的基本信息,這些信息對于文件系統的運行和維護至關重要。它主要包括以下內容:
- 文件系統的總大小: 文件系統的總大小(以字節為單位)以及文件系統使用的總塊數。
- 塊大小(Block Size): 文件系統中每個塊的大小(通常為 512 字節、1 KB、2 KB、4 KB等)。塊大小決定了文件系統數據存儲的最小單位。
- 空閑空間的信息: 包括文件系統中空閑塊的數量、空閑 inode 的數量等。這些信息用于文件分配和空間管理。
- inode 信息: 包括文件系統總共有多少個 inode、每個 inode 占用多少空間,以及 inode 表的位置等。
- 文件系統狀態: 用于記錄文件系統的健康狀態(如是否需要修復),并存儲文件系統的版本信息。
- 文件系統的創建時間、最后掛載時間、文件系統的版本等: 用于文件系統管理和維護。
- 塊位圖(Block Bitmap)和 inode 位圖(Inode Bitmap)的狀態信息: 用于跟蹤哪些數據塊和 inode是空閑的,哪些已經被分配。
一個超級塊存在很多備份,防止丟失,可以系統調用(如 Linux 中的 fsck 命令)來檢查和修復文件系統。在文件系統損壞時,fsck 會使用 superblock 中的信息來嘗試恢復文件系統的狀態。
總結:
Superblock 是文件系統中最重要的數據結構之一,它包含文件系統的總體配置信息、空閑空間、inode 信息等。文件系統的初始化、掛載、空間管理、數據恢復等操作都離不開 superblock 的幫助。在文件系統損壞或異常的情況下,superblock 還提供了修復文件系統所需要的關鍵數據。
2.3.2 GDT(Group Descriptor Table)
塊組描述表(Block Group Descriptor Table) 是在一些文件系統中用于管理塊組(Block Group)信息的數據結構,尤其是在 ext2、ext3、ext4 等文件系統中,塊組描述表是管理磁盤空間的核心部分之一。
用于描述塊組的屬性信息,塊組與塊組描述符一一對應。
塊組描述表的結構
在 ext2、ext3 和 ext4 文件系統中,塊組描述表的每個條目通常包含以下信息:
- 塊組的起始地址(Block Group Start Address): 用于表示該塊組在磁盤上的物理起始位置。
- 數據塊位圖的地址(Block Bitmap): 存儲塊組內所有數據塊的分配情況。它是一個位圖,每一位代表一個數據塊,0 表示空閑,1表示已分配。
- inode 位圖的地址(Inode Bitmap): 存儲塊組內所有 inode 的分配情況。它同樣是一個位圖,每一位表示一個inode,0 表示空閑,1 表示已分配。
- inode 表的地址(Inode Table): 存儲該塊組內所有 inode 的數據結構,每個 inode
包含一個文件的元數據。文件的創建、刪除、修改等操作都與 inode 表的管理緊密相關。 - 塊組的空閑塊數(Free Block Count): 記錄該塊組內空閑數據塊的數量。
- 塊組的空閑 inode 數量(Free Inode Count): 記錄該塊組內空閑 inode 的數量。
- 已分配的目錄項數(Used Directory Count): 記錄該塊組中目錄 inode
的數量,這對于管理文件系統中的目錄結構非常重要。
塊組描述表與超級塊的關系
超級塊 和 塊組描述表 是密切相關的。在 ext2/3/4 文件系統中,超級塊 存儲文件系統的整體信息,如文件系統的總大小、塊大小、inode 數量等,而 塊組描述表 則存儲每個塊組的管理信息。超級塊會包含一個指向塊組描述表的指針,操作系統通過這個指針來訪問并更新塊組的狀態。
2.3.3 塊位圖(Block Bitmap)
Block Bitmap中記錄著Data Block中哪個數據塊已經被占?,哪個數據塊沒有被占?。
2.3.4 inode位圖(Inode Bitmap)
每個bit表??個inode是否空閑可?。
2.3.5 inode表
- 存放?件屬性 如 ?件??,所有者,最近修改時間等
- 當前分組所有Inode屬性的集合
- inode編號以分區為單位,整體劃分,不可跨分區
2.3.6 Data Block(數據塊)
Data Block(數據塊)是文件系統中用于存儲實際文件內容的最小單位。它是文件系統中存儲數據的基本結構。每個 Data Block 都包含文件的實際數據,而不僅僅是元數據(如文件的權限、所有者、修改時間等),這些元數據通常存儲在 inode(索引節點)中。數據塊使得文件系統能夠高效地管理和存儲文件內容。
思考:知道inode號的情況下,在指定分區,請解釋:對?件進?增、刪、查、改是在
做什么?
- 查(查找文件):查找inode,通過inode指針訪問數據塊。
- 增(增添數據):查找數據塊(通過塊位圖和inode位圖查找空閑的數據塊),修改inode,寫入數據。
- 刪(刪除文件):查找inode和數據塊,釋放數據塊和inode,同時更改目錄項。
- 改(修改文件):查找inode,更新數據塊同時修改文件大小。
上述文件系統結構還是沒看到文件名存在哪里???它存在哪里呢?下面將揭曉此答案。
2.4 目錄與文件名
目錄保存的內容是:文件名與inode號的映射關系。
OS會記錄當前的工作路徑,通過文件名與映射關系深度進行路徑解析。
2.5 路徑解析
路徑解析 是操作系統和文件系統用來確定文件或目錄在存儲介質(如硬盤)上的位置的過程。路徑解析的目的是從文件的路徑名稱中找到與其對應的 inode,并通過文件系統中的目錄結構和索引節點,最終定位到實際的數據塊(Data Block)。在這個過程中,操作系統需要解析給定的文件路徑,找到文件的 inode 號,然后通過這個 inode 號 獲取文件的元數據以及文件的存儲位置。
2.5.1 路徑解析與文件系統一致性
文件系統需要確保在路徑解析過程中保持一致性。例如,在路徑解析時,如果文件或目錄被刪除或移動,操作系統需要更新目錄項和 inode 信息,以保持文件系統的一致性和可靠性。很多現代文件系統通過 日志記錄(journaling) 或 寫時復制(Copy-on-Write) 技術確保路徑解析和其他文件系統操作的原子性。
總結
路徑解析是操作系統查找文件或目錄在文件系統中的過程。根據給定的路徑(無論是絕對路徑還是相對路徑),操作系統逐級查找目錄項并通過 inode 號 獲取文件的元數據和數據塊。在符號鏈接存在的情況下,路徑解析還需要處理鏈接的目標路徑。路徑解析涉及到文件系統中的 目錄項 和 inode 表,并通過它們來定位文件的實際內容。
2.6 路徑緩存
訪問任何文件到要從/目錄開始進行路徑解析嗎?原則上是,實際LinuxOS會緩存歷史的路徑結構,存在于一個數據結構對象struct dentry,本質上是一個多叉樹結構。所有文件都有dentry結構,所有被打開的文件就可以在內存中形成樹形結構。
2.7 掛載分區
掛載分區是將物理磁盤分區、光盤、USB 驅動器等存儲設備與操作系統的文件系統結構相連接的過程。一旦掛載,操作系統可以將該分區或設備的文件與其它文件進行交互,就像它們是計算機本地的文件一樣。掛載后,文件系統中的路徑可以直接訪問該分區的數據。
本人理解:實際就是將需要訪問的設備或數據尾插入到目錄,
- 掛載命令
在大多數 Linux 系統中,可以使用 mount 命令掛載分區。基本的掛載命令格式如下:
mount <設備文件> <掛載點>
例如,要將設備 /dev/sdb1 掛載到 /mnt/usb 目錄,可以使用以下命令:
sudo mount /dev/sdb1 /mnt/usb
- 掛載選項
mount 命令可以使用不同的選項來控制掛載過程。例如:
-t:指定文件系統類型,如 ext4、ntfs、vfat 等。例如:
sudo mount -t ext4 /dev/sdb1 /mnt/usb
-o:指定掛載選項,如只讀(ro)、讀寫(rw)、設置文件權限等。例如:
sudo mount -o ro /dev/sdb1 /mnt/usb
-a:掛載 /etc/fstab 中列出的所有文件系統。例如:
sudo mount -a
總結:掛載分區 是將物理分區或設備連接到操作系統目錄結構中的過程,使得分區上的文件和目錄能夠在操作系統中被訪問。
- 使用 mount 命令可以將設備掛載到指定的目錄,掛載成功后,文件系統中的路徑就能訪問分區數據。
- 可以通過 /etc/fstab 配置文件設置自動掛載,確保分區在系統啟動時自動掛載。
- 卸載分區 使用 umount 命令,這樣可以確保文件系統完整性。
- 通過掛載分區,操作系統能夠靈活地管理不同存儲設備,使得用戶能夠方便地訪問各類存儲介質上的數據。
三. 最后
本文介紹了文件系統的基本概念及其在操作系統中的重要性。文件系統通過分區、塊、inode等結構管理磁盤上的數據,并提供高效的數據存儲與訪問方式。重點講解了ext2 文件系統,介紹了其基本架構、塊組(Block Group)的設計與作用,以及 超級塊、GDT、inode 位圖 和 數據塊等組成部分。文件路徑解析和文件名映射也被詳細說明,強調了操作系統如何通過 inode號定位文件數據塊。最后,介紹了如何掛載分區,使不同存儲設備的數據能與文件系統結構連接,便于訪問和管理。
路雖遠,行則將至;事雖難,做則必成
親愛的讀者們,下一篇文章再會!!! \color{Red}親愛的讀者們,下一篇文章再會!!! 親愛的讀者們,下一篇文章再會!!!