孫微微,劉漢興,王金鳳
(華南農(nóng)業(yè)大學(xué)數(shù)學(xué)與信息學(xué)院,廣州510642)
長(zhǎng)期以來,我國(guó)計(jì)算機(jī)處理器芯片和操作系統(tǒng)嚴(yán)重依賴于國(guó)外,為防止技術(shù)升級(jí)和國(guó)家安全受制于人,硬件和軟件的自主可控研發(fā)和創(chuàng)新日益重要[1]。華為作為我國(guó)的科技先行者和踐行者,自主研制了鯤鵬處理器芯片和歐拉操作系統(tǒng),為突破國(guó)外的技術(shù)壟斷和扼制提供了核心硬件和軟件工具。
操作系統(tǒng)實(shí)驗(yàn)是操作系統(tǒng)課程的重要實(shí)踐環(huán)節(jié),對(duì)提升學(xué)生動(dòng)手實(shí)踐能力和加深理論知識(shí)理解有重要作用。然而傳統(tǒng)的操作系統(tǒng)實(shí)驗(yàn)?zāi)J狡诶碚撝R(shí)和原理的復(fù)現(xiàn),實(shí)用價(jià)值欠缺。有必要設(shè)計(jì)基于鯤鵬平臺(tái)的新型操作系統(tǒng)實(shí)驗(yàn)項(xiàng)目,使學(xué)生提高實(shí)踐能力并及時(shí)跟蹤新技術(shù)的發(fā)展。
鯤鵬計(jì)算生態(tài)是指基于鯤鵬處理器構(gòu)建的全棧IT基礎(chǔ)設(shè)施、行業(yè)應(yīng)用及服務(wù),包括個(gè)人計(jì)算機(jī)、服務(wù)器、企業(yè)存儲(chǔ)、操作系統(tǒng)、中間件、虛擬化、數(shù)據(jù)庫(kù)及云服務(wù)等,其目標(biāo)是建立完善的開發(fā)者和產(chǎn)業(yè)人才體系,使鯤鵬生態(tài)成為開發(fā)者和用戶的首選,實(shí)現(xiàn)IT技術(shù)自主安全可控[2]。
在硬件方面,不同于復(fù)雜指令集CISC的x86系列CPU,華為公司2019年推出的鯤鵬(Kunpeng)920處理器采用精簡(jiǎn)指令集RISC的ARM架構(gòu),并基于鯤鵬處理器構(gòu)建全自研的泰山(Taishan)服務(wù)器。
在軟件方面,華為推出Linux兼容的歐拉(openEuler)操作系統(tǒng),并將云服務(wù)全面鯤鵬化,支持事務(wù)處理、大數(shù)據(jù)分析、科學(xué)計(jì)算、數(shù)據(jù)庫(kù)、分布式存儲(chǔ)及移動(dòng)終端ARM應(yīng)用等多種場(chǎng)景。
在企業(yè)和開發(fā)者支持方面,通過鯤鵬彈性云服務(wù)器提供超高性價(jià)比和穩(wěn)定可靠的計(jì)算和存儲(chǔ)資源,通過從x86平臺(tái)到鯤鵬ARM平臺(tái)的多種應(yīng)用移植、性能優(yōu)化以及應(yīng)用部署軟件工具方便企業(yè)數(shù)字化轉(zhuǎn)型,通過云容器引擎提供多平臺(tái)自適應(yīng)混合部署以及快速地將原有的x86應(yīng)用遷移到鯤鵬平臺(tái)。
操作系統(tǒng)課程教學(xué)在計(jì)算機(jī)學(xué)科中一直占據(jù)非常重要的基礎(chǔ)位置,雖然操作系統(tǒng)課程主要是理論課,但實(shí)驗(yàn)部分也是不可或缺的。然而傳統(tǒng)的操作系統(tǒng)課程實(shí)驗(yàn)主要有以下兩種模式[3]:
(1)編程對(duì)操作系統(tǒng)的重要原理算法進(jìn)行模擬實(shí)現(xiàn),例如實(shí)現(xiàn)CPU調(diào)度算法、內(nèi)存分區(qū)分配算法、虛擬內(nèi)存置換算法等。學(xué)生對(duì)此感覺是“一個(gè)數(shù)據(jù)結(jié)構(gòu)大作業(yè)”,除了練習(xí)了編程水平和深入了解了各算法細(xì)節(jié),對(duì)實(shí)踐能力培養(yǎng)并無多少幫助。
(2)實(shí)現(xiàn)一個(gè)迷你操作系統(tǒng)。不同水平的大學(xué)實(shí)現(xiàn)的層次不一樣,有些學(xué)校從啟動(dòng)的匯編代碼開始實(shí)現(xiàn),逐步(甚至逐屆學(xué)生接力)添加進(jìn)程管理、內(nèi)存管理、文件管理和設(shè)備管理等模塊;有些學(xué)校對(duì)一個(gè)已有的教學(xué)操作系統(tǒng)改編,例如添加系統(tǒng)調(diào)用、修改算法等。這種模式可以讓學(xué)生熟悉操作系統(tǒng)底層的內(nèi)核細(xì)節(jié),但實(shí)際是讓學(xué)生重復(fù)學(xué)習(xí)“造輪子”。
誠(chéng)然,操作系統(tǒng)的源碼和內(nèi)核開發(fā)是需要研究型人才甚至天才的,然而有必要讓所有學(xué)生都從零開始去學(xué)習(xí)打磨輪子和制造發(fā)動(dòng)機(jī)嗎?既然已經(jīng)有了鯤鵬這樣的完善且先進(jìn)的平臺(tái),為什么不引導(dǎo)部分應(yīng)用型的學(xué)生學(xué)習(xí)怎么直接利用鯤鵬和相關(guān)工具去解決未來工作中的潛在實(shí)際問題呢?所以,重新設(shè)計(jì)鯤鵬平臺(tái)下的新型操作系統(tǒng)實(shí)驗(yàn)項(xiàng)目是有實(shí)際意義的。
在進(jìn)行鯤鵬平臺(tái)下的操作系統(tǒng)實(shí)驗(yàn)項(xiàng)目之前,學(xué)生要熟悉支持鯤鵬和泰山服務(wù)器的JDK、編譯器gcc、虛擬機(jī)和docker、華為彈性云服務(wù)器等,特別是Linux、CentOS或歐拉操作系統(tǒng)的vi編輯器和shell命令操作[2]。
x86處理器是復(fù)雜指令集結(jié)構(gòu),鯤鵬處理器是精簡(jiǎn)指令集結(jié)構(gòu),二者的機(jī)器指令差異很大,由于x86處理器長(zhǎng)期的主流地位,絕大多數(shù)的企業(yè)應(yīng)用軟件是基于x86平臺(tái)開發(fā)的,不能直接移植到鯤鵬平臺(tái)運(yùn)行,因此進(jìn)行應(yīng)用移植是首先要解決的問題。
解釋型語言(如Java、Python等)的源代碼由編譯器生成字節(jié)碼,再由虛擬機(jī)解釋執(zhí)行,虛擬機(jī)屏蔽了不同CPU指令集的差異,所以解釋型語言開發(fā)的程序在遷移到鯤鵬處理器時(shí),一般不需要特殊處理。但編譯型語言(如C、C++等)開發(fā)的程序在從x86平臺(tái)遷移到鯤鵬平臺(tái)時(shí),必須重新編譯才能運(yùn)行。
以CentOS操作系統(tǒng)和C/C++源碼為例,應(yīng)用移植的實(shí)驗(yàn)項(xiàng)目主要有以下步驟:
(1)從鯤鵬社區(qū)中獲取代碼遷移工具Porting Advisor,并安裝到服務(wù)器的/opt/portadv目錄;
(2)用遠(yuǎn)程傳輸工具WinSCP把源碼文件(如C/C++源代碼文件、匯編源代碼文件、Makefile文件)傳輸?shù)?opt/portadv/portadmin目錄,設(shè)置源碼分析相關(guān)參數(shù)。Porting Advisor根據(jù)依賴庫(kù)白名單、匯編代碼字典、編譯器字典等開始源碼分析;
(3)源碼分析完畢后,Porting Advisor生成移植建議報(bào)告。例如原始Makefile文件中存在編譯選項(xiàng)-m32,工具建議移植到鯤鵬平臺(tái)時(shí)刪除該選項(xiàng);x86的內(nèi)存操作匯編指令mov需要替換成ldr x0,[x1]&str x0,[x2]指令等。
(4)根據(jù)移植建議,安裝或編譯依賴庫(kù)SO文件,修改源代碼。重新上傳修改后的源代碼,再次進(jìn)行移植分析和測(cè)試驗(yàn)證。
虛擬機(jī)技術(shù)已經(jīng)廣泛應(yīng)用,通過VMware等虛擬機(jī)軟件,在宿主機(jī)操作系統(tǒng)(例如Windows)上安裝若干個(gè)相互隔離的GuestOS(例如Redhat、CentOS等),然后在各GuestOS中可以運(yùn)行相互隔離的多個(gè)應(yīng)用程序。可見,虛擬機(jī)會(huì)消耗很大的磁盤、CPU和內(nèi)存資源。
容器是一種輕量級(jí)自包含的軟件打包技術(shù)。容器引擎與宿主機(jī)操作系統(tǒng)通信,管理多個(gè)相互隔離的docker容器實(shí)例。類似于面向?qū)ο蟮念惡蛯?duì)象的關(guān)系,首先要生成一個(gè)將應(yīng)用程序的源代碼和依賴庫(kù)都打包在內(nèi)的docker鏡像,然后通過docker鏡像來創(chuàng)建docker容器,最后在docker容器中啟動(dòng)一個(gè)應(yīng)用程序?qū)嵗2煌膽?yīng)用程序需要生成不同的docker鏡像,運(yùn)行在不同的docker容器。與應(yīng)用程序類似,跨平臺(tái)的容器是互不適用的,例如x86平臺(tái)的docker鏡像直接應(yīng)用于ARM平臺(tái)會(huì)出現(xiàn)格式錯(cuò)誤。
(1)docker啟動(dòng)及相關(guān)命令:
①執(zhí)行yum-y install docker命令安裝docker;
②執(zhí)行systemctl start docker命令啟動(dòng)docker服務(wù);
③熟悉使用如下命令:
●docker search查找Docker Hub上的鏡像;
●docker pull拉取鏡像;
●docker images查看鏡像;
●docker run啟動(dòng)一個(gè)容器并在容器內(nèi)執(zhí)行用戶命令;
愛羅漠有多苦,她比誰都更清楚。她是不能和楚西爭(zhēng)的,連對(duì)手都沒有,這場(chǎng)仗注定打得艱難??蛇@沒有關(guān)系。她可以沒有愛情,但是當(dāng)愛情降臨的時(shí)候,她必須對(duì)它忠誠(chéng)。
●docker ps查看運(yùn)行中和未運(yùn)行的容器;
●docker commit創(chuàng)建一個(gè)新鏡像。
(2)根據(jù)docker ID創(chuàng)建一個(gè)新鏡像,作為目標(biāo)應(yīng)用(如Redis)的基礎(chǔ)鏡像;
(3)創(chuàng)建dockerfile文件,指明源鏡像ID、Redis的來源地址、容器運(yùn)行時(shí)要監(jiān)聽的端口、掛載點(diǎn)、容器啟動(dòng)時(shí)的服務(wù)等配置參數(shù)。執(zhí)行docker built命令,根據(jù)dockerfile創(chuàng)建Redis的應(yīng)用鏡像;
(4)根據(jù)Redis的應(yīng)用鏡像,啟動(dòng)一個(gè)容器,連接到Redis服務(wù)端,之后即可使用Redis服務(wù)。
可以在鯤鵬云服務(wù)器或者泰山物理服務(wù)器上搭建鯤鵬開發(fā)環(huán)境,通過打包編譯源碼或者制作主機(jī)鏡像方式實(shí)現(xiàn)應(yīng)用的快速部署。
在采用打包并編譯源碼成為RPM文件的方式時(shí),首先需要安裝Linaro交叉編譯工具。之所以需要交叉編譯,是因?yàn)樵S多基于ARM平臺(tái)的嵌入式硬件的性能不高或沒有足夠的內(nèi)存/磁盤空間[4],而整個(gè)編譯過程非常消耗資源,所以需要在x86平臺(tái)上編寫程序并交叉編譯成可以在ARM平臺(tái)上運(yùn)行的程序,所生成的RPM包可以直接安裝到ARM平臺(tái)。
以將Redis源碼包制作成RPM包為例,實(shí)驗(yàn)項(xiàng)目主要有以下步驟:
(1)安裝rpm-build工具,用wget工具下載Redis的開源源碼,準(zhǔn)備編譯前環(huán)境;
(2)編輯SPEC配置文件,設(shè)置軟件發(fā)行版本、解壓源碼、編譯和安裝軟件包時(shí)要執(zhí)行的命令等信息;
(3)執(zhí)行rpmbuild命令構(gòu)建二進(jìn)制的RPM包;
(4)執(zhí)行rpm命令安裝Redis的客戶端版本。
鯤鵬作為我國(guó)自主研制的處理器芯片,在實(shí)現(xiàn)硬件自主安全可控中具有重要作用。基于鯤鵬平臺(tái)設(shè)計(jì)新型操作系統(tǒng)實(shí)驗(yàn)項(xiàng)目,涉及較多工具、命令和技術(shù),實(shí)施過程中經(jīng)常遇到配置或運(yùn)行的意外情況,不僅可以讓學(xué)生提高遇到問題解決問題的實(shí)戰(zhàn)實(shí)踐能力,而且可以在實(shí)施過程中了解新技術(shù)概念。與傳統(tǒng)的操作系統(tǒng)實(shí)驗(yàn)項(xiàng)目相比,更容易引起學(xué)生的學(xué)習(xí)興趣,同時(shí)有助于對(duì)理論知識(shí)的理解和更新。對(duì)于校企產(chǎn)學(xué)合作協(xié)同育人以及操作系統(tǒng)理論課程教學(xué)改革也是一種有益的探索。