0 引言
在數(shù)字化時代,嵌入式系統(tǒng)開發(fā)日益復雜且多樣化,這就迫使開發(fā)人員尋求創(chuàng)新性的解決方案來提高開發(fā)效率、靈活性和安全性。在這一背景下,虛擬化技術(shù)通過在物理設(shè)備上模擬多個獨立的虛擬環(huán)境,為開發(fā)人員提供了一種有效的方式來實現(xiàn)資源隔離、快速部署和靈活擴展,極大地提高了開發(fā)效率和應用可靠性。同時,虛擬化技術(shù)允許在一臺物理設(shè)備上運行不同的虛擬機實例,降低了硬件成本。因此,虛擬化技術(shù)在嵌入式開發(fā)領(lǐng)域扮演著至關(guān)重要的角色。
將云開發(fā)平臺和虛擬化技術(shù)相結(jié)合,為嵌入式開發(fā)帶來了諸多好處。云開發(fā)平臺的出現(xiàn)使得開發(fā)人員可以通過網(wǎng)絡隨時隨地進行開發(fā)和調(diào)試,避免了受限于特定環(huán)境和配置的局限性。開發(fā)人員可以利用云端虛擬機管理功能快速創(chuàng)建、銷毀虛擬機實例,無須手動處理煩瑣的部署流程,極大地節(jié)省了時間和精力成本。這種靈活性和便捷性使得開發(fā)團隊能夠更加高效地協(xié)作,加速開發(fā)周期,提高軟件質(zhì)量。綜上所述,嵌入式云開發(fā)平臺和虛擬化技術(shù)的結(jié)合為嵌入式開發(fā)帶來了顛覆性的改變和巨大的潛力。本文將詳細介紹一種嵌入式云開發(fā)平臺的虛擬機管理技術(shù)方案。
1 關(guān)鍵技術(shù)
本章介紹嵌入式云平臺虛擬機管理技術(shù)實現(xiàn)過程中使用到的關(guān)鍵技術(shù),包括CodeServer、Node.js、
SpringBoot、Libvirt、Redis、VSCode插件和QEMU。
1)CodeServer1是一個基于VSCode的開源項目,允許用戶通過瀏覽器訪問VSCode的功能。它提供了類似于本地IDE的體驗,使開發(fā)者可以遠程訪問和編輯代碼。CodeServer支持Docker容器部署,能實現(xiàn)開發(fā)環(huán)境的快速搭建和遷移。
2)Node.js[2]是一個基于ChromeV8引擎的JavaScript運行環(huán)境,用于構(gòu)建高性能的網(wǎng)絡應用程序。它支持異步編程模型,使得服務器端JavaScript編程更加方便和高效。
3)SpringBoot③是一個基于Spring框架的快速應用程序開發(fā)工具,通過自動配置和約定優(yōu)于配置的原則,簡化了Spring應用程序的開發(fā)流程。
4)Libvirt4是一個用于管理虛擬化平臺的庫,支持多種虛擬化技術(shù)(如QEMU、KVM等),提供了統(tǒng)一的管理接口和工具,簡化了虛擬機管理的復雜性。
5)Redis5是一個開源的內(nèi)存數(shù)據(jù)庫,用作緩存、消息隊列和鍵值存儲。它支持多種數(shù)據(jù)結(jié)構(gòu),具有高性能和可擴展性,常用于構(gòu)建高效的應用程序。
6)VSCode[6]插件允許開發(fā)者使用TypeScript語言擴展VisualStudioCode的功能,定制化開發(fā)環(huán)境以滿足特定需求。通過插件開發(fā),可以為VSCode添加新的功能和工具。
7)QEMU7是一個開源的虛擬機監(jiān)視器和仿真器,支持多種處理器架構(gòu)和硬件設(shè)備的模擬。它被廣泛用于虛擬化和嵌入式系統(tǒng)開發(fā),提供了強大的虛擬化能力。
2 虛擬機管理設(shè)計與實現(xiàn)
本文所述虛擬機管理技術(shù)的具體實現(xiàn)分為云開發(fā)平臺端和虛擬機管理服務端兩部分。云開發(fā)平臺端基于CodeServer技術(shù),使用VSCode插件開發(fā)框架,為開發(fā)人員提供植入云開發(fā)平臺的虛擬機管理平臺,方便用戶管控虛擬機;虛擬機管理服務端基于SpringBoot框架,使用Libvirt工具實現(xiàn)虛擬機的遠程創(chuàng)建、銷毀、重啟等管理操作。
2.1 云開發(fā)平臺端設(shè)計與實現(xiàn)
云開發(fā)平臺端基于VSCode插件框架,使用Node.js技術(shù)和TypeScript語言實現(xiàn)vscode.TreeView(樹視圖),以樹形視圖的形式顯示與用戶關(guān)聯(lián)的虛擬機,并結(jié)合服務端RestfulAPI實現(xiàn)與QEMU虛擬機服務的交互(包括虛擬機創(chuàng)建、查詢虛擬機列表、啟動虛擬機、關(guān)閉虛擬機和重啟虛擬機)。其核心類的設(shè)計如圖1所示。
1)vscode.TreeDataProvider接口:VSCode提供的treeView插件接口。其中g(shù)etTreeltem方法用于定義樹節(jié)點的渲染方式,包括節(jié)點名稱、圖標、tooltip等信息;getChildren方法用于獲取第一層級節(jié)點數(shù)據(jù),或者某一個樹節(jié)點的子節(jié)點信息;onDidChange-TreeData定義了一個事件,用于在樹視圖數(shù)據(jù)發(fā)生變化時刷新樹視圖。
2)VmDataProvider類:用于組織界面數(shù)據(jù),它實現(xiàn)了vscode.TreeDataProvider接口及其中的getTree-Item方法和getChildren0方法,并提供樹視圖數(shù)據(jù)初始化、創(chuàng)建虛擬機、啟動虛擬機、關(guān)閉虛擬機等QEMU虛擬機交互操作。
3)VmDataApi類:封裝開發(fā)平臺對虛擬機管理服務的API調(diào)用,通過Http請求進行虛擬機列表查詢,虛擬機創(chuàng)建、啟動、銷毀、重啟等操作。該類統(tǒng)一維護平臺端和服務端的交互,方便管理、擴展以及維護。
4)TreeNode類:是平臺端描述和存儲虛擬機節(jié)點相關(guān)信息的數(shù)據(jù)結(jié)構(gòu),其中包含節(jié)點名稱、虛擬機IP地址、虛擬機MAC地址、節(jié)點圖標、子節(jié)點列表、虛擬機連接狀態(tài)、串口重定向端口等信息。VSCode樹視圖通過這些節(jié)點信息渲染樹節(jié)點的樣式。
在創(chuàng)建虛擬機時,用戶需要指定虛擬機串口重定向端口,用于在平臺端創(chuàng)建TCPSocketSever,并將虛擬機串口輸入/輸出重定向到TCPSocket,其具體實現(xiàn)流程如圖2所示。
1)在用戶執(zhí)行啟動虛擬機操作時,平臺根據(jù)虛擬機串口重定向端口創(chuàng)建一個TCPSocketSever,用于監(jiān)聽虛擬機socket連接。虛擬機啟動后,會建立虛擬機到平臺端的socket連接。
2)當平臺端接收到虛擬機的socket連接請求后,首先創(chuàng)建一個VSCode終端,并監(jiān)聽TCPSocketServer的data事件,當接收到虛擬機端發(fā)送的數(shù)據(jù)時,將數(shù)據(jù)輸出到終端,同時捕獲用戶在終端的輸入,并通過socket連接發(fā)送給虛擬機。重復這個過程,直到用戶主動關(guān)閉終端或者銷毀虛擬機。
2.2 虛擬機管理服務端設(shè)計與實現(xiàn)
QEMU虛擬機管理服務模塊基于SpringBoot框架開發(fā),使用Libvirt、SSH文件傳輸協(xié)議(SecretFileTransferProtocol,SFTP)、Redis等技術(shù),為用戶提供基于RestfulAPI的虛擬機管理功能,包括虛擬機Kernel文件上傳,QEMU虛擬機配置創(chuàng)建、啟動、銷毀、重啟等功能。其核心類的設(shè)計如圖3所示。
1)FileController類:該類提供虛擬機Kernel文件上傳Restful接口,接收平臺端發(fā)來的文件上傳請求。
2)FileService接口:定義文件上傳方法。
3)FileServicelmpl類:該類實現(xiàn)FileService接口(定義文件上傳方法),是文件上傳功能的具體實現(xiàn)類。其使用SFTP協(xié)議將用戶上傳的虛擬機Kernel文件保存到服務器文件系統(tǒng)中。文件的具體存放位置可以在配置文件application.yml中進行配置。
4)VmController類:該類提供虛擬機管理功能的Restful接口,接收平臺端發(fā)來的虛擬機創(chuàng)建、啟動、銷毀等請求。
5)VmService接口:該接口聲明了QEMU虛擬機管理功能的各個方法。
6)VmServicelmpl類:該類實現(xiàn)VmService接口,負責QEMU虛擬機管理各個功能的具體實現(xiàn),包括使用Libvirt工具創(chuàng)建、銷毀、重啟虛擬機,另外通過VmDao類實例實現(xiàn)QEMU虛擬機信息的持久化存儲。
7)VmDao類:該類定義操作Redis數(shù)據(jù)的方法,用于快速存儲、刪除、查詢QEMU虛擬機信息。
8)XmIUtil類:該類維護了一套QEMU虛擬機和虛擬機存儲卷的XML模板,根據(jù)用戶創(chuàng)建虛擬機請求中的虛擬機配置信息(包括IP地址、MAC地址、CPU核數(shù)、內(nèi)存大小等信息),生成新虛擬機配置及存儲卷的XML信息,VmServiceImpl依據(jù)這些信息創(chuàng)建和啟動虛擬機。
2.3虛擬機創(chuàng)建流程及其關(guān)鍵步驟實現(xiàn)
當用戶從開發(fā)平臺發(fā)起創(chuàng)建虛擬機操作時,請求數(shù)據(jù)流經(jīng)開發(fā)平臺端和虛擬機管理服務端,流程大致分為構(gòu)造虛擬機參數(shù)、上傳Kernel文件、啟動虛擬機三個階段,具體流程圖如圖4所示。
1)在開發(fā)平臺端,用戶根據(jù)需要填寫QEMU虛擬機創(chuàng)建參數(shù),包括CPU核數(shù)、內(nèi)存大小、Kernel文件、IP地址等,然后平臺端發(fā)送上傳Kernel文件請求。
2)虛擬機管理服務端接收到上傳文件請求后,新建SFTP會話,然后將Kernel文件存儲到服務器的指定路徑。
3)開發(fā)平臺端上傳文件成功之后,接著向虛擬機管理服務發(fā)送啟動虛擬機請求。虛擬機管理服務向后臺libvirtd-tcp.socket服務的socket接口發(fā)送Libvirt連接請求,并根據(jù)用戶傳入虛擬機參數(shù)和虛擬機XML配置模板生成QEMU虛擬機配置文件,將用戶上傳的Kernel文件加載到QEMU鏡像池中,完成啟動虛擬機操作。虛擬機啟動完成后,將串口輸入/輸出重定向到配置文件中定義的socket連接,因為開發(fā)平臺端已事先創(chuàng)建了SocketServer并綁定了終端,因此用戶通過終端實現(xiàn)與虛擬機的串口通信。
3 結(jié)束語
本文深入探討了一種嵌入式云開發(fā)平臺的虛擬機管理技術(shù),結(jié)合Code Server、Node.js、SpringBoot、Libvirt、Redis、VSCode插件和QEMU等關(guān)鍵技術(shù),實現(xiàn)了嵌入式云開發(fā)平臺的虛擬機創(chuàng)建、銷毀和重啟等操作,并實現(xiàn)了開發(fā)平臺和虛擬機的通信。這項研究為嵌入式系統(tǒng)開發(fā)提供了新的思路和技術(shù)支持。展望未來,我們將探索更多先進的云計算和虛擬化技術(shù),如容器化技術(shù),以滿足不斷變化的嵌入式系統(tǒng)需求;深入研究安全性和隱私保護等關(guān)鍵問題,確保嵌入式云開發(fā)平臺的可靠性和安全性。通過不懈努力和持續(xù)探索,相信嵌入式云開發(fā)平臺的虛擬機管理技術(shù)將在未來嵌入式系統(tǒng)領(lǐng)域發(fā)揮更加重要的作用。
[參考文獻]
[1] Code-server[EB/0L].(2019-05-05)[2024-11-19].https://coder.com/docs.
[2]潘成均.Node.js全棧開發(fā)從入門到項目實戰(zhàn)[M].北京:清華大學出版社,2024.
[3]王福強.SpringBoot揭秘快速構(gòu)建微服務體系[M].北京:機械工業(yè)出版社,2016.
[4]顧軍林,徐義晗.虛擬化與網(wǎng)絡存儲技術(shù)[M].北京:人民郵電出版社,2019.
[5]黃健宏.Redis設(shè)計與實現(xiàn)[M].北京:機械工業(yè)出版社,2014.
[6]韓駿.VisualStudioCode權(quán)威指南[M].北京:電子工業(yè)出版社,1999.
[7]QEMU Mannul[EB/0L].(2012-08-01)[2015-05-16].http://wiki.qemu.org/mannul.
[8]PATNI S.RESTful API開發(fā)實戰(zhàn)使用RESTJSON XML和JAX-RS構(gòu)建微服務大數(shù)據(jù)和Web服務應用[M].郭理勇,譯.北京:清華大學出版社,2018.