linux 檔案系統

來源:互聯網
上載者:User

標籤:

linux檔案管理程式定義了一個單一的檔案內部視圖,應用程式用它來讀取和修改卸載所有存放裝置上的檔案。每類存放裝置在它的檔案管理程式中實現相同的視圖。
檔案管理程式負責取放包含應用程式所讀寫的位元組流部分的塊。每當讀寫位元組流的任何部分時,它判斷應該讀寫哪個磁碟塊。
linux檔案管理程式設計為讓應用程式使用一組有posix所制定的固定函數來操作檔案。Open,close,lseek,read,write,ioctl等等。檔案管理程式中一個與檔案系統獨立的部分處理普通工作部分,如檢查存取權限和決定何時需要讀寫磁碟塊。檔案管理程式的另一部分處理所有與檔案系統相關的工作部分,如判斷塊在磁碟上的定位和知道裝置驅動程式讀寫特定塊。兩部分結合起來是的在處理磁碟上的檔案時,linux在API層級提供了一組固定的操作,即檔案使用windows OS/MINIX或其他動作系統寫入。
linux檔案管理程式API簡曆在虛擬檔案系統VFS輸出的抽象檔案模型上。VFS執行與系統獨立的檔案操作,作業系統設計人員對VFS提供了擴充以完成所以需要的與檔案系統相關的操作。發行版本2.x可以讀寫符合各種格式的磁碟檔案,包括MS-DOS,MINIX,/PROC,以及叫做ext2的linux特定格式和其他一些格式。當然,在版本2.2.12中包含特定的與檔案系統相關的不見用以在所支援的各種外部格式之間翻譯VFS操作和格式。
VFS的核心是轉換。轉換switch為使用者空間程式提供了標準檔案管理程式API並簡曆內部介面。該借口由支援MS-DOS/MINIX/EXT2等檔案的不同檔案系統翻譯程式所使用。通過實現一個新的與檔案系統相關(翻譯程式)的不見可以提供對一種新檔案系統的支援。每個這樣的翻譯程式提供了VFS轉換可調用的功能。並可以降外部檔案表達形式翻譯為內部形式的函數。因此,翻譯程式負責:
決定用於組織磁碟裝置上磁碟塊的策略
讀寫磁碟屬性
讀寫外部檔案描述符資訊
讀寫包含檔案資料的磁碟塊
VFS檔案系統模型模仿傳統的UNIX檔案系統,一個VFS檔案描述符稱為一個inode(雖然他有自己獨特的格式支援多檔案系統方法)。雖然VFS包含它自己格式的檔案描述符,當檔案開啟時,每個與系統相關的檔案翻譯程式將外部描述符的內容轉換成VFS inode格式。所以它假設外部檔案目錄至少包含每個儲存於該目錄檔案的名字和其檔案描述符的地址。
VFS至少具備以下有關磁碟組織的結構:
磁碟上的第一個山區是用於儲存引導程式的引導塊。檔案系統不使用這個引導塊,但它假設引導塊在每個檔案系統上都存在。一個超級快包含磁碟相關資訊,如一個磁碟塊中的位元組數
磁碟上的外部檔案描述符描述每個檔案的特性。
資料區塊連結到每個包含資料的檔案。
在VFS管理特定的檔案系統前,必須編寫該類型的翻譯程式並在VFS中註冊。VFS的register_filesystem()函數告知VFS它所需要的基本資料,包括檔案系統類型的名稱和檔案系統read_super()函數的進入點,該函數並在檔案系統裝載時使用。
當裝載檔案系統是,VFS建立sturck super_block資料結構的一個樣本來容納管理新檔案系統所需要的資訊。然後VFS調用新聞間凶的read_super()函數來擷取包含在檔案系統中類似超級塊中的資訊,翻譯該資訊並且將它儲存在struct super_block資料結構中。
該超級塊包含VFS需要用來管理檔案系統的各種欄位,尤其是欄位
struct super_operations *s_op;
這個s_op欄位制訂了一組函數用於寫回超級塊到磁碟/讀寫磁碟上的inode/檢查超級塊的狀態等等。所以read_super()是在檔案系統類型註冊時綁定到VFS的引導函數。在裝載時,VFS讀取超級塊之後,它可以在需要時使用super_operation 函數來操作磁碟上的超級塊。super_operations定義了私人的,磁碟上超級塊抽象資料類型的一個公用介面。從而使得轉換成徐可以按照其選擇實現超級塊和inode。
為了開啟一個檔案,檔案管理程式在儲存系統上搜尋指定的路徑名。搜尋可能是一個擴充的過程。這是因為它需要,比如說,開啟路徑名中的每個目錄(從路徑中的最高明明目錄開始),在路徑名中搜尋下一個檔案或目錄的路徑,以及開啟哪個目錄或檔案。如果搜尋遇到一個安裝點,那麼它從一種檔案系統轉移到另一種檔案系統並繼續搜尋。因此搜尋可能從,如Ext2檔案開始,但最終在一個MS-DOS檔案系統中找到檔案。
一旦檔案管理程式已經在一個目錄中定位到檔案,VFS檢查檔案和使用者權限以確保使用者京城有許可權開啟檔案。如果進程具有正確的許可權,那麼VFS將會簡曆各種表項來管理I/O。首先,在進程的檔案描述附表中建立一表項。 每個進程都有一個檔案描述符表。二每個開啟的檔案都在表中有一表項。表項由一個調用返回的小整數值識別。之後對該檔案的引用都使用該值。注意當建立進程時,所建立的檔案描述符表具有以下三個表項:
stdin 具有表項識別符0
stdout 具有值1
stderr 具有值2
隨後成功的open()和pipe()調用降在檔案描述符表的為止3建立一表項。
檔案描述符表中的表項指向開啟檔案表中一個叫做檔案結構(struct file)的表項。檔案結構表項容納了與開啟檔案的進程相關的狀態資訊,如這個進程使用的檔案位置值。如果兩個不同的進程開啟同一個檔案,那麼每個進程都將有它自己的檔案結構表項,從而有它自己對於該檔案位置的拷貝。檔案結構表在貯存中穿件以後,它引用VFS的inode。
VFS通過讀取外部檔案描述符(通過使用在超級塊s_op列表中指定的read_inode()函數在記憶體你中穿件inode並將其翻譯成VFS inode格式。正如超級塊為super_operation列表提供一個欄位,inode提供以下欄位定義一個inode巨集指令清單):
struct inode_operations *i_op;
struct inode_operations是一個VFS需要用來操縱檔案塊的巨集指令清單,如create()lookuo()link()和mkdir()。同事提供的還有在i_op列表不提供操作時所使用的預設巨集指令清單。
在VFS中分配的inode被分配給一個單一的大連結清單。每當VFS打算掃描所有的inode時這是遊泳的,但是,當VFS想要引用一個特定的inode時訪問減慢。所以inode引用也被裝入一個開啟的雜湊表中,在這裡他們通過一些(也可能是一個)表探針(probe)訪問。
檔案管理程式改變記憶體中inode版本的當時,這些改變不會被複製到存放裝置上的外部檔案描述符中。相反,當檔案關閉或者應用程式產生一個syc命令時,記憶體中的inode版本被歐諾個與周期性的分別費續保輔存上的外部檔案描述符。當一個檔案開啟並且最近對inode做出了更改時,機器停機,記憶體中inode版本可能和磁碟上的外部檔案描述符不同,結果可能導致不一致的檔案系統,因為在記憶體中的inode破壞時降丟失有關檔案的最新訊息。例如,如果記憶體中indoe的塊指標已經改變(對磁碟塊也做出了相應的改變),那麼磁碟上可能有一個外部檔案描述符與磁碟上的各種儲存塊指標不一致。

當檔案開啟時,建立struct file的一個執行個體(檔案結構表中的表項)。在該檔案中,欄位struct file_operations *f_ops;
指定read(),write(),lseek(),select()等的進入點,它們用於執行和系統相關的i/o操作。同事包括的嗨喲一組在inode中指定的預設file_operations,這樣如果任何特定檔案系統(如Lseek())沒有在f_ops列表中指定,那麼將使用來自預設列表中的函數。
這些常式的實質目標是在使用者空間地址和輔存塊之間移動資訊。read()調用與檔案系統相關的操作降資料從磁碟轉移到系統緩衝區。在哪裡資料被寫入磁碟。這些常式還必須排列和分散位元組流。
一個檔案被組織為連續的位元組留。這表明應用程式通常把檔案作為一個位元組流來讀寫,二不是隨機訪問檔案中的字元。結果是,使用緩衝的方法可以極大地提高系統的效能。在度緩衝中,檔案系統在位元組留之前讀取,去除包換出現在當前檔案指標所指位元組之後位元組流部分的磁碟塊。在寫緩衝中,每當磁碟裝置可用時一個滿磁碟塊就準備寫。因此,應用程式不必等待進入緩衝,因為在他們被引用時就已經讀取。另外,也不必等待寫操作,因為在應用程式邏輯上將位元組寫入流之後,它們將作為一個後動作發生。
linux試圖使用最大限度的記憶體來提供I/O緩衝區。它建立一個動態緩衝區告訴緩衝,其大小依賴於當前要求提供虛擬儲存的頁框的數量。虛擬儲存系統不需要的頁面可以用作緩衝區快取。當發生一個缺頁錯誤時,緩衝區告訴緩衝是虛擬儲存系統首先搜尋頁框的地方之一。
塊緩衝是一個相對複雜的任務。這部分的檔案管理程式必須滿足以下每個約束條件:
每個為讀操作開啟的檔案應該具有一個或多個緩衝區,他們含有在進程時機請求資訊之前已經從磁碟讀取的資訊。
每個為寫操作開啟的檔案具有一組緩衝區,他們包含在裝置可用時寫到裝置的資訊。
與存放裝置上的塊相同的滿輸出塊不應該被寫回。
當虛擬記憶體不需要所有的實體記憶體時,緩衝區告訴緩衝應該擴大。當虛擬記憶體需要更多的實體記憶體時,緩衝區快取應該減小(但不影響將要進行的I/O)
緩衝區大小可變
緩衝區可以在進程間共用


Ext2檔案系統
Ext2檔案系統模仿BSD快速檔案系統。每個磁碟被格式化為可以容納一組塊組(block group),每個都包括一個超級塊,組描述符資訊,塊組中檔案inode的表以及資料區塊。
超級塊包含下列資訊:
inode數量
空閑inode數量
塊細節
分配限制
最後安裝時間和最後一次寫入時間
錯誤和狀態
其他管理資訊
塊描述符包含特定塊組中塊的細節資訊。對於磁碟塊大小為1024位元組(每個塊的大小為1024=EXT2_MIN_BLOCK_SIZE<EXT2_BLOCK_SIZE<EXT2_MAX_BLOCK_SIZE=4096)的塊的描述符,一個塊可能容納多達8192個。塊描述符也包含塊組中檔案的inode集合。
inode使用一種變體的索引分配方案來組織塊,它包括指向15個不同儲存塊的指標。檔案的錢12個塊直接索引自inode中15個指標的前12個,後三個指標通過索引塊用做簡介指標。如果檔案管理程式每個塊配置為最大尺寸的4kb,則inode中的12個直接指標最大可容納48KB的檔案。如果一個檔案請求超過12個塊。那麼檔案系統分配一個索引塊並將其連結到一次間接(第13個)指標。因此,塊13~K通過由inode中第13個指標確定的間接塊從inode間接地址。類似地,更大的檔案使用第14個指標指向一個二次間接塊,二最大的檔案使用第15個指標只想一個三次間接塊。

linux 檔案系統

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.