魯 振,胡堅升,李名揚
(中軟信息系統(tǒng)工程有限公司,北京 102209)
近年來,以自主CPU+OS為核心的國產(chǎn)基礎(chǔ)軟硬件生態(tài)體系不斷發(fā)展和完善,但仍存在一些短板和弱項,比如基礎(chǔ)軟件方面,操作系統(tǒng)多是基于開源的Linux系統(tǒng),經(jīng)常會導(dǎo)致軟件開發(fā)與運行存在運行依賴庫不規(guī)范、應(yīng)用軟件版本混亂、沖突等問題。基于系統(tǒng)開發(fā)和運行的實踐,當前國產(chǎn)基礎(chǔ)軟件生態(tài)體系主要存在以下四個方面的問題。
(1)開發(fā)嚴重碎片化。Linux上存在太多的開發(fā)庫,國產(chǎn)操作系統(tǒng)缺少一套類似微軟.NET框架的統(tǒng)一開發(fā)解決方案,開發(fā)者難以選擇最佳的開發(fā)語言、開發(fā)庫和開發(fā)環(huán)境,比如對C/C++而言,主流的用戶 界 面 (UI)程 序 開 發(fā) 有 Gtk、Qt、WxWidget 三 種 ,同時 Gtk本身又有 Gtk2和 Gtk3系列[1],Qt有 Qt4和 Qt5區(qū)分。Linux應(yīng)用軟件開發(fā)者需要一套開發(fā)和運行的行業(yè)標準,解決開發(fā)框架選擇難、開發(fā)文檔少或無、開發(fā)庫版本多、開發(fā)接口不統(tǒng)一等問題。
(2)權(quán)限控制機制存在安全隱患。主流的國產(chǎn)操作系統(tǒng)使用基于用戶角色的權(quán)限控制機制,應(yīng)用一般具備諸如訪問用戶文件[2]、訪問其他應(yīng)用數(shù)據(jù)[3]、使用網(wǎng)絡(luò)和外部設(shè)備[4]等權(quán)限。雖然大多數(shù)的 Linux發(fā) 行 版(典 型 的 如 Debian、Ubuntu、Redhat、Centos)都提供自身的軟件包維護機制,用戶往往也使用值得信賴的源下載應(yīng)用,但病毒往往也會利用應(yīng)用程序這條路徑植入傳播。用戶對一些程序的非法操作往往會導(dǎo)致嚴重的安全問題,給自身帶來極大的困擾。例如用戶使用的應(yīng)用程序需要訪問網(wǎng)絡(luò)時,有可能會從不安全的站點下載惡意程序,執(zhí)行一些非法操作,如盜取用戶的敏感信息,干擾用戶的日常工作、數(shù)據(jù)安全和個人隱私等,用戶需要一種有效的保護計算機安全的方法,比如利用沙箱技術(shù)給應(yīng)用程序提供隔離的運行空間。
(3)跨架構(gòu)應(yīng)用移植不統(tǒng)一。應(yīng)用軟件可移植性越來越受到關(guān)注,諸如Java、Python等語言都提供一套虛擬機用于屏蔽底層處理器和操作系統(tǒng)差異[5],但是對于C/C++等平臺相關(guān)編程語言,目前缺少一種跨架構(gòu)的可移植開發(fā)運行解決方案[6]。
(4)應(yīng)用軟件版本混亂。主流的國產(chǎn)操作系統(tǒng)發(fā)行版都使用類似RPM、DPKG等打包系統(tǒng)構(gòu)建,最大的特點是上游開發(fā)者和下游軟件包維護者(打包者)明顯地區(qū)分開。上游應(yīng)用開發(fā)者編寫代碼,下游發(fā)行者獲取并將其轉(zhuǎn)化(編譯、編寫規(guī)則并重新打包)為 RPM或DEB包;最后安裝到本地系統(tǒng)中。這種場景在一定程度上解決了包的風(fēng)險問題,因為軟件包維護者往往會選擇值得信賴和功能可靠的應(yīng)用,但是也難以避免地暴露一些問題,上游應(yīng)用開發(fā)者往往希望更高的發(fā)布速度,而事實上完全依賴下游發(fā)行者打包開發(fā)的應(yīng)用,下游發(fā)行者決定具體的調(diào)度、申明、打包、提供支持等規(guī)則。應(yīng)用本身的實際測試變得十分困難,因為最終用戶往往可能使用不同的包版本,應(yīng)用在某個發(fā)行版的某個版本下的測試,無法確定應(yīng)用在其他發(fā)行版和其他版本的任意組合下都能正常運行;要測試應(yīng)用在某個發(fā)行版的某個版本下的運行,開發(fā)者往往需要安裝該發(fā)行版的版本環(huán)境,并編譯運行該應(yīng)用,這將是一項繁雜的工作。
針對國產(chǎn)基礎(chǔ)軟硬件生態(tài)環(huán)境下應(yīng)用軟件開發(fā)與運行存在的問題,設(shè)計多架構(gòu)應(yīng)用軟件開發(fā)及運行庫服務(wù)系統(tǒng),目標主要有以下三點:
(1)提供跨平臺多架構(gòu)的統(tǒng)一運行庫,屏蔽底層軟硬件差異,使應(yīng)用更易于分發(fā)到不同的平臺架構(gòu),該運行庫覆蓋最基本的C/C++標準庫、Python虛擬機、Java虛擬機等應(yīng)用基本運行環(huán)境。
(2)提供統(tǒng)一和容易使用的開發(fā)接口,解決Linux上開發(fā)庫的碎片化問題。
(3)提供應(yīng)用運行沙箱,沙箱提供了文件系統(tǒng)隔離、系統(tǒng)資源隔離、物理資源隔離、權(quán)能限制和強制訪問控制等策略,盡可能地防止上層應(yīng)用直接訪問底層主機,減少應(yīng)用程序?qū)χ鳈C造成的影響,為用戶提供一個獨立和安全的運行環(huán)境。
根據(jù)以上目標,應(yīng)用軟件開發(fā)及運行庫服務(wù)整體框架如圖1所示。
圖1 多架構(gòu)應(yīng)用軟件開發(fā)及運行庫服務(wù)系統(tǒng)整體設(shè)計
多架構(gòu)應(yīng)用軟件開發(fā)及運行庫服務(wù)系統(tǒng)(CCF)自底向上分為操作系統(tǒng)態(tài)、運行態(tài)(CRE)、開發(fā)態(tài)(CDK)、應(yīng)用態(tài)和分發(fā)態(tài)。其中,操作系統(tǒng)層包括當前所有主流的Linux發(fā)行版和底層處理器架構(gòu),多架構(gòu)應(yīng)用軟件開發(fā)及運行庫服務(wù)系統(tǒng)可支持所有主流Linux發(fā)行版和絕大部分處理器架構(gòu)。CCF可屏蔽操作系統(tǒng)和處理器架構(gòu)差異,基于CCF開發(fā)和運行的應(yīng)用軟件僅依賴于相應(yīng)類型的CCF,與操作系統(tǒng)差異無關(guān)。使用操作系統(tǒng)類庫,并直接運行于主機系統(tǒng)的應(yīng)用軟件屬于非托管應(yīng)用,這些應(yīng)用一般與平臺類型相關(guān)。運行層包括沙箱、核心基礎(chǔ)庫(如libc、glib、xlib等庫)、編程語言通用庫(分為用戶界面、多媒體、進程通信、數(shù)據(jù)庫操作等20多種類型)、編程語言執(zhí)行引擎(如 C++標準庫 libstdc++、Java虛擬機、Python虛擬機、PHP執(zhí)行引擎、JavaScript解析引擎等)。開發(fā)層實際上是運行態(tài)加上開發(fā)應(yīng)用必須的頭文件、編譯器、jar包、python模塊等文件組成的。使用CCF開發(fā)并依賴CCF運行的應(yīng)用是“托管”應(yīng)用,并以“CPK”的方式分發(fā)。
圖2 多架構(gòu)應(yīng)用軟件運行時框架
2.1.1 多架構(gòu)應(yīng)用軟件開發(fā)及運行核心框架運行時(CRE)
多架構(gòu)應(yīng)用軟件運行時提供了基于良好定義且高度優(yōu)化的環(huán)境,以支撐應(yīng)用軟件的運行。這里指的運行時實際上是一系列不同架構(gòu)、不同版本的運行時。運行時包括 C/C++、Python、Java等高級語言基本運行環(huán)境,具體表現(xiàn)為可執(zhí)行文件、動態(tài)鏈接庫、資源文件、配置文件、腳本等。運行時本身又分為基本運行時和開發(fā)運行時,前者是支撐一個應(yīng)用運行的最小環(huán)境,后者則在包含前者的基礎(chǔ)上,添加編譯和調(diào)試應(yīng)用所需的基本環(huán)境。運行時的整體設(shè)計如圖2所示。
2.1.2 多架構(gòu)應(yīng)用軟件開發(fā)及運行核心框架開發(fā)工具(CDK)
多架構(gòu)應(yīng)用軟件開發(fā)工具由開發(fā)運行時、工具鏈、基礎(chǔ)類庫、公共接口、應(yīng)用框架組成,支持 C/C++、Java、PHP、Python等多種編程語言,提供統(tǒng)一的公共編程接口和通用基礎(chǔ)類庫。利用工具鏈編譯、虛擬機運行等方式實現(xiàn)應(yīng)用程序在沙箱中的最終運行。圖3展示了開發(fā)框架的各個層次。
2.1.3 多架構(gòu)應(yīng)用軟件運行沙箱(CCF Sandbox)
多架構(gòu)應(yīng)用軟件運行沙箱是一套整合了內(nèi)核cgroups、namespaces、selinux、kdbus、systemd 和 wayland顯示服務(wù)器的應(yīng)用運行沙箱機制?;镜脑瓌t是,應(yīng)用以普通用戶身份執(zhí)行,只具備最低的訪問權(quán)限。更多的權(quán)限需要通過權(quán)限定義和提權(quán)。與一般的沙箱不同,多架構(gòu)應(yīng)用軟件運行沙箱采用的是“資源是否可見”原則,而非“資源訪問控制”。與限制應(yīng)用訪問操作系統(tǒng)資源權(quán)限不同,這里的沙箱默認應(yīng)用軟件對操作系統(tǒng)資源不可見。當沙箱初始化完成后,首先建立文件系統(tǒng),同時,某些白名單內(nèi)的文件和路徑(一般是最基本的資源)隨之被掛載到命名空間(namespace),只有那些經(jīng)過篩選、審查且被認為運行足夠穩(wěn)定的文件或目錄才會被沙箱中的應(yīng)用軟件訪問。圖4展示了沙箱和應(yīng)用之間的關(guān)聯(lián)。
2.2.1 多架構(gòu)應(yīng)用軟件開發(fā)流程
圖4 安全沙箱設(shè)計框架
多架構(gòu)應(yīng)用軟件開發(fā)及運行庫服務(wù)系統(tǒng)主要由托管式應(yīng)用的開發(fā)和運行兩個過程組成。 多架構(gòu)應(yīng)用軟件開發(fā)流程如圖5所示。
圖5 多架構(gòu)應(yīng)用軟件開發(fā)流程圖
2.2.2 多架構(gòu)應(yīng)用軟件運行流程
多架構(gòu)應(yīng)用軟件運行流程如圖6所示。
2.2.3 系統(tǒng)實現(xiàn)及驗證
本文以FT1500A(ARM64)、x86兩類CPU架構(gòu)下的gedit應(yīng)用軟件為例,驗證多架構(gòu)應(yīng)用軟件開發(fā)及運行方法從開發(fā)到運行的實現(xiàn)流程。
在構(gòu)建一個gedit之前,先安裝應(yīng)用軟件對應(yīng)的運行時(CRE)、開發(fā)包(CDK)和沙箱工具。
首先創(chuàng)建目錄并初始化目錄,選擇對應(yīng)的運行時和開發(fā)包:
$mkdir my-app
$ccf build-init./my-app gedit ccf/x86/1.0 ccf/x86/1.0
得到一個“metadata”文件(該文件用于定義一些環(huán)境配置和權(quán)限申明)和空的“my-app/files/”和“myapp/exports/”目錄。 然后使用“prefix=/app”構(gòu)建應(yīng)用軟件:
$ccf build./my-app./configure--prefix=/app
$ccf build./my-app make&&make install
“ccf”將會選擇對應(yīng)開發(fā)包構(gòu)建應(yīng)用程序,構(gòu)建完成的應(yīng)用將安裝到“my-app/files”目錄。
接著需要導(dǎo)出一些資源文件(如desktop文件和圖標文件)并打包應(yīng)用軟件:
圖6 多架構(gòu)應(yīng)用軟件運行流程圖
$ccf build-finish./my-app
最后將打包生成的應(yīng)用轉(zhuǎn)化為deb、rpm或者cpk格式。并分發(fā)到對應(yīng)架構(gòu)的Linux平臺。該平臺在安裝對應(yīng)版本(或較高版本)的基礎(chǔ)上運行該應(yīng)用:
$ccf run gedit
本文對國產(chǎn)CPU+OS基礎(chǔ)環(huán)境應(yīng)用軟件及運行依賴庫進行了研究,提出了一種多架構(gòu)應(yīng)用軟件開發(fā)及運行方法,設(shè)計了由多架構(gòu)應(yīng)用軟件開發(fā)及運行核心框架運行時(CRE)、多架構(gòu)應(yīng)用軟件開發(fā)及運行核心框架開發(fā)工具(CDK)、多架構(gòu)應(yīng)用軟件運行沙箱(CCF Sandbox)組成的多架構(gòu)應(yīng)用軟件開發(fā)及運行庫服務(wù)系統(tǒng)(CCF),探索了多架構(gòu)應(yīng)用軟件開發(fā)和運行流程,提供覆蓋支持多種高級語言開發(fā)、統(tǒng)一開發(fā)類庫及 API、托管應(yīng)用運行、多架構(gòu)可移植方案、沙箱安全機制等多個方面的服務(wù)。經(jīng)過在 FT1500A、X86(CPU)+麒 麟(OS)兩類架 構(gòu) 環(huán) 境 上驗證,該方法能夠為國產(chǎn)基礎(chǔ)軟硬件生態(tài)體系提供良好的多架構(gòu)應(yīng)用軟件開發(fā)及運行服務(wù),為國產(chǎn)基礎(chǔ)軟硬件生態(tài)的軟硬件適配、整體解決方案提供技術(shù)支撐,可以作為國產(chǎn)基礎(chǔ)軟硬件生態(tài)體系應(yīng)用軟件開發(fā)及運行的標準。