前面咱們談了Linux的進程管理和內存體系:node
這一節咱們將談下Linux的文件系統服務器
Linux做爲開源操做系統,最大的優點是它能夠支持各種文件系統。現代的Linux內核可以支持幾乎每種文件系統,從基礎的FAT到高性能的日誌文件系統(JFS)都能能夠。數據結構
由於目前Linux的發行版本中,Readhat系(開源版本是Centos)和debian系(你們熟知的Ubuntu)比較流行,因此後面會重點介紹下Readhat系用的xfs文件系統和ext4文件系統。post
虛擬文件系統(VFS)是一個處於用戶進程和各種文件系統之間的抽象接口層,VFS提供訪問文件系統對象的通用對象模型(例如,i-node、文件對象、頁緩存、)和方法,它對用戶進程隱藏了各類文件系統的差異。正是由於有VFS,因此用戶進程不用關心使用的是那種文件系統,也更不須要知道各個文件系統應該使用哪一個系統調用。下圖顯示了VFS的概況:性能
在開始介紹各個文件系統前,先介紹一個概念:日誌ui
在非日誌文件系統上,當執行寫操做時,內核先修改文件系統的元數據,而後寫入實際的用戶數據。這個操做可能會丟失數據的完整性。若是在寫入文件系統元數據的時候系統忽然崩潰,文件系統的一致性就可能被破壞。fsck會在下次啓動時檢查全部的元數據,並修復文件系統上的不一致,可是若是卷特別大的時候,這個修復過程就會變得很漫長,只能乾等着fsck工做完以後才能使用這系統。spa
日誌文件系統解決了這個問題,在寫入實際的文件系統以前,他先把要修改的數據寫入一個叫作日誌區域(journal area)的地方。日誌區域能夠在文件系統上,也能夠不在文件系統上。寫入日誌區域的數據叫作日誌記錄(joutnal log)。若是系統支持的話,它內容包括文件系統元數據和真正的文件數據。操作系統
由於在寫入真正用戶數據以前要寫記錄日誌,和非日誌文件系統相比會產生性能開銷。維護數據高度一致性所犧牲的性能開銷大小,取決於在寫入用戶數據以前要寫入多少信息到磁盤上。
Ext2是一個簡單和快速的文件系統,沒有日誌功能。下圖展現了Ext2的文件系統數據結構:
文件系統由一個引導扇區(boot sector)開始,後面跟着塊組(block groups)。整個文件系統被分紅許多小塊組來得到高性能,由於i-node表和保存用戶數據的數據塊駐留在較前的磁盤,因此節約尋址時間。一個塊組包含以下項目:
+ 超級塊(Super block) 磁盤上信息存放在這裏,超級塊的副本保存在每一個塊組的頂部。
+ 塊組描述符(Block group descriptor) 塊組的信息存在這裏
+ 數據塊位圖(Data block bitmaps) 空閒塊管理
+ i-node位圖(i-node bitmaps) 空閒i-node管理
+ i-node表(i-node tables) 存放i-node表。每一個文件都有相應的i-node表,存放文件的元數據,譬如文件
模式、uid、gid、atime、ctime、mtime、dtime和數據塊的指針。
+ 數據塊(Data blocks) 存放真正的用戶數據。
複製代碼
如何訪問數據?
爲了找到組成文件的數據塊,內核首先搜索文件的i-node。在接到進程打開/var/log/messages 文件的請求時,內核分析文件路徑,而後搜索/(根目錄)的條目,其中包含了它本身目錄下 的文件和目錄信息。這時候,內核會找到/var目錄的i-node,而後再來看看/var目錄,它也有 它本身目錄下的文件和目錄的信息。內核會一直執行上面的過程,直到找到/var/log/messages文件的i-node。Linux內核使用對象緩存,好比目錄條目緩存或者i-node緩存來加速尋找i-node的過程。
一旦內核找到了文件的i-node,而後就試着訪問真正的用戶數據塊。如前面解釋的那樣,inode有數據塊的指針。參照它,內核就能得到數據塊了。對於大文件來講,Ext2提供到數據塊的直接/非直接參照。下圖展現了它是如何工做的:
Ext3和Ext2的基本結構是類似的,主要區別是Ext3支持日誌。Ext3有以下亮點:
1.可用性: Ext3採用一致性的方式把數據寫入磁盤,因此,當系統出現意外宕機(斷電或者系統崩潰),
服務器再次啓動時不用檢查數據的一致性。能夠把系統恢復時間從幾小時縮短到幾秒鐘!
2.數據完整性: 在mount命令中使用data=journal打開日誌記錄模式,全部的數據,包括文件和元數據都會記錄日誌!
3.速度: 經過指定日誌模式data=writeback,你能夠在你的業務場景下,在速度和完整性之間作權衡。
在有大量同步寫的時候,這個效果會十分顯著。
4.靈活性: 把現有的Ext2很簡單就能升級到Ext3,並且不用從新格式化。經過執行tune2fs命令和修改/etc/fstab文件,
你可以很簡單的把Ext2升級到Ext3文件系統!一樣,在關掉Ext3日誌的狀況下,Ext3可以做爲Ext2文件系統進行掛載。
複製代碼
Ext3支持3種日誌模式:
1. 日誌(journal) 經過記錄文件數據和元數據,這個模式提供了最高的數據一致性。它的
性能消耗也是最大的。
2. 有序(ordered) 該模式下只記錄元數據。然而,優先保證寫入文件數據!
3. 回寫(writeback) 這個日誌選項提供最快的數據訪問能力,可是犧牲了數據的一致性!
保證數據一致性的元數據也會被記錄,可是沒有處理肯定的文件數據,在系統崩潰的時
候,這可能致使舊的數據出如今文件中。
複製代碼
EXT4是第四代擴展文件系統(英語:Fourth extended filesystem,縮寫爲ext4)是Linux系統下的日誌文件系統,是ext3文件系統的後繼版本。
目前的不少Linux發現版本用的都是ext4文件系統,關於ext4文件系統的介紹和特性參考百度百科:
擴展文件系統(eXtended File System,XFS)是一個高性能日誌文件系統,支持超大文件和分區。Redhat已經其開源版本Centos7用的正是xfs文件系統。關於xfs文件系統的介紹和特性參考百度百科:
df -T
parted -l
dumpe2fs:
查詢Ext 家族superblock 資訊的指令談完Linux的文件系統,下一節將會談一下Linux的磁盤I/O子系統