ZFS - 文件系統簡介

可以跟結識ZFS是因爲Solaris,雖然當時ZFS還不是Solaris的默認文件系統,可是它成爲了Solaris操做系統中吸引個人最大亮點。

一開始接觸ZFS,我就被它無盡的存儲空間和像管理內存同樣管理管理磁盤的方式深深地吸引了,可是以後很長的一段時間裏,​我都是隻限於使用ZFS。後來,因爲工做緣由,我開始調查ZFS的測試工具,在那段過程當中,ZFS的各類特性更加令我着迷,​這也使我迫切但願學習ZFS的源碼。雖然過了這麼長時間,我也只是學到了一點皮毛,但仍是想把在這一經典巨做的學習成果跟你們分享。

其實,選擇今天做爲ZFS系列博客的開始,也是是由於今天是opensolaris.org關閉一週年。這也算是個記念吧。node



以前,我對文件系統的瞭解也不是不少,因而就處處找一些跟文件系統發展史相關的資料來看,下面的內容基本上是參照​From BFS to ZFS: past, present, and future of file systems這篇文章來寫的,索性就把這篇博客的類別設爲「翻譯」吧。

在咱們使用計算機的過程當中,咱們須要對數據進行讀、寫等一系列操做。好比,咱們在存儲一份數據時,只須要簡單地發出保存​命令(無論是終端命令仍是windows的點擊保存),數據就會被保存在磁盤上,而咱們並不清楚這些數據具體在磁盤的什麼位置;​當咱們想要讀取一個文件時,只須要知道它在哪一個目錄,文件名是什麼,而後選擇適當的應用程序打開便可,一樣,咱們也不知​道這些文件具體來自磁盤的哪一個位置(或者是分散的許多位置)。其實,在咱們保存或是讀取數據的過程當中,真正將數據放到磁​盤上或是從磁盤上找到數據所須要的一系列操做都是由操做系統經過文件系統來完成這一系列的操做。

那麼什麼是文件系統?文件系統的發展是怎樣的一個過程?有哪些經典的文件系統?文件系統發展方向又是怎樣?今天咱們將圍繞這些問題進行討論。
git

什麼是文件系統

概要地說,文件系統就是操做系統用來存儲、訪問磁盤上的數據的一種方法。經過這樣的方法簡化操做系統對數據存儲、訪問等操做。

用戶在使用文件系統讀取數據時,不須要關注數據在磁盤或光盤上存儲的物理地址,而只須要知道所需的文件的文件名以及所屬目錄;​在向磁盤上寫入數據時,不須要關注磁盤上的某個部分是否已經被使用,磁盤的空間(已使用空間、空閒空間等)都有文件系統來自​動分配、管理。用戶只須要知道寫入的目錄以及文件名便可。

文件系統主要負責兩個方面工做:文件管理和空間管理。

文件管理主要表如今如下方面:文件存儲不只存儲文件數據自己,還要存儲跟文件相關的其餘信息,好比文件名、文件建立時間等;​同時文件系統須要經過一個等級制度來管理文件,這點在外在形式上就是目錄。

空間管理是說,文件系統不只要跟蹤磁盤上已用空間,還要管理磁盤上沒有使用的空間。這一點,不一樣的文件系統(或者能夠說是​不一樣時代的文件系統)有着不一樣的管理方式,這點,後面將詳細說明算法

元數據

上文中已經提到,文件系統在存儲數據時不只要存儲文件自己,還須要存儲跟文件相關的其餘信息,這就是元數據。元數據,按照​其字面意思來看就是「關於數據的數據」,文件系統在存儲文件以及文件名以外,至少還要存儲一些其餘的元數據,一些對計算機來​說沒有什麼意義,可是對用戶來講卻很重要的數據:好比說文件的建立日期,修改日期等等;同時有一些元數據可能對人類沒有任​何意義,可是對文件系統來講倒是不可或缺的,好比文件在磁盤上的物理位置。編程

文件系統的高級特性

隨着操做系統的發展,愈來愈多的特性被加入到文件系統的元數據中。好比說爲了提升搜索速率加入了索引信息;採用更好的設計​來下降文件系統的碎片化;爲了節省磁盤空間加入了去重、壓縮功能;爲了保證數據的正確性加入了校驗碼;增強了文件系統的自​我修復能力……其中一個重要的變化就是日誌功能,這使得在忽然斷電或者宕機以後重啓機器,系統能夠根據日誌內容恢復相關信息,
​保持文件系統中數據的一致性。這也使得計算機的重啓過程更快速,由於不須要對整個硬盤進行掃描來保證數據的一致性。這就是​爲何有的問題見系統斷電後硬盤自檢時間很長,好比說XP,有的文件系統斷電後硬盤自檢時間極短,好比說Ext4的Linux(這應該​就是日誌的的做用了)。windows

文件系統的發展

每種操做系統都有本身表明性的文件系統,好比Windows的FAT3二、NTFS,Linux的ext二、ext三、ext4,Unix的UFS,Mac OS的HFS、HFS+……

其實在計算機發明的早期文件系統就已經存在,只是當時人們把它們認爲是操做系統功能的一部分,而那個時候操做系統自己都已​經是神祕莫測了,天然也不會有人去注意文件系統,計算機技術的發展,操做系統的發展,人類對文件管理的需求,甚至是硬件的​發展,都推進了文件系統的迅速發展。

早期的文件系統都是沒有名字的,最先有名字的文件系統是DECTape——由設計他的公司(Digital Equipment Corporation)名稱和​存儲設備來命名。該文件系統最初被用在PDP-8服務器上,每一個磁帶只能夠存儲小到184KB的數據。

在隨後的時間裏,「懶人原理」推進了文件系統的發展。1973年Gary Kildall發明了CP/M,由於他比較懶,不想天天開車去上班,可是​他又須要在公司巨大的計算機上編程,因而他開發了一個叫「Control Program for Microcomputers」的軟件來使本身能夠在家裏8英寸​的小型計算機上的軟盤上存儲並運行程序。此時CP/M上已經有文件系統了,但這個文件系統沒有名字,因爲Gary Kildall的需求很簡​單,全部文件系統的功能也很簡單,文件之間都是平級關係,沒有目錄結構。CP/M文件系統對文件名的支持上,容許最多8個字節的​文件名另外加上3個字符擴展名(這與Gary Kildall工做的大型機上的限制是相同的)。隨後,他的銷售他發明的微型計算機,受到了​各大微機廠商的歡迎。仍是因爲「懶」,Gary爲了不爲每一個微機廠商都寫一個CP/M系統,他寫了獨立於系統以外的系統——BIOS。服務器

​因爲Gary的「懶」,他沒有開發16位的CP/M,這是另一我的出現了——Tim Patterson。Tim徹底抄襲了CP/M的一切,只不過他是爲​16位機器開發的,並命名爲QDOS(Quick And Dirty Operating System)。在文件系統上,QDOS與CP/M稍微有點不一樣,雖然它在管​理文件時仍然是平級的,它採用了一個叫作「File Allocation Table」的方法來管理文件,而且給了他一個經典的名稱——FAT工具

經典文件系統介紹

下文簡單介紹一下各大公司的文件系統,關於各類文件系統的對比,維基百科上面有很是詳細的介紹。性能

MicroSoft學習

FAT測試

File Allocation Table用來描述磁盤上的哪些部分已經被分配給文件使用,哪些部分是空閒空間以及哪些部分已經被損壞不能使用。因爲早期的軟盤很小,因此用來管理磁盤的File Allocation Table也要很是小,爲了知足這點,磁盤被劃分紅多個簇(Cluster,由相鄰的扇區組成)。第一個版本的FAT文件系統被稱爲FAT12,由於它使用12爲的數字來對簇進行計數,212次方是4096,因此能夠管理4096個簇,每一個扇區大小爲8KB,因此卷的最大空間爲32MB

最初的FAT文件系統,僅僅是將文件存儲在第一個找到的空閒空間裏面,對於軟盤而言,空間很小,這樣的方法沒有大礙,可是對於更大磁盤來講將會帶了各類問題。在MS-DOS 2.0中,微軟給FAT文件系統添加了目錄嵌套。後來微軟開發了FAT16以及FAT32文件系統,分別能夠支持2GB8TB的磁盤空間。可是因爲FAT文件系統在分配空間上的算法比較差(FAT經過尋找第一個空閒空間,而後將文件存儲到該位置),使得使用一段時間之後,磁盤過分碎片化,同時訪問文件時處處讀取散落在磁盤各個位置的數據及其耗時。而微軟並無從根本上解決這一問題,而是提供了一個工具——磁盤整理。另外一方面,8字符+三字符擴展名的命名方式所帶來的問題也愈來愈突出。微軟經過VFAT功能使得FAT文件系統能夠支持255字符的文件名,其實微軟的文件系統一直都沒有突破這個限制,下圖是我在NTFS文件系統上發的一封郵件:

 

exFATExtended File Allocation Table

擴展的FAT文件系統,又名FAT64,是Microsoft開發的一種適合於閃存的文件系統,加入了空餘空間尋址,使得空間的分配、釋放的性能獲得改進。

NTFS

NTFSNew Technology File System),Window NT及以後基於NT內核的系統的標準文件系統。NTFS文件系統的設計做爲商業機密,Microsoft已經註冊了知識產權。做爲替代了FAT文件系統的新一代文件系統,NTFSFATHPFSHigh Performance File System)的基礎上作了一系列的改進,好比支持元數據、使用B+樹提升了性能。NTFS同時提高了附加功能,如訪問控制列表和文件系統日誌

Mac OS

MFSMacintosh File System

1984年有Apple公司開發做爲Mac OS的默認文件系統。MFS支持20M的磁盤大小以及1400個文件。這對於當時Macintosh僅有400KB的軟盤來講已經很大了。MFS支持目錄,可是不支持目錄嵌套。

HFSHierarchal File System

分層文件系統1985年取代MFS成爲Mac OS的文件系統。最初爲軟盤和硬盤設計,後來也用於相似光盤的只讀文件系統。文件名只支持31個字符,其實HFS是支持255字符的文件名,可是因爲Mac OSFinder(相似於Window的資源管理器,一種圖形化界面的Shell)的限制,因此最多隻能使用31個字符做爲文件名。HFS經過B樹來管理目錄以及元數據等。HFS使用512K的簇以及16位指針,所以最大的分區大小爲32G 

HFS+

Apple公司在1998年發佈,替換了原有的HFS文件系統,是HFS的升級版本。採用了32位的塊地址指針,使得尋址空間進一步擴大。在文件名上,容許255UTF-16字符的文件名。HFS+採用了32位的BitmapHFS採用16位,即磁盤最多能夠支持65536個塊,好比一個1GB的磁盤,,也就是說即便是1bit的數據,也要佔用16K的空間。一樣HFS使用B樹來管理元數據。

2002年,Mac OS X 10.2.2發佈時,AppleHFS+添加了日誌功能,提升了數據可可靠性。

Linux

最初的Linux文件系統是MINIX系統,當時Unix系統的源碼在教育行業是能夠自由使用的,MINIX文件系統就是將UFS文件系統中的一些複雜的功能去掉來保持代碼的整潔、清晰、簡單,便於教學。1991Linus在寫Linux系統的時候所用的操做系統上就是MINIX文件系統。知道1992extExtended File System)發明以前,MINIX做爲Linux的原始文件系統。

ext(Extended File System)

Rémy Card1992年開發的,符合VFSVirtual File Syste)設計的文件系統,也是第一個使用VFS API的文件系統,而且被加入到Linux內核中。ext解決了MINIX文件系統中的兩個主要問題(最大分區大小、14字符文件名的限制),支持2GB空間以及255字符的文件名。在19931月就被ext2所取代。

ext2Second Extend File System

一樣是由Rémy Card開發,在19931月取代ext成爲Linux的默認文件系統。ext文件系統雖然解決了MINIX所存在的兩個主要問題,可是仍然存在其餘的問題,好比不支持分開的文件訪問時間戳,對inode以及數據的修改都存在必定問題等等。在此狀況下ext2誕生了。

ext2支持的最大的文件大小爲16GB2TB,支持的最大文件系統大小爲4TB32TB

ext3Third Extended Filesystem

ext3文件系統與ext2文件系統很是類似,這也決定了從ext2轉換成ext3將會特別方便、簡單。相對於ext2ext3開始添加了日誌功能。

Unix

UFS(Unix File System)

又稱Berkeley Fast File System,BSD Fast File System,FFS被普遍用於Unix以及類Unix系統。

ZFSZettabyte File System

第一個128位文件系統,也被稱爲文件系統的終結者。由Sun公司的Jeff Bonwick所領導的團隊完成,於2004914日發佈,並在2005年加入Solaris主幹代碼。

 

這裏大概將文件系統的發展、以及經典的文件系統提了一下。

後面,重點就是ZFS了。

相關文章
相關標籤/搜索