LINUX文件系统介绍
文件系統(tǒng)的作用就是在應(yīng)用概念的文件和存儲(chǔ)設(shè)備之間提供一個(gè)中間層,以使多個(gè)文件駐留在一個(gè)存儲(chǔ)設(shè)備上,由文件系統(tǒng)來(lái)管理所有文件的存儲(chǔ)。文件系統(tǒng)將每個(gè)存儲(chǔ)設(shè)備化為一系列目錄,每個(gè)目錄含有若干文件。 塊(block)分配 傳統(tǒng)的 Unix 文件系統(tǒng)使用塊分配機(jī)文件系統(tǒng)的作用就是在應(yīng)用概念的文件和存儲(chǔ)設(shè)備之間提供一個(gè)中間層,以使多個(gè)文件駐留在一個(gè)存儲(chǔ)設(shè)備上,由文件系統(tǒng)來(lái)管理所有文件的存儲(chǔ)。文件系統(tǒng)將每個(gè)存儲(chǔ)設(shè)備化為一系列目錄,每個(gè)目錄含有若干文件。
塊(block)分配
傳統(tǒng)的Unix文件系統(tǒng)使用塊分配機(jī)制,例如UFS,并且提供一個(gè)靈活有效的塊分配策略(policy)。磁盤塊在被使用時(shí)分配,就是說(shuō)只為文件分配一個(gè)最小的文件系統(tǒng)塊數(shù),以保存存儲(chǔ)空間。
當(dāng)文件擴(kuò)展時(shí),從一個(gè)空閑塊位圖中分配塊,所以有時(shí)塊是隨機(jī)分配的。隨機(jī)分配會(huì)導(dǎo)致過(guò)多的磁盤搜尋,隨后從文件系統(tǒng)讀數(shù)據(jù)會(huì)導(dǎo)致磁盤機(jī)制搜尋文件擴(kuò)展期間所分配的所有隨機(jī)塊位置。隨機(jī)塊分配可以通過(guò)塊分配策略的優(yōu)化來(lái)避免,它試圖分配連續(xù)序列的塊。
更小的塊分配獲得大的連續(xù)分配,大量減少了磁盤搜尋。然而,連續(xù)的文件系統(tǒng)塊分配最終導(dǎo)致了文件系統(tǒng)中的文件塊碎片,結(jié)果文件系統(tǒng)訪問(wèn)最終又會(huì)回到隨機(jī)的本質(zhì)。
塊分配方案也要保存文件擴(kuò)展時(shí)每個(gè)被分配的新塊的位置信息,以及文件是否是每次一塊的擴(kuò)展。額外的磁盤I/O被要求讀寫文件系統(tǒng)塊結(jié)構(gòu)信息。文件系統(tǒng)塊結(jié)構(gòu)信息成為元數(shù)據(jù)(metadata)。文件系統(tǒng)元數(shù)據(jù)總是同步寫入存儲(chǔ)設(shè)備,所以對(duì)一個(gè)文件大小的改變需要等待每個(gè)元數(shù)據(jù)操作完成。因此,元數(shù)據(jù)操作極大降低了文件系統(tǒng)的整體性能。
?
范圍(extent)分配
基于范圍的文件系統(tǒng)每次按一大群來(lái)分配磁盤塊,因此要強(qiáng)制進(jìn)行順序分配。一個(gè)文件被寫入時(shí),大量塊在文件創(chuàng)建時(shí)被分配給文件;然后,可以進(jìn)行大群或簇順序塊的寫入。文件系統(tǒng)元數(shù)據(jù)在文件首次創(chuàng)建是寫入;在塊的第一個(gè)分配范圍內(nèi)的寫不要求額外的元數(shù)據(jù)寫,直到被分配下一個(gè)范圍。
這種方法優(yōu)化了磁盤搜尋方式,到簇的群化塊寫入允許文件系統(tǒng)提交對(duì)存儲(chǔ)設(shè)備的更大的物理磁盤寫入,節(jié)省了許多小SCSI轉(zhuǎn)換的開銷。圖1比較了塊分配和范圍分配。我們可以看到,在塊分配的文件中每個(gè)邏輯塊都需要有一個(gè)塊地址號(hào),導(dǎo)致每個(gè)文件有許多的元數(shù)據(jù)。在范圍分配方法中,每個(gè)接連的數(shù)據(jù)塊范圍只需有起始?jí)K號(hào)和長(zhǎng)度就夠了。所以包含有一些大范圍塊的文件只有少量的元數(shù)據(jù)。
范圍分配的文件系統(tǒng)為順序文件訪問(wèn)提供了更好的性能,因?yàn)樗捻樞蚍峙洳呗砸约皦K聚集為更大的寫。然而,對(duì)于正在用來(lái)作隨機(jī)I/O的文件系統(tǒng),范圍文件系統(tǒng)的長(zhǎng)處往往得不到發(fā)體現(xiàn)。
舉個(gè)例子,如果我們想要通過(guò)一個(gè)基于范圍的文件進(jìn)行順序讀,只需讀取起始?jí)K號(hào)和長(zhǎng)度;然后可以繼續(xù)讀取此范圍內(nèi)的所有數(shù)據(jù),這意味著在順序讀時(shí)只有很小的元數(shù)據(jù)讀開銷。相反,如果要以隨機(jī)方法來(lái)讀,就要先查詢我們想要的每個(gè)數(shù)據(jù)塊的塊地址,這相當(dāng)于必須要處理一個(gè)基于塊的文件系統(tǒng)。
?
元數(shù)據(jù)日志
最常見的文件系統(tǒng)日志形式是元數(shù)據(jù)日志。文件系統(tǒng)要對(duì)它磁盤上的結(jié)構(gòu)作改動(dòng)時(shí),使用幾個(gè)無(wú)連接的同步寫來(lái)完成這些操作。如果期間發(fā)生斷電或其它故障,則文件系統(tǒng)的狀態(tài)未知,必須對(duì)整個(gè)文件系統(tǒng)作一致性檢查。
舉個(gè)例子,如果在一個(gè)文件末尾加上一個(gè)塊(block),就需要對(duì)告訴文件系統(tǒng)文件的每一塊的位置信息的磁盤位圖進(jìn)行讀、修改和重寫,然后才能寫入這個(gè)數(shù)據(jù)塊。故障發(fā)生時(shí),必須在系統(tǒng)引導(dǎo)時(shí)檢查文件系統(tǒng),文件系統(tǒng)不知道這個(gè)塊的位圖是否正確,也不知道崩潰期間哪個(gè)文件發(fā)生的改動(dòng)。這種狀態(tài)意味著要掃描整個(gè)文件系統(tǒng),經(jīng)常要花費(fèi)幾分鐘,甚至幾小時(shí)。
元數(shù)據(jù)日志文件系統(tǒng)在磁盤上有一個(gè)循環(huán)的只附加的日志域,可以用來(lái)記錄每次磁盤事務(wù)的狀態(tài)。任何磁盤結(jié)構(gòu)改動(dòng)前都要寫一個(gè)目的改變(intent-to-change)記錄到日志。然后才改變目錄結(jié)構(gòu),完成后,此日志條目被標(biāo)記為完成。由于文件系統(tǒng)的所有改動(dòng)都記錄在日志中,我們就可以通過(guò)查看日志來(lái)檢查文件系統(tǒng)的一致性,而不必掃描整個(gè)文件系統(tǒng)。在掛載時(shí),如果找到一個(gè)目的改變條目,而且它沒(méi)有標(biāo)記為完成,則檢查那個(gè)塊對(duì)應(yīng)的文件結(jié)構(gòu),并在需要是進(jìn)行調(diào)整。
這種日志方法已經(jīng)在幾個(gè)文件系統(tǒng)上成功實(shí)現(xiàn),并成為SolarisUFS文件系統(tǒng)日志的基礎(chǔ)。它為UFS在磁盤上保存文件系統(tǒng)結(jié)構(gòu),并且可以隨時(shí)啟動(dòng)或禁止而無(wú)需改變磁盤上的數(shù)據(jù)。Veritas VxFS文件系統(tǒng)也使用元數(shù)據(jù)日志。
有一些文件系統(tǒng)將日志嵌在文件系統(tǒng)數(shù)據(jù)的相同分區(qū)內(nèi),還有一些文件系統(tǒng)則允許日志獨(dú)立于文件系統(tǒng)。Solaris DiskSuite中非綁定的UFS日志允許日志和數(shù)據(jù)隔離開;Solaris 7中綁定的UFS日志則不。Veritas則只在你購(gòu)買了Verista Aclearcase/" target="_blank" >ccelerator選裝件時(shí)才能將日志單獨(dú)放置。
數(shù)據(jù)和元數(shù)據(jù)日志
一些文件系統(tǒng)提供了一個(gè)選項(xiàng)以使文件數(shù)據(jù)和元數(shù)據(jù)都記錄進(jìn)日志。這種方法對(duì)小的同步寫尤其有用,它會(huì)為每個(gè)應(yīng)用write申請(qǐng)對(duì)磁盤不同部分的兩個(gè)或更多的寫(一個(gè)寫數(shù)據(jù),一個(gè)寫日志)。通過(guò)將數(shù)據(jù)記入日志,可以避免二次搜尋和寫入。數(shù)據(jù)首先寫入日志,然后再放入文件系統(tǒng)。這種技術(shù)所作工作有兩個(gè):確保數(shù)據(jù)完整性直到(但不包括)最后的塊寫入,,同時(shí)幫助提高小的同步寫的性能。Veritas VxFS文件系統(tǒng)有一個(gè)選裝件來(lái)對(duì)數(shù)據(jù)和元數(shù)據(jù)都記日志。
日志結(jié)構(gòu)的文件系統(tǒng)
傳統(tǒng)的文件系統(tǒng)是按塊分配的,設(shè)備塊分配自一個(gè)空閑塊位圖。另一種替代的文件系統(tǒng)形式是日志結(jié)構(gòu)的文件系統(tǒng),它將整個(gè)文件系統(tǒng)作為一個(gè)日志來(lái)實(shí)現(xiàn)。日志結(jié)構(gòu)的文件系統(tǒng)在每次塊被寫到一個(gè)文件時(shí)將數(shù)據(jù)塊加到日志的末尾,進(jìn)行時(shí)將以前寫的塊置為無(wú)效。這種方法允許每個(gè)文件被順序?qū)懭?#xff1b;不管寫的塊順序,因此提供了更快的寫速度。
日志結(jié)構(gòu)的文件系統(tǒng)用降低讀性能的代價(jià)換來(lái)很高的寫性能,同時(shí)也增加了復(fù)雜性。讀性能性能經(jīng)常由于塊按照寫時(shí)的順序分配而變得更慢,因?yàn)檫@樣可能會(huì)使文件以隨機(jī)順序在磁盤中分散放置。由于要增加一個(gè)單獨(dú)的垃圾收集或清除程序來(lái)掃描文件系統(tǒng)、移除無(wú)效塊,所以會(huì)增加復(fù)雜性。然而,需要一個(gè)復(fù)雜的緩存/查詢機(jī)制來(lái)支持高效的查詢,因?yàn)閴K是以隨機(jī)順序分配的,并且每個(gè)文件的塊位置信息必須保存起來(lái)。
日志結(jié)構(gòu)的文件系統(tǒng)在元數(shù)據(jù)密集環(huán)境中證明是高效的,但是還要被證明對(duì)數(shù)據(jù)密集的工作量更有效。注意日志結(jié)構(gòu)的文件系統(tǒng)和文件系統(tǒng)日志的不同是重要的。日志結(jié)構(gòu)的文件系統(tǒng)也叫做“隨機(jī)寫文件系統(tǒng)結(jié)構(gòu)”(WAFL)。
Solaris目前沒(méi)有日志結(jié)構(gòu)的文件系統(tǒng)。
擴(kuò)大和縮小文件系統(tǒng)
對(duì)在線存儲(chǔ)管理的一個(gè)普通要求是有增大和縮小文件系統(tǒng)的能力。早期的文件系統(tǒng)不支持這種能力,因?yàn)槟菚r(shí)的磁盤大小是固定的。如今通過(guò)卷管理可得到虛擬磁盤,因此可以改變底層設(shè)備的大小。如果不能使文件系統(tǒng)的大小擴(kuò)大,就需要備份文件系統(tǒng),再次用mkfs/newfs構(gòu)造文件系統(tǒng),然后恢復(fù)所有的文件系統(tǒng)數(shù)據(jù)。能夠在線擴(kuò)張大小的文件系統(tǒng)則無(wú)須進(jìn)行這些步驟。Soalris UFS文件系統(tǒng)可以用mkfs 命令進(jìn)行擴(kuò)展,對(duì)掛載的文件系統(tǒng)要用 –M 選項(xiàng),對(duì)未掛載的文件系統(tǒng)要使用 –G 選項(xiàng)。
我們有時(shí)不單要擴(kuò)大文件系統(tǒng),還可能需要縮小文件系統(tǒng)。比如,從一個(gè)設(shè)備收取一些空間分配給另一設(shè)備,就需要首先縮減這個(gè)文件系統(tǒng),以便從這個(gè)正在被縮減的文件系統(tǒng)尾端移出一些被分配的文件塊。
文件系統(tǒng) 擴(kuò)大 縮小
基本的UFS Yes,使用mkfs -M No
VxFS Yes,使用fsadm Yes,使用fsadm
QFS Yes,使用growqfs No
?
總結(jié)
以上是生活随笔為你收集整理的LINUX文件系统介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电脑小白不用怕 win10也能轻松修复
- 下一篇: 获取A股行情数据方法[通俗易懂]