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