探索檔案系統:高效、可靠的檔案管理與存取機制

2023-09-04 12:01:33

檔案系統的功能規劃

記憶體就像是一個書包,容量有限,只能帶著一部分東西。而圖書館則是一個專門儲存和管理檔案的地方,擁有更大的容量,並且可以永久儲存檔案。為了能夠快速找到需要的檔案,我們需要有一個書單來記錄每本書放在哪裡,這個書單就相當於檔案系統的索引區,記錄著檔案的位置和相關資訊。同時,為了提高存取效率,熱門借閱的書會放在最前面供大家選擇,避免每次都要去遠處找書。通過良好的檔案系統規劃,我們可以提高資料管理的效率和安全性,本文將通過類似於圖書館的組織和管理方式再一步一步的講解檔案是如何放入磁碟的、索引節點等這些知識點。

我們最常用的外部儲存就是硬碟,資料是以檔案的形式儲存在硬碟上的。為了有效地管理硬碟上儲存的檔案,在需要對檔案系統進行優化規劃前,以下是一些需要考慮的重要因素:

第一點,檔案系統應具備嚴格的組織形式,以便將檔案以塊的形式進行儲存。可以將其類比為圖書館中的書架排列,將書架劃分為小格子,以便存放不同專案的資料。另外,可以將其類比為MySQL資料庫,其中的記錄也是逐條儲存的。

第二點,檔案系統中也要有索引區,用來方便查詢一個檔案分成的多個塊都存放在了什麼位置。這可以類比為圖書館中設定的一排書架,上面清楚地標註了整個檔案庫中的資料以及它們在哪個書架的哪個格子上。這樣,在查詢資料時就不需要遍歷整個檔案庫,只需找到對應的書架,然後直接定位到目標書架即可。類似地,在MySQL資料庫中,當表的資料量較大時,需要使用索引來快速查詢資料記錄。

第三點,如果檔案系統中存在熱點檔案,經常被讀取和寫入,應該設定快取層。這類似於圖書館的熱門圖書區,裡面存放的是暢銷書或經常被借還的圖書。由於借還次數較多,不需要每次還書都放回遠處的書架上,可以專門設定一個區域,用於存放這些借還頻率高的圖書。這樣可以提高借還效率。類比到我們的Redis,它也是用來快取熱點資料,以免每次都需要查詢資料庫。

第四點,為了方便管理和查詢,檔案應該以資料夾的形式進行組織。這類似於圖書館中的資料分類,例如按計算機類、文學類、歷史類等進行分類。這樣可以更容易進行管理,專案組在借閱時只需在相應的分類中查詢即可。類比到我們的MySQL資料庫,一個業務的資料應該放在一個表中,每個表不應儲存其他業務資料。如果你提到目錄中可以再包含目錄,那在資料庫中實現方式是使用關聯表。

在檔案系統中,每個檔案都有一個名字,我們可以通過這個名字來存取檔案。檔名是一個普通的文字,但是由於不同使用者可能取相同的名字,所以檔名衝突是常見的情況。

為了有序地組織大量的檔案,我們可以將它們分組成目錄或資料夾的形式。這樣,一個資料夾可以包含其他資料夾和檔案,形成了一種樹形結構。通過將不同使用者放在不同的使用者目錄下,可以在一定程度上避免命名衝突的問題。

第五點是,Linux核心需要在記憶體中維護一個資料結構,用於記錄哪些檔案被哪些程序開啟和使用。這可以類比於圖書館的圖書管理系統,記錄了哪些書被借閱、由誰借閱、借閱時長以及何時歸還。

檔案系統的基本組成

一切皆檔案

檔案系統是作業系統的一個子系統,負責管理和儲存使用者的檔案資料到磁碟硬體中。它的主要作用是使得即使在計算機斷電的情況下,磁碟中的資料仍然可以被保留下來,實現了檔案的持久化儲存。簡單來說,檔案系統確保了使用者的檔案資料的長期儲存和可靠性。

檔案系統以檔案為基本資料單位,其目的是對磁碟上的檔案進行組織和管理。不同的組織方式會形成不同的檔案系統。舉一些常見的檔案系統例子:

  1. FAT32(File Allocation Table 32):FAT32是一種簡單的檔案系統,主要用於Windows作業系統。它使用檔案分配表(File Allocation Table)來跟蹤檔案的儲存位置。FAT32對檔名的長度有限制,檔名不能超過8個字元,並且不支援檔案的安全性和許可權控制。它在許多可移動儲存裝置(如快閃記憶體驅動器)上使用廣泛。
  2. NTFS(New Technology File System):NTFS是Windows作業系統中較新的檔案系統。它支援更大的檔案和分割區大小,並提供了更高階的安全性和許可權控制。NTFS還支援檔案的壓縮、加密和紀錄檔記錄,以提高資料的完整性和可靠性。
  3. ext4(Fourth Extended File System):ext4是Linux作業系統中常用的檔案系統。它是ext檔案系統家族的最新版本,支援更大的檔案和分割區大小,具有更好的效能和可靠性。ext4使用B樹資料結構來組織檔案和目錄,提供了較快的檔案查詢和存取速度。

當你將一個檔案從Windows系統傳輸到Linux系統時,檔案的原始格式和檔案系統可能會有所不同。例如,檔案可能是在Windows系統上使用NTFS檔案系統建立的,但在傳輸過程中,它以位元組流的形式進行傳輸,並在Linux系統上重新寫入。在這種情況下,Linux系統會根據所使用的檔案系統(如ext4)來重新組織和管理檔案。

在Linux中,有一句經典的話是「一切皆檔案」,這意味著不僅普通的檔案和目錄,而且塊裝置、管道、socket等都統一由檔案系統進行管理。

Linux檔案系統為每個檔案分配了兩個資料結構:索引節點(inode)和目錄項(directory entry)。索引節點記錄了檔案的元資訊,如許可權、所有者、大小等,而目錄項則記錄了檔案在目錄層次結構中的位置和名稱。這兩個資料結構並不是與檔案內容一起儲存的,而是由作業系統自行管理的一個區域。

索引節點(inode)用來記錄檔案的元資訊,包括inode編號、檔案大小、存取許可權、建立時間、修改時間以及資料在磁碟上的位置等。每個檔案都有唯一的索引節點,它們與檔案一一對應,並且被儲存在硬碟上,因此索引節點也會佔用磁碟空間。

目錄項(directory entry)用來記錄檔案的名稱、索引節點指標以及與其他目錄項的層級關係。多個目錄項的關聯形成了目錄結構。與索引節點不同的是,目錄項是由核心維護的資料結構,不存放於磁碟上,而是快取在記憶體中。

由於索引節點是檔案的唯一標識,而目錄項記錄著檔案的名稱,因此目錄項和索引節點之間是多對一的關係。換句話說,一個檔案可以有多個不同的目錄項指向相同的索引節點。例如,硬連結的實現就是多個目錄項中的索引節點指向同一個檔案。

請注意,目錄檔案也是通過索引節點來唯一標識的,與普通檔案有所不同之處在於,普通檔案在磁碟上儲存了實際的檔案資料,而目錄檔案在磁碟上儲存了子目錄或檔案的相關資訊。

目錄項和目錄是一個東西嗎?

首先肯定的是他倆不是一個東西,我們剛才說了,目錄項是作業系統維護的一個資料結構,儲存在快取中,它通過索引節點指標來定位和存取目錄或檔案。而目錄則是一個儲存在磁碟上的檔案,目錄項通過自己儲存的索引節點指標可以進一步找到目錄或者是檔案,

而且需要注意的是,由於磁碟上的檔案數量龐大,而記憶體空間有限,因此需要使用目錄項來進行快取,以提高對目錄的存取效率。目錄項會根據快取策略進行管理,不會一次性快取所有的目錄項。

那檔案資料是如何儲存在磁碟的呢?

磁碟讀寫的最小單位是磁區,磁區的大小隻有 512B 大小,很明顯,如果每次讀寫都以這麼小為單位,那這讀寫的效率會非常低。

所以,檔案資料在磁碟上以邏輯塊為單位進行儲存,每個邏輯塊由多個磁區組成,每次讀寫的最小單位就是邏輯塊(資料塊),在Linux中,邏輯塊的大小通常為4KB,相當於8個磁區。這將大大提高了磁碟的讀寫的效率。

索引節點是儲存在磁碟上的資料,為了加速檔案的存取,通常會將索引節點載入到記憶體中。磁碟在格式化時被分為三個儲存區域:超級塊、索引節點區和資料塊區。

  • 超級塊:用於儲存檔案系統的詳細資訊,如塊個數、塊大小和空閒塊數量等。超級塊在檔案系統掛載時會被載入到記憶體中。
  • 索引節點區:用於儲存索引節點。當檔案被存取時,相應的索引節點會被載入到記憶體中,以便快速存取檔案的後設資料。
  • 資料塊區:用於儲存檔案或目錄的實際資料。

由於無法將整個超級塊和索引節點區載入到記憶體中,只有在需要使用時才會將其載入進記憶體,它們載入進記憶體的時機是不同的:超級塊在檔案系統掛載時載入,而索引節點在檔案被存取時載入進記憶體。這樣的載入策略可以有效利用記憶體資源,並提高檔案系統的效能。

總結

在檔案系統的功能規劃中,塊是檔案以及檔案系統中資料儲存的基本單位。索引節點記錄了檔案的元資訊,包括檔案的許可權、大小、建立時間等。目錄項則記錄了檔案在目錄層次結構中的位置和名稱。

可以有多個不同的目錄項指向相同的索引節點,這樣可以在不同的目錄中通過不同的名稱存取同一個檔案。這種多對一的關係使得檔案系統更加靈活和高效。為了提高檔案存取效率,檔案系統還採用了快取策略。熱點檔案會被快取在記憶體中,以減少磁碟IO的次數。