linux檔案系統概述

WEB發表於2014-04-04

     作業系統的主要幾大管理系統,如程式管理排程系統、記憶體管理系統、檔案系統。在我們平時使用作業系統的過程中,我們接觸最多的就是檔案系統。因為我們平時無論工作還是生活,我們都要編輯檔案 建立檔案 來記錄具體的工作或事情。下面我們們就說一下檔案系統,我們還是從外部使用與內部實現兩部分來分開講。

 

外部呼叫

我們知道我們作業系統核心的外面也就是使用者空間下,我們是通過系統呼叫來使用作業系統提供的功能的,如讀取資料包 建立檔案等等。那下面我們簡單的介紹一下關於檔案和目錄的系統呼叫,無論是我們平時使用某類高階語言的函式還是使用shell命令,它們只是封裝了這些系統呼叫來完成功能,所以我們要知道或瞭解這些系統呼叫。

檔案系統呼叫

Fd=create(fileName,mode);

建立檔案系統呼叫(檔名,許可權狀態位)

Fd=open(filename,how);

開啟檔案 (檔名,模式(讀or寫))

Close(fd)

關閉一個檔案,意味著對一個檔案的操作全部結束

N=read(fd,buffers,nbytes)

讀取檔案(檔案控制程式碼,快取區,讀取的位元組大小)

N=write(fd,buffer,nbytes)

把資料從緩衝區寫入檔案(檔案控制程式碼,緩衝區,要寫入的位元組數)

Position=lseek(fd,offset,whence);

移動檔案指標

S=stat(name,&buf)

獲取檔案狀態資訊

S=fstat(fd,&bug);

獲取檔案狀態資訊

 

關於目錄的系統呼叫

S=mkdir(path,mode)

建立目錄(目錄路徑,許可權)

S=rmdir(path)

刪除目錄

S=link(oldPath,newPaht)

建立指向已有檔案的連結

S=unlink(path);

刪除已有連結

S=chdir(path)

改變工作目錄

Dir=opendir(path);

開啟目錄

S=closedir(dir)

關閉目錄

dirInfo=readdir(path);

讀取目錄項

內部實現原理

下面我們以linux下ext2檔案系統來說一下檔案系統的內部實現。

我們首先看一下磁碟的分割槽示意圖.

引導區(啟動時讀取哪個分割槽上的作業系統)

分割槽表(記錄各個分割槽的位置)

分割槽一

分割槽2

分割槽3

再看一下每個分割槽下的資料塊

超級塊(記錄了檔案系統的型別,包含的i節點的個數、磁碟塊數、以及空閒塊連結串列的其實位置)

組描述符(存放了空閒塊點陣圖以及i節點點陣圖的位置、目錄的個數)

塊點陣圖用來記錄空閒塊的位置

I節點點陣圖用來記錄空閒i節點

I節點儲存區

資料儲存區

 

Inode(i節點)

因為檔案系統要知道所有檔案的屬性資訊,比如作者 保護狀態 大小 型別,還要知道檔案資料在磁碟上的實際儲存位置,所以還要記錄一個檔案所佔用的磁碟塊。無論是採用連結串列或者點陣圖來儲存一個硬碟上的檔案和目錄資訊,都是要耗費不少的磁碟空間和記憶體空間(因為在檔案修改或建立時是要根據記錄來分配空間的),磁碟越大,檔案或目錄項或空閒塊就越多。為了解決這個問題,這些作業系統的設計者就想出了這個i節點的注意,並且很好的在檔案系統上實現和應用了。這樣在記憶體中就不必儲存所有檔案的位置資訊了,需要開啟哪些檔案就將那些檔案的i節點儲存到記憶體中即可,我們平時用到開啟檔案的函式,也就是將檔案的i節點資訊裝入記憶體。Stat等獲取檔案資訊的函式或系統呼叫其實也是讀取i節點返回的結果。

     每個節點都有一個節點號,無論目錄還是檔案都有一個單獨的節點,都是一個單獨的小檔案,這裡面記錄了檔案型別,是檔案還是目錄還是可執行檔案,還記錄了一些屬性資訊 如大小 作者修改時間等。每一個檔案或目錄都有一個節點,所以當我們要開啟或定位到一個檔案時,我們首先要找到第一個目錄,在linux下每個目錄下都有.和..,.的意思是當前目錄,這個裡面記錄了當前目錄的節點號,..的意思是上一級目錄,記錄了上一級的目錄的節點號,。

所以無論是我們採用絕對路徑還是相對路徑,我們都要一級一級的找到目錄的節點號,然後讀取i節點資訊,這個i節點如果是目錄裡面就會存有這個目錄下的目錄名稱或檔名稱以及對應的i節點號,得到i節點號讀取i節點然後繼續尋找目標檔案,直到最後找到目標檔案的i節點號,讀取節點資訊裡面的磁碟塊位置,獲取檔案的內容。

    

檔案系統的空間分配

      作業系統根據檔案中空間塊點陣圖以及i節點點陣圖來分配和回收檔案的建立和消除的儲存分配。

日誌檔案系統

為了防止由於系統崩潰或電源突然中斷導致正在進行的檔案操作中斷所造成的資料丟失,ext2檔案系統就必須在每個資料塊建立或修改後即刻寫入磁碟。磁碟的尋道操作對於cpu來講是如此的之長,為了提高效能,所以寫運算元據被快取,寫操作被延遲。但這樣也帶來了資料丟失的風險,假如資料還沒來得及寫入磁碟,電源突然中斷,資料將會丟失。為了解決這個問題,所以有了ext3檔案系統。

Ext3其實只是ext2檔案系統加上了一個日誌維護功能,增強了檔案系統的健壯性。每一個磁碟操作都會將其具體的操作位置以及資料記錄到日誌裡。當發生系統崩潰或電源中斷時,再次啟動時,檔案系統會比對日誌與磁碟是否一致,不一致則根據日誌來完善操作。這也是當系統崩潰後,我們再次啟東時,硬碟要自檢的原因。

網路檔案系統(NFS)

網路功能在linux中佔據著不可動搖的地位,當然檔案系統也要強大到支援非本地檔案系統。其實網路檔案系統就是在linux作業系統下,將遠端機器上的目錄掛載到本地的檔案系統上,首先遠端機器會檢查客戶機器的掛載請求以及許可權驗證,通過則將自己的檔案系統型別以及被掛載目錄的i節點資訊組成的一個唯一標識放到本地。當本地有對此檔案操作時,檔案系統就會檢查當前被掛載的目錄是本地檔案系統還是網路檔案系統。如果是網路檔案系統,則通過網路檔案系統協議傳送讀取檔案或者開啟檔案的請求,包含檔名以及讀取的位置或要寫入的資料或位置,然後遠端機器返回相應。

虛擬檔案系統

其實在上面說網路檔案系統時,我們就已經提到了。那個檢查要操作的檔案是本地還是遠端的檔案系統就是虛擬檔案系統,我們所有的檔案系統呼叫都應用到這個系統裡,這個檔案系統包含本地檔案系統處理辦法和遠端檔案處理辦法,比如當檢測是本地檔案,則使用本地檔案系統無論是ext2還是ext3進行操作,如果是網路檔案,則採用當前檔案的網路檔案系統協議進行通訊完成操作,這樣我們就不必去關心檔案是在本地還是在遠端,是在記憶體還是在磁碟上。

 

總結

檔案系統的工作就是幫我們完成檔案在磁碟上的儲存功能,而且是高效的、節約的。最後還是那句話,無論是什麼技術,都是一步一步的完善的,剛開始的檔案系統就是在磁碟上連續分配,後來一步一步的改良,到達現在的局面。現在我們有了更加健壯的檔案系統 有了更加快速的記憶體檔案系統 還有更方便的網路檔案系統。還有另一個更重要的就是磁碟陣列來分散讀寫請求以及實時備份資料。

相關文章