10. 檔案系統 (File System)

檔案系統

  檔案系統是操作系統用於明確磁盤或分區上的檔案的方法和數據結構;即在磁盤上組織檔案的方法。也指用於存儲檔案的磁盤或分區,或檔案系統種類。因此,可以說「我有 2 個檔案系統」意思是他有 2 個分區,一個存檔案,或他用「擴展檔案系統」,意思是檔案系統的種類。磁盤或分區和它所包括的檔案系統的不同是很重要的。少數程序(包括最有理由的產生檔案系統的程序)直接對磁盤或分區的原始扇區進行操作;這可能破壞一個存在的檔案系統。大部分程序基於檔案系統進行操作,在不同種檔案系統上不能工作。

  一個分區或磁盤能作為檔案系統使用前,需要初始化,並將記錄數據結構寫到磁盤上。這個過程就叫建立檔案系統。大部分 UNIX 檔案系統種類具有類似的通用結構,即使細節有些變化。其中心概念是超級塊 superblock,i 節點 inode,數據塊 data block,目錄塊 directory block,和間接塊 indirection block。超級塊包括檔案系統的總體信息,比如大小(其準確信息依賴檔案系統)。i 節點包括除了名字外的一個檔案的所有信息,名字與 i 節點數目一起存在目錄中,目錄條目包括檔案名和檔案的 i 節點數目。i 節點包括幾個數據塊的數目,用於存儲檔案的數據。i 節點中只有少量數據塊數的空間,如果需要更多,會動態分配指向數據塊的指針空間。這些動態分配的塊是間接塊;為了找到數據塊,這名字指出它必須先找到間接塊的號碼。

  UNIX 檔案系統通常允許在檔案中產生孔(hole),意思是檔案系統假裝檔案中有一個特殊的位置只有 0 字節,但沒有為這檔案的這個位置保留實際的磁盤空間。這對小的二進製檔案經常發生,Linux 共享庫、一些數據庫和其他一些特殊情況。孔有一定的用處。在筆者的系統中,一個簡單的測量工具顯示在 200MB 使用的磁盤空間中,由於孔,節約了大約 4MB。在這個系統中,程序相對較少,沒有數據庫檔案。檔案系統的功能包括:管理和調度檔案的存儲空間,提供檔案的邏輯結構、物理結構和存儲方法;實現檔案從標識到實際地址的映射,實現檔案的控制操作和存取操作,實現檔案信息的共享並提供可靠的檔案保密和保護措施,提供檔案的安全措施。檔案的邏輯結構是依照檔案的內容的邏輯關係組織檔案結構。檔案的邏輯結構可以分為流式檔案和記錄式檔案。主要缺陷:數據關聯差,數據不一致,冗餘性。

  一般來說,在選擇檔案系統時,我們所關注的是檔案存取時的速度和資源消耗,以及穩定度。如果你沒有這類需求,實際上是不用特別更換它的。

檔案的觀念

檔案特性

  檔案除了以檔案名稱來指定某一檔案以方便人類的使用,還有一些其它特性,這些特性隨著作業系統不同而有所差異,但通常包括了:

  • 名稱(name):符號式的檔名是唯一用人看得懂的格式儲存。
  • 識別符號(identifier):獨一無二的標籤,通常是一個數字,用來辨識檔案系統內的檔案;它是這個檔案之非人類可讀的檔名。
  • 型態(type):這項資訊對於提供不同檔案型態的系統有需要。
  • 位置(location):一個指標指向該檔案所在裝置的位置。
  • 大小(size):該檔案目前容量的大小(以字元、位元組或區段為單位),以及允許以後擴增的最大範圍。
  • 保護(Protection):存取控制資訊,控制誰能讀、寫、執行等資料。
  • 時問、日期和使用者辨識:這項資訊可以保存產生上次修改和上次使用資料,以做為保護、安全,以及使用監督。

檔案運作

  技術上來說,檔案系統是一種儲存和組織電腦檔案和資料的方法,它使得對其存取和尋找變得容易。檔案系統通常使用硬碟和光碟這樣的儲存裝置,並維護檔案在裝置中的實體位置。但是,檔案系統也可能僅僅是一種存取資料的介面而已,實際的資料是透過網路協定(如 NFS、SMB、9P 等)提供或於內部記憶體上,甚至可能根本不存在對應的檔案(如 proc)。嚴格地說,檔案系統是一套實作了資料的儲存分級組織存取獲取等操作的抽象資料型式(Abstract data type),為了適切地定義檔案,必須考慮檔案上所表現的操作如下:

  • 建立檔案:建立檔案需要兩個步驟。首先,為了這個檔案,其空間必須在檔案系統中被找到。其次,必須在目錄中為新檔案做一個項目。
  • 寫入檔案:需要做一次系統呼叫,指定檔案名稱和欲寫入檔案之資訊。系統必須保持一個寫入指標到檔案的位置,下一個寫入在這個位置發生。當寫入發生時,寫入指標必須被更新。
  • 讀取檔案:一個系統呼叫指定了檔案的名稱和檔案下個區 段被放置的處所(在記憶體中包括目錄、區段)。一旦那個區段被讀出,此指標即被更新。
  • 重置擋案:搜尋目錄以找到相關的進入點,然後把目前檔案位置設定成某一固定值。這個檔案操作也稱為檔案搜尋。
  • 刪除檔案:搜尋目錄以找此檔案。在找到相關的目錄項目後,釋放所有檔案的空間,並且將此目錄項目作廢。
  • 縮減擋案:使用者可以使用此功能使檔案特性保持不變(除了檔案長度),但檔案恢復為長度零。

  而對於每一個開啟的檔案也都有以下相關的資訊:

  • 檔案指標:對於 read 和 write 系統呼叫沒有包含檔案位移的系統而言,它們必須追蹤上一次讀/寫的位置,以做為目前檔案位置的指標。
  • 檔案開啟計數:檔案開啟計數器記錄開啟和關閉的次數,在最後一個關閉動作時就變成零。然後系統就可以把該檔的進入點從表格移去。
  • 檔案的磁碟位置:檔案在磁碟位置的資料存放在記憶體中,以避免每一次檔案操作時都必須從磁碟讀出。
  • 存取權限:行程以一種存取模式開啟檔案,這個資訊被存放在行程表中,所以作業系統可允許或拒絕輸入/輸出的需求。

檔案型態

檔案結構

  檔案型態也可以用來指出檔案的內部結構。原始檔和目的檔的結構正符合讀取它們的程式之要求。進一步而言,有些檔案必須符合一定的結構,作業系統才能夠瞭解其內容。作業系統可能會要求一個可執行檔有一定的結構,以便決定將檔案載入到記憶體的什麼地方,以及第一個指令的位置。有些作業系統將此觀念延伸到一組系統支援的檔案結構,對於這些檔案結構都有特殊的操作來處理這些檔案。

內部檔案結構

  對於一套作業系統而言,找到內部某一特定位置可能十分複雜。磁碟系統通常會有一定義完善的區段大小(sector),所有磁碟的輸入/輸出都是以區段為單位來執行,此區段就是實體記錄(Physical record),所有的區段大小皆相同。實體記錄的大小不太可能會和邏輯記錄(logical record)正好相同。邏輯記錄甚至會有不同的長度。將一些邏輯記錄組成實體記錄是常見到的解決方法。邏輯記錄的大小,實體區段的大小,以及組成區段的技巧決定了,在每一筆實體區段中可以有多少筆邏輯記錄。任何一種情況下,檔案都可以視為一連串的區段,所有的基本輸入/輸出函數皆是針對區段來操作。

存取方法

循序存取

  最簡單的存取方法。檔案中的資訊是依著記錄次序一筆接著一筆處理的,這也是至今最通用的檔案存取模式。

直接存取

  檔案是由固定長度的邏輯記錄(logical record)所組成,這可以讓程式不必以一定的順序,快速地讀寫記錄。直接存取方法是以檔案存放在磁碟上的模式為基礎,因為磁碟允許隨機存取任何檔案區段。為了要直接存取,檔案被視為一串編有號碼的區段或記錄。

其它的存取方法

  其它的存取方法以建立在一個直接存取方法的基礎上。這些方法一般都包含了對檔案所設的索引結構。索引(index),包含指向不同區段的指標(Pointer)。要找檔案中某個單元,先在目錄中尋找,然後使用指標去直接存取檔案和找出所要的單元。

目錄和磁碟結構

  每個包含檔案系統的卷也必須包含關於系統中檔案的資訊。這個資訊被保留在設備目錄或內容的卷表。設備目錄(通常稱為目錄)紀錄卷上的所有檔案資訊-如:名稱、位置、大小和形態。

儲存裝置

  一般用途的電腦系統有多個儲存設備,而那些設備可以被細分為擁有檔案系統的卷。電腦系統可能有零或多個檔案系統,而檔案系統可能有不同的型態。

目錄概觀

  可對目錄執行的操作

  • 搜尋
  • 建檔
  • 刪除檔案
  • 列印目錄
  • 更改檔名
  • 追蹤檔案系統

單層目錄

  最簡單的目錄結構就是單層目錄。所有的檔案都裝在同一目錄中,非常容易瞭解與使用。

雙層目錄

  在雙層目錄結構中,每個使用者擁有自己的使用者檔案目錄(user file directory, UFD)。每個 UFD 都有一個相似的結構,但是只列出單一使用者的檔案。當一個使用者的任務開始了或是一個使用者簽到(login)之後,系統的主檔案目錄(master file directory, MFD)就被搜尋一遍。主檔案目錄是用使用者姓名或是帳號來索引,並且其中每單元都指向一個使用者的使用者檔案目錄

樹狀目錄

  把雙層目錄視為一棵二階的樹,由目錄結構發展成一棵任何型式的樹自然產生了樹狀目錄。這將允許使用者去建立他們自己的副目錄,並且可以適當地組合他們的檔案。樹是最常見的目錄結構。樹有一個根部目錄,在此系統中的每一個檔案都有一個單獨的路徑名稱。

非循環圖型目錄

  一個非循環圖型(acyclic graph)則允許目錄中的副目錄或檔案被共用。相同的檔案或子目錄可以在兩個不同的目錄中。非循環式圖型是樹狀結構目錄法的自然發展結果。

一般圖型的目錄

  使用非循環圖型結構時最嚴重的問題就是如何保證沒有循環存在。如果以雙層目錄開始,並且允許使用者建立子目錄,一個樹狀結構的目錄就形成了。很容易看出來加入新的檔案和子目錄到現有的樹狀目錄上仍可保持它的樹狀結構特性。但是,當將鏈加到現有樹狀結構的目錄上時,樹狀結構就被破壞了,造成了一個一般圖型結構。

檔案系統安裝

  正如同一個檔案必須先開啟才可以使用,一個檔案系統必須先安裝才可以被系統的行程取得。更特別的是,目錄系統可以由許多分割區建立起來,此種目錄必須被安裝才可以讓它們在檔案系統的命名空間中被取得。

檔案分享

多使用者

  當作業系統容納多位使用者時,檔案分享、檔案命名和檔案保護等事項變得很重要。對於檔案可以被使用者分享的目錄,系統必須調解檔案的分享。在預設情況下,系統可以允許使用者存取其它使用者的檔案,或是它可能要求使用者獲得該檔案的存取權。

遠端檔案系統

  網路允許遠端的電腦間彼此通信。網路允許資源的分享散佈在校園或甚至於整個世界。一種明頓的分享資源是資料(以檔案的型式)。經由網路和檔案技術的演進,檔案分享的方法也已經改變。

  • 在最先製作的方法中,使用者以人工的方式經由類似 ftp 的程式在機器之間傳送檔案。
  • 第二種主要的方法是一種分散式的檔案系統(distributed file system, DFS),這種方法讓遠端的目錄在本地端也許可以看得見。
  • 第三種方法(全球資訊網,World Wide Web)。網頁瀏覽器需要用來取得遠端檔案的存取權,而其它的操作則被用來傳輸檔案。
客戶-伺服器模型

  遠端檔案系統允許電腦從一台或多台遠端機器安裝一個或多個檔案系統。包含檔案的機器是伺服器,希望存取檔案的機器是客戶。

分散式資訊系統

  為了使客戶伺服器的管理更簡單,分散式資訊系統(distributed information system,也稱為分散式命名服務,distributed naming services)已經被發明用來提供遠端計算所需之資訊的一致性存取。領域名稱系統(domain name system, DNS)提供整體網際網路的主機名稱到網路位址的轉換(包括全球資訊網)。

失效模式

  區域檔案系統可能因一些不同的原因而失效,包括存放檔案系統之磁碟的失效、目錄結構或其它磁碟管理資訊(統稱為 metadata)的損毀、磁碟控制器的失效、纜線失效或主機轉接器失效。使用者或系統管理者的失效可能也會造成檔案遺失或者整個目錄或分割區被刪除。許多這種失效將造成主機毀損和錯誤情況顯示出來,並且要求人為介入做修復。

一致性語意

  一致性語意(consistency semantics)為評估任何支援共用檔案系統的一項重要判斷標準。它是一項系統特性,該特性規定多個使用者同時存取一個共同檔案的語意。這些語法在由一使用者修改資料且該資料可被其它使用者看到時更應當明白規定。

UNIX 語意

  UNIX 檔案系統使用下列一致性語意

  • 一位使用者對一已開啟檔案進行寫入的動作時,可被其它也開啟該檔案的使用者立即看見。
  • 具有共用的模式,在該模式下使用者共同指向檔案目前位置的指標。因此,只要有一位使用者前進該指標會影響所有共用的使用者。
會議語意(session semantic)

  Andrew file system, AFS 檔案系統使用下列一致性語意:

  • 一位使用者對一已開啟檔案進行寫入之動作時,無法被其它也開啟該檔案的使用者立即看見。
  • 一旦關閉一個檔案,其所做之改變只能在下一次會議中看見。已開啟該檔案的其它使用者無法察覺這些改變。
不變共用檔案之語意

  一種不同而相當特殊的方法是不變共用檔案(immutable shared files)。一旦檔案由其建檔者宣告成共用,則它便不能再做任何修改。一個不變檔案有兩個重要性質:其名稱不能重複使用以及其內容不可更動。

保護

  當資訊保存在電腦中,需關切的就是它的保護問題,其中包含有實體上的損毀(可靠度的問題)或是不當的存取(防護的問題)。

存取型態

  檔案需要保護乃是存取檔案的能力所造成的結果。在不允許其它使用者存取檔案的系統中,根本不需要保護。我們需要的是帶有管制的存取(controlled access)。提供帶有管制的保護方法就是限制可以使用的存取檔案型式。允許或是拒絕檔案被存取完全由一些因素來決定,存取的型式就是其中之一。許多可以控制的作業類型如下:

  • 讀取(read):從檔案中讀取。
  • 寫入(write):寫入或重寫某檔案。
  • 執行(execute):將檔案載入記憶體並且執行它。
  • 附加(append):將新資料寫在檔案尾端。
  • (delete):除掉某檔案並且將其所佔用空間讓給可能的重新使用。
  • 列出(list):列出檔案的名稱和特性。

存取控制

  一種常見的保護方法是,根據對使用者的識別來決定能否做存取。不同的使用者可能需要不同類型的存取檔案或目錄的方法。以一個存取串列(access control list, ACL)來對應一個檔案或目錄,並且用它來識別使用者名稱與該使用者所被允許的存取類型。當一個使用者要求某一個檔案的時候,作業系統就檢視該檔案的存取串列。如果串列中該使用者被列在他所要求的存取類型中,該項存取就會被允許。否則,就違反了保護措施,使用者的工作會被終止。

其它保護方法

  另外一種方法是每個檔案都聯結一個密碼。好像要使用電腦系統的時候也必須通過密碼的控制一樣,要使用任何檔案也必須以相同方法先通過密碼。

  使用密碼的兩個缺點:

  1. 如果我們在各檔案處都外加一個密碼,使用者必須記住的密碼就非常多,這使的此方法變得相當不實際。
  2. 如果所有的檔案只使用一個密碼的話,那麼,當此密碼被查知時,所有的檔案又將全部會變成可存取檔案。