1. 程式人生 > >小議Linux系統下的檔案系統

小議Linux系統下的檔案系統

    Linux的老江湖們對這個概念當然不會陌生,然而剛接觸Linux的新手們就會被檔案系統這個概念弄得暈頭轉向,恰好我當年正好屬於後者。從windows下轉到Linux的童鞋聽到最多的應該是fat32ntfs(windows 2000之後所出現的一種新型的日誌檔案系統),那個年代經常聽到說“我要把C盤格式化成ntfs格式,D盤格式化成fat32格式”。一到Linux下,很多入門Linux的書籍中當牽扯到檔案系統這個術語時,二話不說,不管三七二十一就給出了下面這個圖,然後逐一解釋一下每個目錄是拿來幹啥的、裡面會放什麼型別的檔案就完事兒了,弄得初學者經常“丈二和尚摸不著頭腦”。難道這就是Linux

下的檔案系統。而且新手一直被“灌輸”一個思想:Linux下一切都是檔案,不再像Windows那樣用副檔名來為檔案分類等等。這就讓那些喜歡刨根問底的fresh-fish很是不爽,他們本著對學術的嚴謹、技術的狂熱的態度,一心想弄明白:到底什麼才是檔案系統。本文的目的就是和大家分享一下我當初是如何學習Linux的檔案系統的,也算是一個“老”油條的一些心得吧。

23069658_1355317621BaPz.png

“檔案系統”的主語是“檔案”,那麼檔案系統的意思就是“用於管理檔案的(管理)系統”,而這套管理系統所管理的物件當然就是檔案了。在大多數作業系統裡,“檔案是資料的集合”這個基本點是一致的,而這些資料最終都是儲存在儲存介質裡,如硬碟、光碟、U盤等。

另一方面,使用者在管理資料時也是檔案為基本單位,他們所關心的問題是:

1、我的檔案在什麼地方放著?

2、我如何將資料存入某個檔案?

3、如何從檔案裡將資料讀出來?

3、不再需要的檔案怎麼將其刪除?

簡而言之,檔案系統就是一套用於定義檔案的命名和組織資料的規範,其根本目的是便對檔案進行查詢和存取

      Unix/Linux系統中的檔案系統有個很重要的特性就掛載,即檔案系統在使用前必須被掛載在一個實際的目錄下才能使用,這是因為類Unix系統中的檔案系統都遵循了FHS(Filesystem Hierarchy Standard)。在FHS中詳細定義了類Unix作業系統中各種應用軟體、管理工具、開發工具、指令碼和幫助檔案所處的位置。這樣,通過該標準,軟體釋出商和使用者在不同的發行版的linux

系統裡都能預測軟體安裝後,檔案和目錄所處的位置。

檔案系統為了實現對檔案更好的管理、組織方式,引入了目錄的概念。目錄裡不但可以儲存檔案還可以儲存目錄,以目錄為依託,最終會形成一個目錄樹的結構。根據FHS的規定,Linux不同的發行版都存在如下的目錄結構:23069658_1355317723ETDe.jpg

      上圖中一個比較特殊的目錄就是硬碟的根目錄“/”,如果我們將一塊硬碟格式化成ext3ext4格式後,通過mount命令將其掛載到根目錄下,就形成了我們通常所說的“根檔案系統”。根檔案系統不是一個新實體,而是指掛載在根目錄下的儲存裝置(或某個分割槽)實際所使用的檔案系統型別。當“根檔案系統”被掛載後,記憶體中就有了如上所示的目錄結構樹。這裡提醒一點,千萬不要以為你在命令列輸入“cd /usr/src/”等命令時是在“操作”硬碟,其實你是在記憶體的VFS的目錄樹裡。這裡就不展開了,後面剖析VFS時再詳細介紹。作為使用者在使用檔案系統時,對於某個具體的儲存裝置,例如U盤或硬碟,無非是首先執行諸如mk2fsmkfs.xxx這樣的命令對儲存裝置進行格式化,將其格式化成某種型別的檔案系統,然後用mount命令將該存裝置掛載到某個具體的目錄下,然後對該目錄下的檔案進行“增、刪、改、查”就可以實現對該儲存裝置上資料的操作。

這裡就有幾個關鍵點需要大家留意了,以便我們後面分析VSF機制時心裡能做到“提前亮”。在類Unix系統中討論檔案系統,不可迴避的要就要牽扯到掛載(mount)機制,在windows下這個過程已經被微軟封裝了,普通使用者察覺不到,至少在我接觸windows這麼些年從來沒聽誰跟我提起過windows下的mount機制。所以我們在分析原始碼時可以留意一下掛載的實現機制。另一個就是目錄,這個再熟悉不過,Unix/LinuxWindows,幾乎所有的作業系統都至此,其目的就是用來對檔案進行組織便於使用者管理,即站在使用者的角度來說就是回答了“我的檔案在哪兒放著”的問題。

Linux早期設計階段,檔案系統與核心程式碼是整合在一起的,這樣做的缺點是顯而易見的。假如,我的系統只能識別ext3格式的檔案系統,我的U盤是fat32格式,那麼很不幸的是我的U盤將不會被我的系統所識別,所以fat32格式的U盤在我們的系統上將無法使用。為了支援不同種類的檔案系統,Linux採用了在Unix系統中已經廣泛採用的設計思想,通過虛擬檔案系統VFS來遮蔽下層各種不同型別檔案系統的實現細節和差異。

23069658_1355317727a9NN.jpg

      其實VFS最早是由Sun公司提出的,目的是實現網路檔案系統NFS(Network File System),其基本思想是將各種檔案系統的公共部分抽取出來,形成一個抽象層。對使用者的應用程式而言,VFS提供了檔案系統的系統呼叫介面。而對具體的檔案系統來說,VFS通過一系列統一的外部介面遮蔽了實現細節,使得對檔案的操作不再關心下層檔案系統的型別,更不用關心具體的儲存介質,這一切都是透明的。     小結一下:所謂檔案系統就是作業系統用來明確磁碟或分割槽上的檔案以及資料結構的一種方法,也就是磁碟上檔案的組織方法。普通使用者所看到的檔案系統,是以目錄結構而存在的一個多級分層的樹狀結構,但作為開發人員我們得知道其實每個目錄下都可以掛載不同型別的檔案系統。最後一點是,每個檔案系統可以佔用磁碟的一個分割槽,而不是整個硬碟,這一點請注意。VFS並不是一個實際的檔案系統,它是類Unix作業系統給我們提供的一種用於統一管理具體檔案系統的機制。當我們要開發一種新的檔案系統時,需要遵照VFS的規範,才能享受VFS帶來的好處。     未完,待續... <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script> 閱讀(7557) | 評論(17) | 轉發(35) | 給主人留下些什麼吧!~~ 53_avatar_small.jpg

2015-05-01 12:48:51

學習了

回覆 | 舉報 85_avatar_small.jpg

2012-12-29 11:09:46

寫的真好,頂起

回覆 | 舉報 58_avatar_small.jpg

2012-12-19 00:05:59

古丁高手: 如果沒錯應該是鳥哥的圖呵呵.....呵呵,隨便找的,切勿對號入座哈3.gif回覆 | 舉報 21_avatar_small.jpg

古丁高手2012-12-15 21:38:44

buzzerrookie: 第一張圖感覺像是臺灣的書上的。.....如果沒錯應該是鳥哥的圖呵呵 回覆 | 舉報 評論熱議