◆孫濤
(北京無線電測量研究所 北京 100854)
現代作戰系統的控制終端一般采用基于通用操作系統開發顯控軟件的形式。Windows 由于開發資源豐富,在以前較長的時間內是主流選用的操作系統。Linux 作為Windows 的競爭者,由于其開源、自主可控等優勢,已成為現階段作戰系統控制終端指定選用的操作系統。但Linux 作為通用桌面系統而非嵌入式領域專用的操作系統,因此易感染病毒、不能抵抗異常斷電的沖擊。作戰系統終端往往還有直接斷電關機和隨時可進行硬復位操作的需求,就更無法滿足。
此外,作戰系統終端軟件往往需要存儲武器系統很多配置參數,而文件的寫入操作如果不進行專門設計,也存在較大風險。這是在常用操作系統Windows、Linux、VxWorks 下都存在的問題。
上述兩類問題涉及了系統級安全性和數據級安全性兩大范疇,無論系統崩潰或配置文件損壞,都是作戰控制系統所不能允許的。通過研究可知,系統級安全性問題主要是因為系統區龐大并長期處于可寫狀態,易因異常掉電導致配置單元處于不一致狀態,重啟時發現其中具有無法解釋的數據,從而啟動失敗[1],或出現因網絡病毒導致系統文件被感染的情況;而數據級安全性不強的主要原因則是文件系統以異步方式工作[2],這種非立即寫入的方式可引起文件損壞或數據丟失。
與Windows 相比,Linux 提供了內核支持壓縮文件系統映像、內存盤(即RamDisk)和初始化內存盤(即ⅠnitRD)這三項專有的技術。本方案通過結合使用這三項技術,可使Linux 的啟動基于初始化內存盤,并可將一塊內存用作根文件系統,即:將Linux 完全放到內存里然后再運行,運行時無須訪問硬盤。它的主要思想是構建一個虛擬操作平臺,所有針對磁盤的操作都只針對內存盤。本方案可以很好地預防Linux 系統文件被損壞或病毒感染的問題。
RamDisk的概念是將一部分系統內存模擬為硬盤來使用,在其上像使用硬盤一樣來存放文件,其設計初衷是因為訪問內存的速度要遠快于硬盤,從而能夠以此來提升性能;為了保護系統,采用將Linux的根文件系統在RamDisk中進行建立的方法[3],把生成文件系統所需的文件、庫文件、shell及基本命令和內核等使用頻繁且必需的系統文件制作生成為壓縮的文件系統,并制作成鏡像。以后每當開機啟動時,鏡像均解壓縮到RamDisk,形成Linux操作系統的根文件系統。
為使RamDisk功能可用,需要通過make menuconfig命令,進入到配置Linux內核的狀態。檢查Block Device中的RamDisk選項和General Setup中的ⅠnitRD支持選項,如果沒有選中,需要選中后重新編譯生成內核。
應按照具體應用的需要,建立功能最小化的文件系統。例如要實現的功能是雷達終端軟件,就只需保留使Linux啟動和后期維護所需的庫文件、配置文件、腳本和基本命令,以及運行終端軟件本身所需的文件即可。
創建一個名為/radarLinux的目錄,在其下建立文件系統。在bin下存放原系統同一目錄下的維護用工具;在sbin下存放原系統同目錄下的常用命令;在usr/bin下存放其他工具和終端軟件的可執行程序。lib目錄下的內容則由可執行程序所需的動態鏈接庫確定。凡所需的原etc目錄下存放的配置文件及dev目錄下存放的設備文件都應保留[4]。然后,即可向RamDisk中拷入文件系統, 再將RamDisk生成為映像,
并生成壓縮的文件系統映像ram.img.gz。
建立文件系統映像的過程可以總結為:
(1)建立文件目錄并將考入所需要的文件;
(2)將大小適宜的EXT 相關類型文件系統建立于RamDisk;
(3)向本地硬盤掛載已完成格式化的RamDisk;
(4)將已建立的文件目錄拷貝至RamDisk;
(5)將RamDisk 從本地硬盤卸載;
(6)將RamDisk 中的文件寫成映像文件;
(7)生成壓縮的映像文件。
接下來仿照建立文件系統映像,建立一個與應用無關的,放置系統啟動文件和用于引導RamDisk可執行腳本文件的目錄,生成壓縮的ⅠnitRD映像initrd.img.gz。
最后,將兩個映像文件拷入Linux所在盤以外的盤,修改
GRUB(GRand Unified Bootloader) 的配置文件grub.conf,通過GRUB把系統啟動信息寫入該盤主引導區MBR,重啟時即實現了ⅠnitRD方式的系統加載。
對于需要用戶動態寫入的數據文件,一方面由于存放在非保護分區,另一方面由于操作系統的異步寫入策略和對FLASH 介質的磨損均衡策略,所以正常或非正常的斷電及復位都有可能使其損壞。這些文件往往非常重要并且數據項目繁多,例如作戰系統配置參數表。如果損壞將極大影響作戰任務,必須采取有效的預防措施,使損壞不發生或影響降到最低。有人在實踐中總結出關機前一次寫入法,為需要寫入的文件設置專用分區,僅在關機前加載該分區,寫操作限制在收到關機指令的時候[5]。這種方法雖然可大大減少故障點,但不允許直接斷電關機和隨時硬復位,而本文方案則能夠滿足,簡述如下。
現代操作系統對磁盤寫入均提供了內存緩沖機制,分為直寫和回寫兩種方式。直寫是操作系統確保數據寫到磁盤中才返回;回寫是數據寫到內存磁盤緩沖中即返回,由操作系統決定在合適的時間寫到磁盤上,方式為系統的一個守護進程定時清空塊緩沖并寫入磁盤。操作系統為不同類型、不同屬性的存儲介質分配了不同的寫入周期,一般為幾秒至幾十秒,如VxWorks5.5 默認最長為15 秒,并可進行修改。
雖然回寫是操作系統對文件寫入操作的默認策略,但在各平臺下均能夠找到磁盤直寫的方法,對于任務相對單一的雷達應用,直寫使操作系統損失的效率可忽略不計,卻對文件安全性帶來了極大好處。除適用于雷達配置參數文件外,直寫還很適用于寫日志類文件,日志類文件寫操作較為頻繁,文件需要一直處于打開狀態,斷電或復位會使日志丟失。采用直寫方法后,文件一直處于打開狀態也能使日志全部保存。
不同平臺直寫的APⅠ有所不同。對于Linux 平臺,實現代碼為:

其中,O_SYNC 選項使數據部分實時寫入,fsync 函數(需要包含fcntl.h)使文件的屬性也同步更新。使用Qt 自帶類實現時,可使用system(sync)取代fsync(fd),即相當于在Shell 下執行Linux專用系統命令sync 來清空內存緩沖。
其他平臺下也具有類似的實現接口,如Windows 下使用CreateFile 時注意使用FⅠLE_FLAG_WRⅠTE_THROUGH 選項(使數據部分實時寫入),然后再使用FlushFileBuffers()函數(使文件的屬性也同步更新);而VxWorks 下只需在write 操作后增加ioctl(fd,FⅠOFLUSH,0)即可。
將初始的雷達配置參數文件設置為雙份(文件a 和文件b),放置于不同分區,以后有數據更新需求時,交替寫入其中一個文件,除了寫入數據外,還在文件頭中寫入更新序號,以使下次訪問時能夠確定最新文件。由于每次只同時對其中一個文件進行寫入,且寫入完成前不接受下一次寫入,所以確保了每次寫入至少有一個文件是安全的。寫入操作流程如圖1 所示。
文件中的參數只在終端軟件啟動后讀取一次,讀取時做異常處理,首先通過比較文件頭,讀取最新文件中的參數,如果訪問參數表發現異常(如:參數有殘缺或超值域),說明文件被損壞,此時加載另一個文件,并在界面中給出“已恢復最近一次正確配置”提示。此外,應在只讀分區內放置文件的初始副本,如果文件a、b 被其他原因破壞,將加載初始副本,并給出“已恢復出廠參數”提示。選取文件及讀取操作的流程如圖2 所示。
通過綜合使用上述兩類措施,在系統文件受到保護的基礎上,使軟件動態存儲的數據文件也得到了有效保護。

圖1 文件寫入操作流程
通過對系統級安全性范疇和數據級安全性范疇的改進設計,真正提升了作戰控制終端軟件系統的安全性,并且滿足了隨時可進行系統硬復位及直接斷電關機的嚴苛需求。某系列作戰系統控制終端研制初期未采用本文系統級和數據級安全性提升方案時,經常出現病毒感染、系統崩潰和參數文件損壞情況,采取本文設計方案后,經過了大量的試驗和軍方用戶的驗證,沒有再出現過同類問題。本文方案對于作戰系統控制終端及其他類型的控制終端均具有廣泛的實用價值。

圖2 選取文件及讀取操作流程