葉連杰
(西安西電電氣研究院有限責(zé)任公司,西安 710077)
虛擬化是對計算機各種硬件實體資源的綜合管理技術(shù),將計算機的計算資源、網(wǎng)絡(luò)、存儲等資源進行抽象、轉(zhuǎn)換后進行呈現(xiàn)。利用虛擬化技術(shù)可以打破傳統(tǒng)的硬件不可分割成塊的障礙,根據(jù)使用場景隨意組合,可以更加高效、合理的利用硬件資源。虛擬化后的計算資源不受硬件地域或物理組態(tài)方式的限制,能夠更加靈活的配置組網(wǎng)。虛擬化技術(shù)的引入,避免了大量服務(wù)器硬件資源的堆砌,簡化組網(wǎng)復(fù)雜度和管理難度,降低采購和運維成本。
虛擬化技術(shù)可以分為半虛擬化、完全虛擬化和準(zhǔn)虛擬化。隨著虛擬化的發(fā)展,逐步形成了幾類主流的技術(shù)或產(chǎn)品:
Xen-由劍橋大學(xué)開發(fā)的,一款開源的虛擬機監(jiān)視器,它采用ICA協(xié)議,屬于半虛擬化技術(shù),所以其性能損失非常?。?/p>
KVM-KVM是一個全虛擬化的解決方案,但需要CPU支持虛擬化功能;
LXC-即:Linux Container,Linux容器,是一種輕量級的虛擬化的手段。它可以提供輕量級的虛擬化,以隔離進程和資源,而且不需要提供指令解釋機制以及全虛擬化的其他復(fù)雜性;
Hyper-V-是微軟件推出的一種虛擬化技術(shù),可以采用半虛擬化或全虛擬的方式創(chuàng)建虛擬機,但其本身只能運行在Windows系統(tǒng)下。
Oracle VM-Oracle推出的服務(wù)器虛擬化軟件,基于開源的Xen技術(shù),包括Oracle VM Server和Oracle VM Manager兩部分。
VMware Workstation-是一款桌面虛擬機軟件,可以在一臺實體機器上模擬完整的網(wǎng)絡(luò)環(huán)境,并可運行多個Windows、DOS、Linux或Mac系統(tǒng)。VMware Workstation是一款完全虛擬化產(chǎn)品,可借助硬件輔助在不修改用戶操作系統(tǒng)的情況下完整虛擬化操作系統(tǒng)。同時,針對更高級的資源管理和控制功能,還有VMware ESX Server可供選擇。
虛擬化技術(shù)日趨成熟,已經(jīng)征服了桌面系統(tǒng),隨著芯片處理能力的提高,虛擬化技術(shù)逐步向嵌入式領(lǐng)域拓展。在嵌入式平臺上進行虛擬化,同樣可以獲得靈活的系統(tǒng)管理和應(yīng)用布局。
Xen是可以移植到嵌入式平臺的虛擬化典型產(chǎn)品,而且Xen具備一個優(yōu)異的特點是可以直接在底層硬件上運行。它可以將主機操作系統(tǒng)按照區(qū)域進行劃分,利用特殊的管理程序進行控制,而這個管理程序中最常見的便是Linux。若想使用Xen管理程序,目前比較理想的設(shè)計平臺是基于ARMv8處理器的賽靈思ZynqUltraScale+MPSoC,其對Xen的支持較好。
VirtualLogix公司的VirtualLogix VLX是比較典型的嵌入式虛擬化技術(shù),它將底層硬件與應(yīng)用軟件之間進行了隔離,形成了抽象的虛擬化層,并對此層進行了分區(qū),之后分配給各嵌入式系統(tǒng),由此各系統(tǒng)獨立運行。
Docker是虛擬化的一種,它將底層系統(tǒng)、依賴環(huán)境、應(yīng)用程序等進行統(tǒng)一打包,形成一個整體的鏡像文件,成為一個獨立的容器,部署在其他的平臺或宿主機上。與其他虛擬化技術(shù)不同的是,Docker是直接運行在宿主機的操作系統(tǒng)之上的容器,類似獨立的沙箱,容器之間完全隔離,每個容器可以獨立管理、配置。
Docker是利用LXC實現(xiàn)了VM類似的功能,得到的效果便是以最小的硬件開銷達到更高的計算能力,因此Docker的虛擬化技術(shù)屬于操作系統(tǒng)級虛擬化方法。
2.2.1 Docker的架構(gòu)
Docker使用服務(wù)器-客戶端(C/S)架構(gòu)模式。Docker服務(wù)器運行后,會在宿主機上形成一個守護進程,Docker服務(wù)器或守護進程會接受來自客戶端的創(chuàng)建、運行、停止、刪除等請求,處理完成后返回相應(yīng)結(jié)果。Docker的架構(gòu)如圖1所示。
圖1 Docker架構(gòu)圖
2.2.2 Docker的核心組件
Docker主要由鏡像、倉庫、容器等幾部分組成。其中鏡像是構(gòu)建Docker容器的基礎(chǔ),是一種層式結(jié)構(gòu)的增量文件系統(tǒng),更加輕量化,可以在鏡像倉庫中下載后直接運行使用;容器是鏡像創(chuàng)建后的運行實例,相互之間獨立、隔離,數(shù)據(jù)信息通過開放的端口進行交互。在這里需要注意的是,Docker基于Linux內(nèi)核進行運行,且只能運行在64位主機中,無法在32位的Linux環(huán)境下運行。
本文選擇Raspberry Pi 3開發(fā)板為硬件基礎(chǔ)平臺。此開發(fā)板的CPU為ARM Cortex-A53 1.2GHz四核,輔以1GB的RAM。同時配備了4個USB接口、RJ45接口、內(nèi)置WIFI等豐富接口。本文將在此開發(fā)板上部署Docker,同時部署Redis數(shù)據(jù)庫和自編寫的C/C++應(yīng)用程序,實現(xiàn)數(shù)據(jù)的采集與存儲。
我們的首要任務(wù)是在板卡上安裝Docker的服務(wù)。Docker的安裝有多種方式,可以利用官方的yum源安裝,也可以獲取安裝腳本自動下載安裝,在此我們選擇后者。由于樹莓派3B的CPU是64位架構(gòu),操作系統(tǒng)為Debian,因此可以通過Docker官方指導(dǎo)文檔掌握其對應(yīng)的安裝方式。為簡化操作流程,我們可以通過“curl-fsSL get.docker.com -o get-docker.sh”和“sh get-docker.sh”2條命令自動完成Docker服務(wù)的安裝。
圖2 Docker環(huán)境安裝驗證
啟動Docker服務(wù)需要對應(yīng)的鏡像,可以在Docker的鏡像倉庫中下載安裝,docker同樣提供了豐富的命令可供使用。
本文中使用的Redis鏡像版本為latest,執(zhí)行命令docker pull redis:latest。Redis的版本盡量選擇最新版本,軟件的穩(wěn)定性和功能支持比較優(yōu)良。Docker鏡像下載后會自動安裝,安裝完成后可以利用docker images命令進行查看,確認安裝是否順利完成。
執(zhí)行以下命令可以運行Redis數(shù)據(jù)庫,docker run-p 6379:6379-d redis:latest redis-server,啟動時可以通過不同的命令實現(xiàn)Redis的后臺運行。
圖3 運行redis:latest鏡像
利用docker attach“容器ID”命令或者docker exec-it“容器ID”/bin/bash命令可以進入運行中的Docker容器,查看其運行狀態(tài)以及進行其他操作。
本文所選取的自定義應(yīng)用為SIEMENS的PLC數(shù)據(jù)采集協(xié)議S7,使用C/C++語言開發(fā)完成,此程序在其他平臺進行了測試,程序正確性和穩(wěn)定性方面無問題。
參照前文所述,選取一個基礎(chǔ)鏡像。由于需要制作含有自定義應(yīng)用的Docker鏡像,因此選取的鏡像需要完整,包含Linux系統(tǒng)提供應(yīng)用的運行環(huán)境支持,本文選取的是gcc:latest版本作為運行基礎(chǔ)。從鏡像倉庫下載下來安裝完成后,將自定義應(yīng)用源代碼在當(dāng)前嵌入式環(huán)境下利用gcc進行編譯,生成可執(zhí)行文件。
本文采用Dockerfile的方式將自定義應(yīng)用可執(zhí)行文件和運行所需的配置文件融合進gcc鏡像,形成自己的鏡像,此鏡像的啟動可以實現(xiàn)自定義應(yīng)用的自動運行。
圖4 創(chuàng)建自定義應(yīng)用鏡像
圖5 Docker鏡像匯總查看
應(yīng)用Docker,必然需要啟動多個容器,運行多種應(yīng)用才能實現(xiàn)它的價值。
本文利用兩款SIEMENS的PLC和一款A(yù)B的PLC,連同搭載Docker虛擬化技術(shù)的嵌入式網(wǎng)關(guān)形成一套驗證環(huán)境。驗證思路為針對不同的采集協(xié)議制作多個Docker鏡像并先后啟動運行,分別利用S7通訊協(xié)議和ModbusRTU協(xié)議完成數(shù)據(jù)的采集。Docker下的多個容器采用沙箱機制,互相獨立,互不影響。
圖6 Docker容器并行測試驗證環(huán)境
驗證前期需要分別將S7采集程序和ModbusRTU協(xié)議程序源代碼在嵌入式環(huán)境下進行編譯,并利用前述方法生成另一個Docker鏡像。
本文所述的S7數(shù)據(jù)采集協(xié)議為TCP/IP協(xié)議族的一種,因此在對應(yīng)的容器運行時,需要對容器的網(wǎng)絡(luò)參數(shù)進行配置。Docker提供了多種網(wǎng)絡(luò)配置方式,有host、container、none和bridge模式。某些應(yīng)用需要利用宿主機的網(wǎng)絡(luò)IP與同網(wǎng)段網(wǎng)絡(luò)設(shè)備通訊,可配置為host模式,此時利用如下命令docker run-it--rm--net=host“image名稱”:“image版本”bash啟動容器,之后可以進入容器內(nèi)查看其IP是否與宿主機IP一致,實現(xiàn)容器與外部設(shè)備的數(shù)據(jù)交換。
圖7 宿主機網(wǎng)絡(luò)配置信息
圖8 自定義鏡像容器IP配置
依據(jù)上述配置,依次啟動含有S 7 協(xié)議程序和ModbusRTU協(xié)議程序的鏡像。
圖9 啟動各鏡像
圖10 鏡像運行狀態(tài)匯總
搭載不同采集協(xié)議程序的鏡像獨立運行,分別完成各自所負責(zé)PLC的數(shù)據(jù)采集,并將采集數(shù)據(jù)寫入Redis數(shù)據(jù)庫,通過RedisDesktopManager連接Redis查看數(shù)據(jù),實現(xiàn)了數(shù)據(jù)的匯總存儲。
圖11 采集數(shù)據(jù)查看
利用Docker容器技術(shù),我們可以實現(xiàn)運行于不同環(huán)境下的程序的共存,Docker將底層設(shè)備與上層應(yīng)用進行了隔離,統(tǒng)一了運行環(huán)境,可以極大的降低應(yīng)用開發(fā)過程中依據(jù)嵌入式系統(tǒng)環(huán)境進行移植的大量工作,同時Docker的核心組件為自定義應(yīng)用的組合、容器的制作提供了便捷可行的方法,不僅能夠降低應(yīng)用調(diào)度程序的開發(fā)成本,也能更加靈活的對應(yīng)用進行拓展和組網(wǎng)。
嵌入式系統(tǒng)由于其架構(gòu)的特殊性,虛擬化的工作不像桌面端容易部署,而隨著大數(shù)據(jù)和云計算技術(shù)的快速發(fā)展,業(yè)務(wù)需求不斷增加,數(shù)據(jù)量驟增,數(shù)據(jù)處理節(jié)點已經(jīng)向終端下沉,虛擬化技術(shù)的實現(xiàn)為終端邊緣計算提供了無限可能。
眾多虛擬化方案中,Docker的優(yōu)勢明顯。Docker以占用最小的存儲空間提供完整一致的運行環(huán)境,安裝部署簡單,啟動快速,遷移方便,這些特性都優(yōu)于傳統(tǒng)虛擬機技術(shù),也可以降低開發(fā)人員的程序開發(fā)難度,因此Docker在嵌入式環(huán)境中具有廣闊的應(yīng)用平臺。本文也通過樹莓派硬件平臺對Docker在嵌入式領(lǐng)域的應(yīng)用進行了驗證,可以充分挖掘Docker在嵌入式領(lǐng)域的巨大應(yīng)用潛能,將云計算的架構(gòu)體系、服務(wù)能力進一步下沉,提升終端側(cè)的邊緣計算能力和服務(wù)在線升級能力,改變傳統(tǒng)嵌入式設(shè)備服務(wù)更新困難以及升級后重啟的弊端。