「大數據」(一百零三)文件系統介紹和分類

【導讀:數據是二十一世紀的石油,蘊含巨大價值,這是·情報通·大數據技術系列第[103]篇文章,歡迎閱讀收藏】

1 基本概念

Linux 中的各種事物都可看作是文件,比如像文檔、目錄( Mac OS X 和 Windows 系統下稱之為文件夾)、鍵盤、監視器、硬盤、可移動媒體設備、打印機、調制解調器、虛擬終端,還有進程間通信( IPC )和網絡通信等輸入 / 輸出資源等等,這些種類繁多的文件被 Linux 使用目錄樹管理。 Linux 的文件類型,可以分為普通文件、目錄文件、符號鏈接文件、塊設備和字符設備文件、 FIFO 、套接字等,這些文件在一起構成了 Linux 的文件體系,讓 Linux 可以方便的使用系統資源。

本文要介紹的,主要是文件系統,文件系統涵蓋的內容比文件體系少, Linux 文件體系主要在於把操作系統相關的東西用文件這個載體實現:文件系統掛載在操作系統上,操作系統整個系統又放在文件系統裡。 Linux 操作系統支持很多不同的文件系統,比如 ext2 、 ext3 、 XFS 、 FAT 等等, Linux 通過 VFS (虛擬文件系統)訪問和管理各種不同的文件系統。

「大數據」(一百零三)文件系統介紹和分類

2 術語解釋

Linux 目錄樹:對 Linux 系統和用戶來說,所有可操作的計算機資源都存在於目錄樹這個邏輯結構中,對計算機資源的訪問都可以認為是目錄樹的訪問。就硬盤來說,所有對硬盤的訪問都變成了對目錄樹中某個節點也就是文件夾的訪問,訪問時不需要知道它是硬盤還是硬盤中的文件夾。目錄樹的邏輯結構也非常簡單,就是從根目錄( / )開始,不斷向下展開各級子目錄。

VFS : VFS 的作用就是採用標準的 Unix 系統調用讀寫位於不同物理介質上的不同文件系統。 VFS 是一個可以讓 open() 、 read() 、 write() 等系統調用不用關心底層的存儲介質和文件系統類型就可以工作的通用接口層。

iNode: ( 發音: eye-node) 譯成中文就是索引節點,它用來存放檔案及目錄的基本信息,包含時間、檔名、使用者及群組等。

3 詳細說明

3.1 文件系統介紹

3.1.1 文件系統的創建

Linux 系統的硬盤需要經過硬盤分區,然後格式化分區來創建文件系統。 Ext2 「基於 inode 的文件系統」是標準的 Linux 文件系統,一個文件由一個目錄項、 iNode 和數據區域塊組成。目錄項包括文件名和 inode 節點號。 iNode 包含文件的屬性 ( 如讀寫屬性、 owner 等,以及指向數據塊的指針 ) ,數據區域塊則是文件內容。當查看某個文件時,會先從 iNode table 中查出文件屬性及數據存放點,再從數據塊中讀取數據。

目錄項 : 包括文件名和 inode 節點號。

Inode :又稱文件索引節點,是文件基本信息的存放地和數 據塊指針存放地。

數據塊:文件的具體內容存放地。

1) 我們知道一般操作系統的文件數據除了文件實際內容外, 還帶有很多屬性,例如 Linux 操作系統的文件權限 (rwx) 與文件屬性 ( 擁有者、群組、 時間參數等 ) ,文件系統通常會將屬性和實際內容這兩部分數據分別存放在不同的區塊

2) 在基於 inode 的文件系統中,權限與屬性放置到 inode 中,實際數據放到 data block 區塊中,而且 inode 和 data block 都有編號。

「大數據」(一百零三)文件系統介紹和分類

Ext2 文件系統在此基礎上

1) 文件系統最前面有一個啟動扇區 (boot sector)

a) 這個啟動扇區可以安裝開機管理程序, 這個設計讓我們能將不同的引導裝載程序安裝到個別的文件系統前端,而不用覆蓋整個硬盤唯一的 MBR , 也就是這樣才能實現多重引導的功能

2) 把每個區進一步分為多個塊組 (block group) ,每個塊組有獨立的 inode/block 體系

a) 如果文件系統高達數百 GB 時,把所有的 inode 和 block 通通放在一起會因為 inode 和 block 的數量太龐大,不容易管理

b) 這其實很好理解,因為分區是用戶的分區,實際計算機管理時還有個最適合的大小,於是計算機會進一步的在分區中分塊

c) (但這樣豈不是可能出現大文件放不了的問題?有什麼機制善後嗎?)

3) 每個塊組實際還會分為分為 6 個部分,除了 inode table 和 data block 外還有 4 個附屬模塊,起到優化和完善系統性能的作用

所以整個分區大概會這樣劃分:

「大數據」(一百零三)文件系統介紹和分類

inode table

1) 主要記錄文件的屬性以及該文件實際數據是放置在哪些 block 中,它記錄的信息至少有這些:

a) 大小、真正內容的 block 號碼(一個或多個)

b) 訪問模式 (read/write/excute)

c) 擁有者與群組 (owner/group)

d) 各種時間:建立或狀態改變的時間、最近一次的讀取時間、最近修改的時間

e) 沒有文件名!文件名在目錄的 block 中!

2) 一個文件佔用一個 inode ,每個 inode 有編號

3) Linux 系統存在 inode 號被用完但磁盤空間還有剩餘的情況

4) 注意,這裡的文件不單單是普通文件,目錄文件也就是文件夾其實也是一個文件,還有其他的也是

5) inode 的數量與大小在格式化時就已經固定了,每個 inode 大小均固定為 128 bytes ( 新的 ext4 與 xfs 可設定到 256 bytes)

6) 文件系統能夠建立的文件數量與 inode 的數量有關,存在空間還夠但 inode 不夠的情況

7) 系統讀取文件時需要先找到 inode ,並分析 inode 所記錄的權限與使用者是否符合,若符合才能夠開始實際讀取 block 的內容

8) inode 要記錄的資料非常多,但偏偏又只有 128bytes , 而 inode 記錄一個 block 號碼要花掉 4byte ,假設我一個文件有 400MB 且每個 block 為 4K 時, 那麼至少也要十萬條 block 號碼的記錄! inode 哪有這麼多空間來存儲?為此我們的系統很聰明的將 inode 記錄 block 號碼的區域定義為 12 個直接,一個間接 , 一個雙間接與一個三間接記錄區(詳細見附錄)

data block

1) 放置文件內容數據的地方

2) 在格式化時 block 的大小就固定了,且每個 block 都有編號,以方便 inode 的記錄

a) 原則上, block 的大小與數量在格式化完就不能夠再改變了 ( 除非重新格式化 )

3) 在 Ext2 文件系統中所支持的 block 大小有 1K, 2K 及 4K 三種,由於 block 大小的區別,會導致該文件系統能夠支持的最大磁盤容量與最大單一文件容量各不相同:

a) Block 大小 1KB 2KB 4KB

b) 最大單一檔案限制 16GB 256GB 2TB

c) 最大檔案系統總容量 2TB 8TB 16TB

4) 每個 block 內最多隻能夠放置一個文件的資料,但一個文件可以放在多個 block 中(大的話)

5) 若文件小於 block ,則該 block 的剩餘容量就不能夠再被使用了 ( 磁盤空間會浪費 )

a) 所以如果你的檔案都非常小,但是你的 block 在格式化時卻選用最大的 4K 時,可能會產生容量的浪費

b) 既然大的 block 可能會產生較嚴重的磁碟容量浪費,那麼我們是否就將 block 大小定為 1K ?這也不妥,因為如果 block 較小的話,那麼大型檔案將會佔用數量更多的 block ,而 inode 也要記錄更多的 block 號碼,此時將可能導致檔案系統不良的讀寫效能

c) 事實上現在的磁盤容量都太大了,所以一般都會選擇 4K 的 block 大小

superblock

1) 記錄整個文件系統相關信息的地方,一般大小為 1024bytes ,記錄的信息主要有:

a) block 與 inode 的總量

b) 未使用與已使用的 inode / block 數量

c) 一個 valid bit 數值,若此文件系統已被掛載,則 valid bit 為 0 ,若未被掛載,則 valid bit 為 1

d) block 與 inode 的大小 (block 為 1, 2, 4K , inode 為 128bytes 或 256bytes) ;

e) 其他各種文件系統相關信息: filesystem 的掛載時間、最近一次寫入資料的時間、最近一次檢驗磁碟 (fsck) 的時間

2) Superblock 是非常重要的, 沒有 Superblock ,就沒有這個文件系統了,因此如果 superblock 死掉了,你的文件系統可能就需要花費很多時間去挽救

3) 每個塊都可能含有 superblock ,但是我們也說一個文件系統應該僅有一個 superblock 而已,那是怎麼回事?事實上除了第一個塊內會含有 superblock 之外,後續的塊不一定含有 superblock ,而若含有 superblock 則該 superblock 主要是做為第一個塊內 superblock 的備份,這樣可以進行 superblock 的救援

Filesystem Description

1) 文件系統描述

2) 這個區段可以描述每個 block group 的開始與結束的 block 號碼,以及說明每個區段 (superblock, bitmap, inodemap, data block) 分別介於哪一個 block 號碼之間

block bitmap

1) 塊對照表

2) 如果你想要新增文件時要使用哪個 block 來記錄呢?當然是選擇「空的 block 」來記錄。那你怎麼知道哪個 block 是空的?這就得要通過 block bitmap 了,它會記錄哪些 block 是空的,因此我們的系統就能夠很快速的找到可使用的空間來記錄

3) 同樣在你刪除某些文件時,那些文件原本佔用的 block 號碼就得要釋放出來, 此時在 block bitmap 中對應該 block 號碼的標誌位就得要修改成為「未使用中」

inode bitmap

1) 與 block bitmap 是類似的功能,只是 block bitmap 記錄的是使用與未使用的 block 號碼, 至於 inode bitmap 則是記錄使用與未使用的 inode 號碼

3.2 文件系統的分類

Linux 啟動時,第一個必須掛載的是根文件系統;若系統不能從指定設備上掛載根文件系統,則系統會出錯而退出啟動。之後可以自動或手動掛載其他的文件系統。因此,一個系統中可以同時存在不同的文件系統。

不同的文件系統類型有不同的特點,因而根據存儲設備的硬件特性、系統需求等有不同的應用場合。在嵌入式 Linux 應用中,主要的存儲設備為 RAM(DRAM, SDRAM) 和 ROM( 常採用 FLASH 存儲器 ) ,常用的基於存儲設備的文件系統類型包括: jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs 等。


分享到:


相關文章: