歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Unix知識 >> Unix教程

FreeBSD下的內存文件系統

FreeBSD
  大多數操作系統,包括FreeBSD,通常使用磁盤來保存需要存儲的數據。而操作系統采用文件的形式來保存數據,因此操作系統在磁盤上存儲數據需要按照一定的格式進行,以便系統能夠正確存儲和訪問文件,數據在磁盤上的組織格式被稱為文件系統,不同的操作系統通常使用不同的數據組織格式,就是說使用不同的文件系統,例如FreeBSD使用UFS,而Linux使用Ext2FS等等。UFS是最古老和標准的Unix文件系統,但FreeBSD下對其進行了改進,主要目的是改善性能,改進後的文件系統也被稱為FFS。
  
  由於文件系統已經成為了操作系統訪問外部磁盤數據的標准形式,操作系統很少直接訪問磁盤獲取數據。由於數據存儲在實際應用中的重要意義,文件系統已經成為操作系統最基本的元素之一。進一步,多個操作系統可以通過同樣的文件系統訪問外部磁盤,而同一個操作系統也可以通過不同的文件系統訪問不同的外部磁盤設備。這樣一來,文件系統就成為了界於操作系統和外部磁盤設備之間的一個獨立層次。
  
  正是由於文件系統已經成為了獨立的一個抽象層,因此可以在這個層次進行更為復雜的處理,例如不讓文件系統從磁盤設備設備上讀取數據,而是從網絡上讀取數據,就形成了網絡文件系統,從內存中讀取數據就形成了內存文件系統,對讀取的數據進行加解密處理,就形成了加密文件系統,等等。
  
  虛擬磁盤和內存文件系統
  
  雖然目前磁盤的容量、速度和可靠性基本上能滿足絕大多數應用系統的要求,但是在某些情況下,使用磁盤存儲數據仍然存在一些問題。一個例子是在嵌入式系統中,系統通常沒有磁盤,數據通常存儲在各種不可擦寫或可擦寫型半導體芯片中。另一個常遇到的例子是應用系統對於數據訪問要求特別高的性能,由於磁盤是一種機械設備,讀寫的性能總是有限的,不能滿足應用系統的需要。
  
  在這些例子中,在面對需要解決的問題的時候,通常有一個隱含前提,就是不改動操作系統和應用程序本身。如果可以改動系統,那麼,人們就可以針對具體的需要設計另外一套完整的系統,上述問題事實上也就並不存在了。但是這種做法並不現實,因為這將意味著將全部操作系統和應用系統都推倒重來。因此,為了解決這些極端的需求,最簡單的方法是在內存中分配一個區域作為文件系統的數據存儲區,而不是使用磁盤作為存儲設備,這樣既能夠滿足操作系統對文件系統的需求,也能夠滿足應用系統的特殊需要。
  
  使用內存作為文件系統基本上有兩種不同的選擇方式,最簡單的方式是將內存中的一個區域模擬一個磁盤分區,然後就可以在這個虛擬磁盤上按照現有的文件系統組織數據,因此就需要初始化文件系統、裝載與卸載等標准文件系統操作。另一種方法為重新設計一套全新的文件系統,其中並不包含任何磁盤的概念,但在系統中表現為一個標准文件系統。明顯的,重新設計一套文件系統需要更多的工作量,因此,絕大多數情況下,人們使用第一種虛擬磁盤的方法。但是,現有的文件系統,如UFS等,都是基於磁盤設備而設計的,因此很多概念,比如按磁盤塊讀取數據、緩沖、碎片等等,都是針對磁盤設備提出的,理論上基於內存的存儲不需要這些概念,因而也不會出現這些概念需要解決的一些問題。
  
  由於內存文件系統是使用內存來模擬磁盤操作,因此數據都是在內存之間傳輸,就可以得到比較高的讀寫性能。當然,使用內存文件系統,一旦系統重新啟動,所有的內容也就不再存在了,因此只能用來保存臨時性的數據。也是由於是使用內存來保存數據,緩沖實質上沒有任何意義,傳統文件系統中的異步”async”和同步”sync”這兩種概念的意義也不大了。
  
  雖然從本質上講,內存文件系統根本不需要緩沖,直接訪問就能達到最好的效率,但是很難做到這一點,尤其是由於目前都還是使用內存來模擬一個磁盤設備的情況,內存文件系統事實上還是經過了緩沖。從這個地方,也可以看出目前使用的內存文件系統的弊病,內存文件系統本身占據了一份內存,磁盤緩沖又會占據一份內存,這樣就導致了內存的浪費。在系統有交換分區存在的條件下,一旦系統內存緊張,該文件系統中的有關數據也會被交換到具體的交換設備上,同樣避免不了對磁盤的物理訪問,達不到提高性能的目的。而且一旦包括交換空間在內的所有虛擬內存用光,系統就無法正常提供服務了,從而影響系統的穩定性。
  
  試圖使內存文件系統繞過磁盤緩沖其實並不容易,這是因為在目前的操作系統中,磁盤是非常重要的一部分。非常重要的虛擬內存概念就是使用磁盤設備作為交換設備模擬內存,而磁盤緩沖而是通過內存來緩沖磁盤數據,虛擬內存、磁盤緩沖就是操作系統內存管理中的最基本元素,如何處理這兩個部分,也是影響系統性能的最重要的因素。文件系統實質上是建立在操作系統的內存管理部分之上的,因此繞過這一部分,需要更困難的內核工作。
  
  因此,對於高負載的服務器,使用內存文件系統實際上得不償失,在系統內存很快用光的情況下,操作系統將進行磁盤交換,導致系統性能嚴重下降,這比起直接使用磁盤文件系統更為糟糕。事實上,在高負載的服務器環境下,允許系統使用更多的內存來緩沖磁盤數據,更有效的發揮系統的磁盤緩沖能力,在實際使用中更為有效。
  
  使用MFS
  
  FreeBSD下最基本的內存文件系統為MFS(Memory File System)文件系統,它是直接從虛擬內存中為文件系統申請空間。雖然它命名為MFS,實質上它還是使用的標准UFS的數據組織格式,仍然有扇區、磁盤塊等基本概念,但是為了使用方便,它沒有創建可以被直接訪問的虛擬磁盤設備。實際上MFS是一個不完整的虛擬磁盤系統,由於它沒有虛擬磁盤設備,因此導致在一些情況下它不能很方便的應用。
  
  使用MFS需要內核中的”options MFS”支持,這個選項實質上是一個標准選項,在缺省情況下的FreeBSD內核都支持,因此一般不需要重新定制內核。然後就可以使用mount_mfs來安裝內存文件系統,或者在標准mount命令中指定mfs選項。
  
  # mount_mfs -s 131072 /dev/da0s1b /tmp
  
  執行這個命令之後,mount_mfs就從虛擬內存中申請131072個扇區大小的內存,用來作為MFS文件系統的存儲區域,並將該文件系統安裝到/tmp目錄下。這裡使用/dev/da0s1b作為設備文件參數,這個磁盤分區為一個交換分區,它並不是實際使用的磁盤設備或虛擬磁盤,它的基本目的是用來滿足mount_mfs的參數需要。即使系統中有多個交換設備,這也並不意味著MFS就只會交換到這個指定設備上,虛擬內存按照自己的規則分配物理內存或交換空間。
  
  當然,使用交換設備作為參數事實上也起到了一些額外的作用,因為對於標准文件系統來講,必須通過初始化的過程確定文件系統的組織格式,而MFS不需要獨立的初始化過程,在mount_mfs操作的時候就同時執行了初始化,因而mount_mfs可以從這個設備文件中讀取一些初始化相關的參數信息,例如每個扇區大小等,來初始化MFS文件系統。通常扇區尺寸為512字節,因此該文件系統總大小為64M。
  
  這裡就可以看出,基本的MFS是不存在虛擬磁盤設備的,mount_mfs直接申請內存並用作文件系統,而在mount命令中使用的設備參數為交換設備而非虛擬磁盤設備。一些情況下希望操作虛擬磁盤設備,那麼使用MFS就不方便了。
  
  使用vn偽設備
  
  MFS是通過一個獨立的文件系統來達到內存文件系統的目的,偽設備VN就是通過另一種方式來達到這個目的,它直接模擬一個虛擬的磁盤設備,那麼在這個虛擬磁盤設備中可以應用各種不同的文件系統來保存數據。VN設備需要內核支持"pseudo-device vn"配置和/dev目錄下的設備文件vn0、vn0c等,這通常不是缺省配置,需要用戶重新定制內核。
  
  VN設備主要使用文件作為虛擬磁盤的存儲空間,例如將光盤的鏡像文件用作虛擬光盤設備,將軟盤的鏡像文件作為虛擬軟盤設備等等。當然模擬是有一定限度的,主要用來模擬文件系統,例如虛擬光盤設備上就沒有音軌數據,無法作為CD播放等等。
  
  顯然使用內存保存虛擬磁盤數據,與使用文件相比甚至更為簡單。因此,VN設備也支持使用內存來模擬一個虛擬磁盤。VN設備需要使用vnconfig程序來控制虛擬磁盤設備,那麼為指定虛擬磁盤磁盤申請內存,並配置該虛擬磁盤的操作為:
  
  # vnconfig -s 131072 /dev/vn0c
  
  這裡使用-s參數指明申請內存空間的大小,而vn0c為空閒的虛擬磁盤設備。配置好了虛擬磁盤之後,就可以使用標准的磁盤操作命令對磁盤進行操作,包括文件系統的初始化。對於虛擬磁盤設備來講,一般不需要分區操作,而是直接進行文件系統操作,事實上虛擬磁盤通常也沒有分區的概念,fdisk命令也不識別虛擬磁盤,可以將虛擬磁盤設備當作一個完整的分區設備。這是因為在Unix下本來是沒有磁盤分區的概念的,這個概念是DOS/PC概念,因此FreeBSD對磁盤分區的支持限於可能存在其他系統的物理磁盤,對於只用於Unix的虛擬磁盤,就不需要這個概念了。
  
  # disklabel -r -w /dev/vn0c auto
  
  # newfs /dev/vn0c
  
  # mount /dev/vn0c /tmp
  
  由於使用VN設備比起MFS來講要多一個創建虛擬磁盤設備的過程,因此使用vnconfig就與使用mount_mfs不同,要略微麻煩一些,除了需要經歷vnconfig配置虛擬磁盤之外,還需要初始化磁盤設備、創建文件系統等步驟。
  
  顯然,由於創建了虛擬磁盤設備,在這裡就不再是裸的MFS系統,而是一個更為完善的虛擬磁盤系統。顯然,這裡就不需要MFS的幫助,而在newfs和mount時直接使用UFS文件系統。理論上可以使用各種不同的文件類型格式,並不限於是UFS。
  
  內存磁盤設備md
  
  使用MFS系統,就可以最方便快捷的建立內存文件系統,使用vn設備,就可以建立內存文件系統相關的虛擬磁盤設備,基本
Copyright © Linux教程網 All Rights Reserved