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