王 健,李小勇
飛機在一次飛行過程中,需要對機載采集卡上采集的各項參數進行記錄,如發動機參數,音頻數據和視頻數據等。這些數據的采集、存儲和處理,為進行飛行事故征候分析、故障診斷、視情維修、飛行品質監控、試飛監控等提供了豐富信息。然而,由于缺少統一的數據記錄和存儲標準,不利于數據的分析和共享。1994年,美國靶場司令委員會(RCC)決定不再要求統一的記錄介質的格式,而是定義統一的數據格式,形成大家公認的數據接口。2004年5月,RCC對IRIG 106第十章進行修改,提出了固態記錄標準。通過RCC,廠商和用戶多年共同努力,2007年2月,IRIG 106第十章被修改為:數字記錄標準。目前,IRIG數字記錄標準已成為國際公認標準之一。
IRIG 106第十章采用STANAG-4575文件系統作為數據存儲方式。STANAG-4575文件系統是北大西洋公約組織(NATO)制定的可卸載記錄模塊上的數據存儲標準。之所以選擇該文件系統,是因為它對記錄中的順序寫操作進行了優化。同時,STANAG-4575文件系統的元數據開銷很小,并且可以支持很大的文件(64位)。選擇該標準文件系統的另一個優勢是它可以保證記錄數據可以向前或向后兼容。
在飛機的記錄設備中,通常采用VXWorks操作系統。VXWorks是美國風河公司(WindRiver)開發的嵌入式實時操作系統。它憑借良好的可靠性和卓越實時性在嵌入式實時操作系統領域占據重要地位。它被廣泛地應用在通信、軍事、航空、航天等高精尖及實時性要求極高的領域中,如衛星通訊、軍事演習、彈道制導、飛機導航等。在美國火星探測器“勇氣號”和“機遇號”均采用VXWorks作為其操作系統。
VXWorks下層采用與FAT文件系統相兼容的dosFs作為其本地文件系統,該文件系統的主要問題有:
1) 單個文件最大只有 4GB,隨著磁盤容量的增加以及對記錄高清視頻數據的需要,這個限制會嚴重影響上層記錄軟件的實現;
2) 長時間的記錄過程可能會導致文件系統的碎片增加,使磁盤記錄性能嚴重下降;
3) 在出現意外斷電等情況時,文件系統可能整個被破壞,導致文件數據無法恢復;
因此,我們在VXWorks上實現了STANAG-4575文件系統,來解決上面這些問題。該實現主要的優點包括:
1) 通過對關鍵元數據信息進行備份和校驗,提高了系統的可靠性;
2) 通過哈希表等數據結構來管理文件系統的元數據,提高了系統的性能;
3) 通過既遵循標準,又靈活變通的實現來提高系統的性能和可靠性;
4) 通過控制元數據和數據的寫入方式來保證數據在磁盤上的一致性。
STANAG-4575文件系統是北大西洋公約組織(NATO)為可卸載記錄模塊(如固態硬盤)制定的數據存儲標準。通過引入該標準,IRIG 106可以讓記錄數據不依賴于下層設備,并且可以保證記錄數據向前和向后的兼容性。
STANAG-4575文件結構定義所規定的文件系統格式,如圖1所示:

圖1 文件系統結構
如圖1所示,除邏輯磁盤塊0保留之外,其他的邏輯塊包括兩種類型,一種是目錄塊,用來存放文件的元數據,另一種是數據塊,用來存放文件的數據。
該文件結構定義規定,邏輯塊1必須為一個目錄塊,其他的目錄塊通過雙向鏈表方式(前向鏈表和后向鏈表)連接起來。
一個目錄塊的頭部 64字節包括該目錄塊的元數據信息,接著為該目錄塊中包含的文件項(File Entry)數組。每個文件項占用112字節,包含了文件的元數據信息,主要有:文件名、文件創建時間、文件大小、文件數據的起始塊地址、文件數據占用磁盤塊數和文件關閉時間。
文件的數據部分用來存放上層用戶的數據,對于訪問文件系統的接口來說,文件數據必須呈現邏輯上連續存放的方式。即,若文件數據所在的第一個磁盤塊為X,那用戶可以通過訪問磁盤塊X+1、X+2來訪問文件之后的數據。
將文件數據連續存放的好處是可以優化文件的順序讀寫性能。同時,這種方式可以減少文件的元數據,即每個文件只要通過文件數據起始塊號、文件數據占用塊數量兩個值,就可以確定文件數據所占用的所有磁盤塊的位置。
為了將STANAG-4575文件系統嵌入到VXWorks中,必須先了解VXWorks文件系統的框架。
VXWorks文件系統框架從上到下主要分為4層,分別為:
1) 虛擬文件系統層
2) 特定文件系統層
3) 磁盤緩存
4) 塊設備層
該文件系統的層次結構,如圖2所示:

圖2 VXWorks文件系統層次架構
從應用程序發來的請求,經過虛擬文件系統層的解析,會將請求進一步傳向下層的特定文件系統層。下層的文件系統處理完請求后,將結果返回給虛擬文件系統層,虛擬文件系統再將結果返回給應用程序。
特定的文件系統要對磁盤塊設備進行管理,它需要經常對磁盤進行讀寫操作。由于磁盤設備的讀寫速度和內存相比較低,若文件系統的每次讀寫操作都在磁盤上進行,則磁盤會成為整個系統的瓶頸。因此,需要在文件系統和下層磁盤之間插入一級磁盤緩存,該磁盤緩存是內存中的一塊區域,主要用來對磁盤的數據進行緩存。文件系統通常的讀寫操作都在磁盤緩存中進行。
磁盤緩存主要負責和下層真正的磁盤塊設備進行交互。它負責從磁盤設備中讀取數據,并將緩存中臟(DIRTY)的數據定期寫到磁盤上。同時,上層的文件系統也可以通過調用磁盤緩存提供的FLUSH函數將臟數據寫到磁盤上。
由于實現文件系統的主要工作是與上層的虛擬文件系統進行交互,因此需要對VXWorks虛擬文件系統層進行更進一步的分析。
VXWorks虛擬文件系統層的主要作用類似于Linux中的VFS,負責給上層應用提供統一的文件系統的接口。它將所有的對文件系統的操作都抽象為以下7個操作:
1) 創建文件(CREATE)
2) 刪除文件(DELETE)
3) 打開文件(OPEN)
4) 讀文件(READ)
5) 寫文件(WRITE)
6) 關閉文件(CLOSE)
7) 輸入輸出控制(IOCTL)
所有特定文件系統的擴展命令,都要通過調用IOCTL來實現。
虛擬文件系統為了能將上層發來的請求轉化為對下層文件系統的調用,就需要知道下層文件系統相關函數的具體實現。在VXWorks中,每個文件系統都必須有一個初始化函數,在該初始化函數中,需要將自己實現函數的指針注冊到虛擬文件系統中去。因此,要在VXWorks中嵌入自己的文件系統,實際上就是為該文件系統實現對應于 VXWorks虛擬文件系統的7個函數及相關輔助函數。
該部分詳細描述STANAG-4575文件系統在VXWorks上的實現。首先介紹磁盤格式,接下來詳細描述在內存中用到的數據結構以及數據結構的組織方式。
在文件系統磁盤結構的設計過程中,主要有兩個因素需要考慮:
1) 必須嚴格遵照 STANAG-4575文件系統對磁盤格式的規定;
2) 在因素 1的基礎上,要盡量采用一種磁盤結構,使得上層的文件系統可以可靠、穩定、高效地實現。
首先,STANAG-4575將磁盤塊0保留,因此,用該磁盤塊來作為文件系統的超級塊。超級塊用來存放該磁盤塊設備的總體信息,包括塊設備名稱、磁盤塊大小,磁盤塊數量等等。另外,在其中還存放了目錄區和數據區的相關信息。最后,在超級塊的末尾,存放了超級塊中所有字段的 MD5校驗和,用來在磁盤塊掛載的時候檢查對超級塊的完整性進行檢驗。
由于超級塊是文件系統中最重要的數據結構,因此除了對它做MD5校驗之外,還必須對其做冗余備份。將備份超級塊存放在最后一個磁盤塊上。這樣,即使主超級塊損壞,依然可以從最后一個磁盤塊上讀出文件系統的備份超級塊。
其次,STANAG-4575規定了磁盤塊1必須作為第一個目錄塊,且多個目錄塊之間用雙向鏈表連接。為了實現簡單高效,且保證文件系統的可靠性。將文件系統的所有目錄塊連續存放,即就是在整個磁盤塊的頭部連續地存放目錄塊信息,當然,目錄塊按照標準規定依然要采用鏈表來連接,只是此時可以順序地對目錄塊進行訪問。
采取這種做法的好處有:
1) 目錄塊連續存放,可以提高目錄區連續讀寫操作的性能,因為在文件系統掛載時,需要將所有目錄塊讀出,并在內存中建立必要的數據結構;
2) 即使目錄區鏈表出現錯誤,由于目錄在磁盤上位置固定,依然可以找到所有目錄塊;
這樣做法的問題是,文件系統的靈活性降低,即當文件數量很多,超過目錄區域的上限時,系統便不能再創建新的文件??梢酝ㄟ^擴大目錄區域的數量來解決該問題。在實際中,創建 100,000個文件所需要的目錄塊區域僅僅占用10MB的空間。
同時,為了進一步提高文件系統的可靠性,對文件系統的目錄區也進行了備份操作。即,在整個磁盤的末尾,存放了備份目錄區。這樣,當主目錄區訪問出錯時,可以直接訪問備份目錄區。
最后,磁盤的其他部分都為數據區域。數據區域通過3個指針來管理,分別是指向數據區開始位置的指針、指向數據區結束位置的指針和指向數據區當前使用位置的指針。這種管理方式簡單高效,避免了通常的采用位圖方式來管理磁盤塊的低效和不可靠。該方式管理磁盤塊的具體過程會在下文中描述,磁盤塊的結構,如圖3所示:

圖3 文件系統磁盤結構
在VXWorks文件系統框架中,每個已掛載的塊設備由塊設備描述符來管理。塊設備描述符的第一個字段為一個DEV_HDR類型的結構體,VXWorks的虛擬文件系統層通過該結構體來實現對所有已掛載的塊設備的組織和管理。塊設備描述符的其余字段由各個文件系統的實現來定義。
塊設備描述符中記錄了管理一個磁盤塊需要的數據結構或數據結構的指針。我們設計的塊設備描述符,主要包括以下數據結構:
1) 指向下層磁盤塊設備描述符的指針,對于文件系統來說,該指針通常指向下層磁盤緩存設備的描述符;
2) 塊設備的互斥訪問信號量,該信號量主要用來在掛載和卸載設備的時候對設備進行互斥訪問;
3) 打開文件的文件描述符數組和文件句柄數組,用來管理打開的文件;
4) 文件互斥訪問信號量數組;
5) 磁盤目錄區描述符,主要用來描述磁盤目錄區的使用情況;
6) 磁盤數據區描述符,主要用來描述磁盤數據區的使用情況;
7) 指向文件超級塊的指針,指向在掛載過程中讀入內存的文件的超級塊結構。
在接下來的幾小節,詳細描述上面涉及到的幾個數據結構,以及對它們進行的優化。
目錄區描述符主要用來管理磁盤塊設備上目錄區的分配。它主要包括3個指針,分別表示目錄區起始塊地址,目錄區終止塊地址,以及下一個空閑的目錄項編號(通過編號,可以快速計算出下一個文件項所在磁盤上的位置)。
由于在一個文件系統中不能有重名的文件,因此在創建新的文件時,必須確定新文件名不存在。如果每次在創建時,都需要將新文件名與已存在的文件名一一比較,這種線性的比較方式會隨著文件數量的增多而使新文件創建的所花費的時間越來越長。同樣,對于打開文件,刪除文件等操作,都需要我們能快速查找到文件。因此,要采用一種高效的方式在內存中建立文件的索引。
采用動態哈希表來存放所有的已創建的文件,并在哈希表項中建立了文件名到文件元數據所在磁盤位置的映射。之所以說“動態”,是因該哈希表的某個桶中的元素數量超過一定值時,哈希表會動態擴張,從而使所有的桶中的元素數量處于一個門限之下。這樣,查找任何一個文件的時間,都不會隨著文件數量的增多而增長,且接近于常數時間。
數據區描述符用來管理磁盤上的數據區域的分配,它主要包括3個指針。第一個指針(BEGIN)指向數據區起始塊,第二個指針(END)指向數據區終止塊,第三個指針(NEXT)指向下一個未被占用的磁盤塊。這樣,從BEGIN至NEXT-1的磁盤塊即為已用塊,而從NEXT至END的磁盤塊為空閑塊。
這種磁盤塊管理方式和文件系統采用的使用位圖來管理磁盤塊的方式有很大區別,主要有以下考慮:
1) 該文件系統主要的應用是針對機載記錄設備,而記錄文件通常不需要執行文件的刪除操作。實際上,在IRIG 106的標準中,并不支持刪除(DELETE)命令,因此,文件系統并不用處理在刪除文件時面臨的磁盤空間回收問題。
2) 由于STANAG-4575標準規定了文件的數據必須連續存放,因此,系統采用在創建文件時一次性為文件分配空間的方法。若采用動態分配方式,則無法很好處理多個文件同時打開的情況。
由于VXWorks系統標準的創建文件(creat)的接口并不支持為文件預分配空間的操作。提供了一個新的函數creat64,可以上層應用程序通過輸入參數指定為函數預留的空間大小。
同時,還為應用程序提供了其他輔助函數,如getnfree64函數,它用來返回某個文件剩余可用空間的字節數。上層可以通過調用該函數確定什么時候需要關閉文件并創建新文件來記錄數據。
文件描述符數組用來管理文件系統中打開的文件。當一個進程打開一個文件時,文件系統就會為該進程分配一個文件描述符。
文件描述符中主要存放了打開文件的打開模式(讀/寫/讀寫),文件讀寫位置偏移等信息。各個進程都通過文件描述符來對文件進行讀寫訪問。
當多個進程同時打開一個文件時,它們可能同時對文件進行修改,因此需要將文件的重要元數據,如文件大小,只在內存中存放一份,從而避免多個進程同時修改不同元數據造成的不一致。
通過文件句柄來存放這類文件元數據,當多個進程同時打開同一個文件時,系統會為每個進程創建一個文件描述符,而讓多個文件描述符共享同一個文件句柄。同時,為了保證互斥訪問,文件系統為該文件句柄提供了加鎖操作。即當某個進程需要對文件進行讀寫時,首先會對該文件句柄加鎖,再訪問,最后解鎖的操作,避免多個進程同時修改文件可能造成的混亂。
文件系統要解決斷電之后帶來的一致性的問題。之前,已經通過只在文件系統超級塊中存放靜態數據,保證每次元數據的更新只會修改一個數據塊,解決了文件系統元數據可能的不一致問題。
對于文件系統數據的不一致問題,通過保證文件系統的元數據在文件系統數據之后,寫入磁盤的方式來解決。具體做法是,對于一次文件的寫入操作,首先將數據寫入文件系統的磁盤緩存之中,之后,再更元數據。當要將元數據寫入緩存之前,首先,將該文件對應的所有數據都寫入磁盤。這樣,既可保證文件系統的數據在磁盤上是永遠一致的。
當然,這里面還有很多優化的問題。比如,應該將數據積累到一定量再做一次寫磁盤的操作,或者一定的時間進行一次寫磁盤的操作,從而保證系統的記錄性能。
將自己實現的STANAG-4575文件系統和VXWorks本地的dosFs文件系統進行了一系列測試,來對比它們之間的性能,測試環境,如表1所示:

表1 測試環境
記錄文件系統最常用的方式即為單線程寫單文件測試。測試讓一個線程以不同的塊大小來寫一個4G大文件,測試結果,如圖4所示:

圖4 單線程寫文件性能測試
從測試中可以看出,實現的STANAG-4575文件系統的寫入性能要高于VXWorks本地的dosFs文件系統。主要原因主要有:
1) STANAG-4575中文件數據連續存放,可以提供更快的寫入性能;
2) dosFs在寫操作時可能伴隨著文件空間的分配等操作,而這些操作會影響文件的寫入性能。而STANAG-4575文件數據塊一次分配,減少了之后動態分配帶來的性能下降。
在真實的環境中,記錄設備會采用多個線程,用來記錄從不同的通道傳來的數據,因此,需要對多線程寫文件的性能進行測試。測試采用10個線程,每個線程寫入4G的文件。測試結果,如圖5所示:

圖5 多線程寫文件性能測試
從測試中可以看出,實現的 STANAG-4575文件系統在多線程寫文件的情況下,性能也是要高于VXWorks本地文件系統的。該情況,原因與單線程寫文件時的情況類似,只是由于線程切換的開銷,導致兩種情況下文件系統的性能都要低于單線程寫文件的性能。
本文主要介紹了一種 IRIG 106下層文件系統STANAG-4575的實現方法。通過以下途徑實現:
1) 對文件系統的元數據進行校驗和備份的方式實現文件系統的可靠性;
2) 通過在內存中建立哈希表等方式實現文件系統的高性能;
3) 通過對標準定義的磁盤結構的靈活變通,進一步優化了文件系統的寫入性能。
4) 通過控制元數據和數據的寫入方式來保證數據在磁盤上的一致性。
在下一步的工作中,可能會重新設計并實現 VXWorks文件系統下層的磁盤緩存,以使它可以更加符合應用的需求。我們還會參考其他文件系統的做法,采用日志的方式來進一步提高文件系統的可靠性。
[1]Jeff Bonwick, Matt Ahrens, Val Henson, Mark Maybee,Mark Shellenbaum, [M]”The Zettabyte File System”.2002.
[2]Marshall Kirk McKusick, William N.Joy, Samuel J.Leffler, Robert S.Fabry, ” [M]A Fast File System for Unix”.
[3]T.J.Kowalski and Marshall K. McKusick. Fsck-the UNIX file system check program.Technical report, [C]Bell Laboratories, March 1978.
[4]Lihua Yu, Gang Chen, Wei Wang, Jinxiang Dong.MSFSS: A Storage System for Mass Small Files. in Proceedings of the 11th International Conference [C]on Computer Supported Cooperative Work in Design,2007.
[5]Larry W.McVoy and Steve R.Kleiman. Extent-like performance from a UNIX file system. [C]In Proceedings of the 1991 USENIX Winter Technical Conference,1991
[6]R.J.T.Morris, B.J.Truskowski.The evolution of storage. [J]IBM SYSTEMS JOURNAL,VOL42, NO2, 2003.
[7]MENDEL ROSENBLUM,JOHN K. OUSTERHOUTLFS.The Designand Implementation of a Log-Structured File System. [J]ACM Transactions on Computer Systems,Vol 10, No. 1, February 1992, Pages 26-52.
[8]Vilayannur,M. Kandemir,M; Sivasubramaniam, A Kernel-level caching for optimizing I/O by exploiting inter-applicationdata sharing. [M]Cluster Computeing,2002.
[9][C]VXWorks Programmer’s Guide 5.5
[10][C]Dominic Giampaolo “Practical File System Design with the Be File System”