歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

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設備,就可以建立內存文件系統相關的虛擬磁盤設備,基本上,這兩個內存文件系統將滿足絕大多數應用系統的需要。然而,一個非常重要的問題仍然存在,就是這些內存文件系統都是在系統啟動之後,通過相應的配置命令進行配置的,而在一些情況下,需要在系統啟動或啟動之前,就配置好內存文件系統。 這種在系統啟動之前要求配置好內存文件系統的例子之一就是系統安裝程序,因為安裝系統通常都是使用光盤或軟盤啟動,光盤或軟盤作為系統的根文件系統當然是可行的,但總存在種種限制,例如軟盤的訪問速度和可靠性限制,光盤的只讀限制等等。因此,目前的FreeBSD的系統安裝程序,是使用內存文件系統作為安裝系統的根文件系統,而不是試圖將軟盤或光盤作為安裝系統的根文件系統。在這種情況下,通常使用一個獨立的系統鏡像文件,在啟動之前載入內存,作為內存文件系統的初始數據來配置內存文件系統。 為了達到這個目的,就需要使用系統中的偽設備md,這需要相應的內核支持"pseudo-device md",這個選項通常需要重新定制內核。此後,還需要在/dev目錄下創建相應的設備文件md0和md0c。這樣使用新內核重新啟動之後,就可以用使用普通磁盤一樣的方法來使用它了,而不需要任何配置過程。 # disklabel -r -w /dev/md0c auto # newfs /dev/md0c # mount /dev/md0c /tmp 這裡不需要使用任何配置程序配置虛擬磁盤設備,因為在啟動過程中它就被自動配置了,內核為設備自動申請必要的內存空間。需要注意的是,使用MD設備並沒有指定磁盤的大小,因為預先保留的md磁盤的大小是在編譯內核時就確定的,缺省大小為20000個扇區。如果要更改內核為MD設備分配的空間大小,就需要在定制內核時改變設置選項”MD_NSECT”的值,並重新編譯內核。顯然,這樣做顯然比較麻煩,也使得它的實際用處不大。 但當MD設備用在安裝系統的時候,作為最初啟動的虛擬磁盤需要載入一個預先配置好的磁盤鏡像文件,這個時候虛擬磁盤的大小就是由這個磁盤鏡像文件決定的,而不再是MD_NSECT設置的值。正是由於MD設備在啟動過程中配置,因而靈活性不足,就使得MD設備主要用在安裝系統中。 啟動鏡像設置 對於系統安裝程序,或者一些嵌入式系統來講,存儲數據的物理設備無法很方便的作為文件系統存在,例如存儲設備為不可擦寫的ROM或者具備一定擦寫壽命的 Flash中,這些設備如果用作文件系統就有各種各樣的限制,此時就需要使用內存文件系統作為輔助,例如使用內存文件系統作為根文件系統,或者作為臨時文件系統等等。 但是由於內存文件系統是使用不可長期保存的RAM存儲器保存數據,系統重新啟動或斷電後其中保存的數據就不再存在,因此每次啟動之後虛擬磁盤中的數據都是隨機的,需要重新進行初始化操作。也可以提供一種手段為最初的虛擬磁盤提供初始數據,通常這通過使用鏡像文件的方法來完成。 使用偽設備MD,就可以將一個預先准備好的文件作為md設備的鏡像數據,這樣MD設備一旦創建就已經具備了必要的數據,而系統啟動之後立即可以訪問已經具備數據的虛擬磁盤了。通過這樣的操作,就可以使用虛擬磁盤文件系統作為根文件系統,啟動其中的系統安裝程序。 因此,這個時候就需要為MD設備准備初始鏡像文件,最直接的方法是首先用確定的大小創建MD設備,初始化文件系統,安裝上文件系統並復制必要的數據,然後在卸載文件系統,使用dd命令直接操作虛擬磁盤設備,將數據復制到一個鏡像文件中。但是由於MD設備的大小比較不容易改變,因此這種方法並不靈活。此外,由於MD設備被作為一個虛擬的物理磁盤被系統處理,系統對它的處理事實上是和真實物理磁盤設備的處理方法也是一樣的,因此也可以使用物理磁盤,創建文件系統並復制其鏡像的方法來獲得鏡像數據。 使用虛擬磁盤MD和物理磁盤都可以得到鏡像文件,但是這兩種方法都不是很靈活,最好的方法是可以直接修改鏡像文件本身。事實上VN設備正是用作這個處理任務,它能使用鏡像文件作為虛擬磁盤的存儲區域,使用VN設備創建並修改鏡像文件的數據是非常適合的。因此在大小一致的條件下,就可以直接將VN設備的鏡像文件復制到MD設備上,然後將MD設備安裝到系統中,就可以訪問到具體數據。 因此,使用VN設備預先定制好MD設備使用的鏡像文件是最常用、最方便的方法。系統載入鏡像文件的過程應該在啟動之前完成,以便系統在啟動過程中能夠配置好該MD設備。事實上,鏡像文件是由Boot Loader載入的,作為MD設備的缺省數據。當然,另一種選擇是直接將鏡像文件寫入內核文件中,使得鏡像數據和內核一起載入。將鏡像文件寫入內核的方式需要改動內核,並且寫入之後就不容易改變鏡像文件中的數據,因此,目前這種方式很少被用到。 為了將鏡像文件寫入內核,需要設置內核選項MD_ROOT_SIZE,需要指定它的尺寸大於鏡像文件的尺寸,以便系統在內核中保留出大於鏡像文件的自由空間,以使得寫入的數據不至於覆蓋內核中有用的數據。這個參數和MD_NSECT是不同的,但它也為一個虛擬磁盤預保留了空間。如果是使用Boot Loader來載入鏡像文件,就不能設置這個選項,因為這將導致系統在啟動時初始化多個虛擬磁盤,而只有第一個虛擬磁盤md0才是可以啟動的。 當然,一個能夠將MD設備作為啟動根文件系統的內核,除了標准的md和MFS選項之外,還需要"options MD_ROOT"的設置選項,以保證內核搜索MD設備的作為根文件系統。這個設置也可以寫作"MFS_ROOT",以便和早期的FreeBSD系統兼容,早期的FreeBSD系統沒有使用md偽設備,而是使用第二種直接寫入內核的MFS文件系統作為根文件系統。 幾種不同方式的比較 無論是MFS,還是VN設備和MD設備,它們對數據的處理方式其實是非常類似的,MFS就是直接在內存中開辟一個UFS格式的區域,用作文件系統,這個區域其實就是一個虛擬磁盤鏡像。而VN設備和MD設備是先申請內存空間,然後采用標准的文件系統工具進行處理,因此更為靈活。 最為重要的一點區別實際上是它們獲得自由內存空間的方式不同,MFS和VN實際上是使用動態的方式申請虛擬內存,而md設備實際上是在系統啟動之前已經分配完畢,是一種靜態的方式,其實是通過內核申請空間的方式MALLOC分配的。這樣就導致MFS和VN設備申請的內存是按照虛擬內存的方式進行處理,就是說它們是基於交換空間的,在物理內存不夠的情況下將被自然的交換到磁盤設備中。而MD設備使用的內存是內核申請的,因而位於內核空間中,主要占用物理內存。 這兩種不同的使用內存的方式,造成了這幾種不同的內存文件系統的不同用途和使用限制,MFS和VN可以使用更多的交換空間,因而容量更大,使用更靈活,但在高負載的情況下由於系統交換,仍然會造成磁盤訪問。雖然對於md設備,這種現象理論上不會發生,但md設備的大小是受到物理內存的限制的,占用的是寶貴的內核空間,因此主要用來處理比如啟動鏡像這樣的情況,而很少用來處理其他任務。 除了這些文件系統之外,FreeBSD上事實上還有其他的一些內存文件系統,例如V9FS,這種文件系統的特征是一個純粹的文件系統,沒有涉及磁盤的那些扇區、塊等概念等等,這些文件系統目前還不是很完善,也不是標准系統的一部分。 對於內存文件來講,一些特色其實是非常有意義的,例如文件系統的壓縮技術,由於它能夠減少內存空間的大小,因此對於內存文件系統是非常有意義的,可以用於嵌入式系統等領域。雖然有人在這個方面曾經做過努力,但目前這種特性在FreeBSD下還不能直接得到。 FreeBSD 5.0中內存文件系統 當對這幾種不同的文件系統進行分析比較之後,可以發現它們存在很多種共性,例如MFS和vn設備對於內存的使用方式是相同的,而vn設備和md設備由於都是虛擬磁盤,因此其內容是相同的,這也導致了可以使用vn設備為md設備創建鏡像文件。因此,完全可以將這三種不同的使用內存文件系統的方式合並起來,使設置和操作更為簡單易用。 事實上,之所以存在這幾種不同的內存文件系統,源於FreeBSD的歷史開發過程。最早的內存文件系統顯然是MFS,但由於不存在虛擬磁盤,存在種種不統一和協調的地方,因此後來就設計了MD設備。VN設備則與此無關,它最初就是為了文件作為存儲設備而設計的,但使用內存作為存儲顯然也十分直接和簡單。 因此,在最新的FreeBSD 5.0版本中,這些內存文件系統的設置都統一起來,特別是將vn設備和md設備的功能都統一到新版本的偽設備md中。並且在FreeBSD 5.0下,設備的創建和內存的分配更為方便,不象在4.x之前,系統中的配置選項只能指定一定數量的虛擬磁盤設備(缺省是一個設備)。而且,由於 FreeBSD 5.0使用了DEVFS特色,設備文件的創建是自動進行的,不再需要手工使用MAKEDEV命令創建設備文件入口。 例如,需要從虛擬內存中申請內存創建內存文件系統的時候,就需要執行md設備的控制程序mdconfig: # mdconfig -a -t swap -s 30M 這就會在虛擬內存中申請30M空間,並創建虛擬磁盤,使用的虛擬設備為第一個md設備md0,如果系統中的md0設備已經被占用,那麼mdconfig就依序向後尋找下一個空余的md設備,並創建它。由於mdconfig能自動創建新的設備,這樣就解決了在內核配置文件指定偽設備數量的問題。 也可以使用-u指定使用的md偽設備的序號,例如下列命令將創建md10,並使用它作為虛擬磁盤設備: # mdconfig -a -t swap -s 30M -u 10 上面的命令都是使用虛擬內存空間作為數據存儲空間,是由swap參數指定的。同樣,使用mdconfig也能從內核空間中創建虛擬磁盤,此時-t指定的存儲類型參數為malloc,這告訴內核使用內核的MALLOC方法申請內存。 # mdconfig -a -t malloc -s 30M 這種方法就相當於老的md設備的申請內存的方法,但顯然更為靈活,因為可以在具體使用過程中申請內存和設備,這是因為FreeBSD 5.0的內核允許更靈活的使用MALLOC內存申請方式。當然,一般還是主要使用swap申請虛擬空間的內存。 由於mdconfig和偽設備md將完全代替vnconfig和偽設備vn,那麼使用mdconfig也能創建使用文件作為虛擬磁盤的與vn兼容的方式,這需要指定存儲類型參數為vnode,並使用 -f指定具體的存儲數據的物理文件名字。 # mdconfig -a -t vnode -f imagefile -s 30M 在使用mdconfig配置好虛擬磁盤之後,就可以使用disklabel、newfs、mount等管理虛擬磁盤。而在不需要這些虛擬磁盤的時候,就可以卸載相應的文件系統,並使用mdconfig刪除指定的磁盤等。 # mdconfig -l 使用參數”-l”,則mdconfig列出系統中所有的虛擬磁盤設備。 # mdconfig -d -u 0 為了刪除指定了磁盤,需要使用”-d"參數,而使用"-u 0”則指定刪除序號為0的虛擬磁盤,即md0。/*cp from chinaunix*/




 



Copyright © Linux教程網 All Rights Reserved