李慧春, 王成喜, 朱曉旭
(吉林大學(xué) 公共計(jì)算機(jī)教學(xué)與研究中心, 吉林 長春 130021)
目前,高校的Linux系統(tǒng)課程主要依賴于“授課為主、實(shí)驗(yàn)為輔”的教學(xué)方式[1]。在實(shí)驗(yàn)環(huán)節(jié),學(xué)生需要在真實(shí)的Linux環(huán)境下才能夠開展實(shí)驗(yàn)。本文探索了一種在Windows服務(wù)器上搭建的基于Docker的Linux在線實(shí)驗(yàn)環(huán)境。該實(shí)驗(yàn)環(huán)境可以直接通過web瀏覽器去訪問。只要有賬號(hào)和密碼就可以登錄并開展實(shí)驗(yàn)。學(xué)生如果有興趣在個(gè)人計(jì)算機(jī)上搭建使用也是很方便的。
Linux是一個(gè)優(yōu)秀的、日益成熟的操作系統(tǒng),現(xiàn)在擁有大量的用戶。由于其安全、高效、功能強(qiáng)大,具有良好的兼容性和可移植性,已經(jīng)被越來越多的人了解和使用[2]。許多互聯(lián)網(wǎng)公司、網(wǎng)絡(luò)服務(wù)提供商、系統(tǒng)集成公司,都采用Linux作為其服務(wù)器操作系統(tǒng)[3]。近年來,隨著物聯(lián)網(wǎng)、云計(jì)算及大數(shù)據(jù)等技術(shù)的快速發(fā)展,社會(huì)對Linux人才的需求不斷增加?!癓inux操作系統(tǒng)”課程是高校計(jì)算機(jī)相關(guān)專業(yè)的必修課,學(xué)生提前接觸Linux環(huán)境,能夠?yàn)橐院蟮木蜆I(yè)打下良好的基礎(chǔ)[4]。
當(dāng)前計(jì)算機(jī),主流設(shè)備上安裝的是Windows操作系統(tǒng),建立Linux環(huán)境主要有以下幾種方式[5]。
(1) 雙系統(tǒng)方式。Windows與Linux同時(shí)安裝在一臺(tái)計(jì)算機(jī)上,開機(jī)時(shí)可以選擇進(jìn)入哪個(gè)系統(tǒng)。該方式的優(yōu)點(diǎn)是能夠在較快時(shí)間內(nèi)進(jìn)入系統(tǒng),學(xué)生可以直觀地體驗(yàn)到真實(shí)的Linux,缺點(diǎn)是在實(shí)驗(yàn)室條件下硬盤保護(hù)卡無法對Linux自動(dòng)復(fù)原,手動(dòng)恢復(fù)需要時(shí)間長,增加了實(shí)驗(yàn)員維護(hù)工作量。學(xué)生如果想在自己的筆記本計(jì)算機(jī)上本地安裝雙系統(tǒng)難度比較大。
(2) 虛擬機(jī)方式。在Windows系統(tǒng)里安裝一個(gè)虛擬機(jī),如Virtual PC,VMware,然后把Linux系統(tǒng)安裝在虛擬機(jī)上。該方式的優(yōu)點(diǎn)是在實(shí)驗(yàn)室條件下可以使用硬盤保護(hù)功能,不影響Windows運(yùn)行,機(jī)房維護(hù)輕松。缺點(diǎn)是每個(gè)虛擬機(jī)都需運(yùn)行一個(gè)完整的操作系統(tǒng),至少需要占用5G的磁盤空間[6],而且虛擬機(jī)啟動(dòng)慢。學(xué)生本地安裝虛擬機(jī)同樣有很大難度。
(3) 集中服務(wù)器方式。需要建立一臺(tái)Linux操作系統(tǒng)的服務(wù)器,學(xué)生機(jī)通過網(wǎng)絡(luò)遠(yuǎn)程登錄到Linux服務(wù)器進(jìn)行訪問。如果要實(shí)現(xiàn)Linux系統(tǒng)以圖形界面形式顯示在學(xué)生機(jī)上,可以使用VNC技術(shù),或者安裝C/S架構(gòu)的軟件,常見的軟件有Xpra、Cygwin等。
(4) DRBL(diskless remote boot in Linux)方式。在一臺(tái)Linux服務(wù)器上安裝DRBL軟件,將Linux系統(tǒng)提供給大量的終端操作與使用。該方法只適用于實(shí)驗(yàn)室環(huán)境,并且要求所有計(jì)算機(jī)終端的主板和網(wǎng)卡都支持PXE網(wǎng)絡(luò)啟動(dòng)。
(5) Bash/WSL[7]。WSL的全稱是Windows Subsystem for Linux,Bash是一個(gè)Linux Shell。它是Windows 10新推出的一項(xiàng)功能,是Windows中只帶指令運(yùn)行,沒有圖形界面的Linux系統(tǒng)。它可以在Windows 10的開始菜單里通過“Bash on Ubuntu on Windows”入口直接啟動(dòng)。
本文所介紹的是屬于集中服務(wù)器方式。服務(wù)器是利用泰曉科技于2017年開發(fā)的Cloud-Lab搭建的[8]。Cloud-Lab是基于Docker技術(shù)的開源實(shí)驗(yàn)環(huán)境,只需要簡單的幾步命令就可以安裝成功。由于Cloud-Lab開發(fā)時(shí)引入了noVNC技術(shù),所以學(xué)生機(jī)需要使用支持HTML5的瀏覽器進(jìn)入實(shí)驗(yàn)環(huán)境。當(dāng)前支持HTML5的瀏覽器有Chrome 8.0+、Firefox 3.6+、IE 9.0+等。
Docker是基于go語言實(shí)現(xiàn)的開源的容器引擎,誕生于2013年,最初發(fā)起者是dotCloud公司[9]。Docker通過將運(yùn)行環(huán)境和應(yīng)用程序打包到一起,來解決部署時(shí)的環(huán)境依賴問題,真正做到跨平臺(tái)的開發(fā)和使用。借助于LXC(Linux container)內(nèi)核虛擬化技術(shù)和AUFS(advanced multi-layered unification filesystem)分層鏡像方法,Docker可以在幾乎沒有額外開銷的前提下提供資源隔離的應(yīng)用運(yùn)行環(huán)境,并且具有啟動(dòng)速度快和資源占用少的優(yōu)點(diǎn)。一臺(tái)普通服務(wù)器能運(yùn)行數(shù)百個(gè)容器(container)[10]。
Docker具有三大核心概念:鏡像(image)、容器(container)和倉庫(repository)。鏡像是基于聯(lián)合(union)文件系統(tǒng)的一種層式的結(jié)構(gòu),由一系列指令一步一步構(gòu)建出來的。一個(gè)鏡像可以是一個(gè)完整的CentOS操作系統(tǒng)環(huán)境,稱為CentOS鏡像。也可以在CentOS基礎(chǔ)上安裝MySQL的應(yīng)用程序,制作成MySQL鏡像。容器是從鏡像創(chuàng)建的運(yùn)行實(shí)例,它可以被啟動(dòng)、停止和刪除。所創(chuàng)建的每一個(gè)容器都是相互隔離、互不可見的,可以保證平臺(tái)的安全性。容器是一個(gè)動(dòng)態(tài)的概念,而鏡像是一個(gè)相對靜止的概念??梢园宴R像理解為容器的文件系統(tǒng),或者容器的源代碼。倉庫是用來保存鏡像的場所。倉庫分為公有和私有兩種。Docker公司運(yùn)營的公共倉庫叫做Docker Hub。任何用戶都可以在Docker Hub上下載已經(jīng)發(fā)布的鏡像,也可以上傳自己的鏡像供他人使用。Docker是跨平臺(tái)的,可以在Windows、Linux和MacOS操作系統(tǒng)下自由使用。
首先,Cloud-Lab實(shí)現(xiàn)了一個(gè)B/S架構(gòu)的Docker桌面系統(tǒng)。它基于noVNC和Gateone分別實(shí)現(xiàn)了VNC的Web終端,達(dá)到通過瀏覽器訪問Linux實(shí)驗(yàn)環(huán)境的目的。前者顯示的是圖形界面,后者是命令行界面[11]。VNC(virtual network computing)的功能類似于Windows的遠(yuǎn)程桌面。它把鍵盤、鼠標(biāo)動(dòng)作發(fā)送到遠(yuǎn)程計(jì)算機(jī),并把遠(yuǎn)程計(jì)算機(jī)的屏幕發(fā)送回本地,從而實(shí)現(xiàn)對另一臺(tái)計(jì)算機(jī)的遠(yuǎn)程控制[12]。noVNC是基于HTML5的遠(yuǎn)程桌面Web客戶端,可以通過WebSockets與遠(yuǎn)程的VNCServer進(jìn)行通信[13]。Gateone是一款使用HTML5技術(shù)編寫的網(wǎng)頁版SSH終端模擬器,當(dāng)用戶通過SSH方式(最終也是瀏覽器方式)登錄Linux實(shí)驗(yàn)環(huán)境時(shí)使用到了該技術(shù)[14]。
其次,Cloud-Lab把Linux的一整套環(huán)境也打包進(jìn)了Docker鏡像,包括編譯器、Qemu及相關(guān)工具。也可在里面安裝其他東西。Cloud-Lab現(xiàn)在已包括一系列實(shí)驗(yàn)環(huán)境,如CS630 Qemu Lab(X86 Linux匯編語言)、Linux 0.11 Lab(Linux 0.11內(nèi)核實(shí)驗(yàn)環(huán)境)、Linux Lab(內(nèi)核和嵌入式Linux實(shí)驗(yàn)環(huán)境)等[15]。將來深入學(xué)習(xí)Linux開發(fā)技術(shù)時(shí),可以根據(jù)需要選擇開發(fā)環(huán)境。當(dāng)前,這些環(huán)境都可以作為“Linux操作系統(tǒng)”課程的實(shí)驗(yàn)環(huán)境。本文選擇的Cloud-Lab實(shí)驗(yàn)環(huán)境為Linux 0.11 Lab。
另外,Cloud-Lab實(shí)現(xiàn)了一些簡化Docker操作的命令,如容器啟動(dòng)、端口映射、提供登錄鏈接等。
目前,對于Windows 10專業(yè)版和企業(yè)版用戶,Docker官方提供了原生虛擬化應(yīng)用Docker for Windows。Windows 10其他版本及以下版本需要通過官網(wǎng)下載的Docker Toolbox安裝[16]。本文是使用Docker Toolbox工具安裝的。安裝完成后,桌面上會(huì)出現(xiàn)三個(gè)應(yīng)用圖標(biāo):Docker Quickstart Terminal、Oracle VM VirtualBox和Kitematic。第一次打開Docker Quickstart Terminal會(huì)自動(dòng)從github下載boot2docker.iso文件,并創(chuàng)建一個(gè)默認(rèn)虛擬機(jī)。打開Oracle VM VirtualBox應(yīng)用,就能看到Docker默認(rèn)創(chuàng)建的虛擬機(jī)default。啟動(dòng)default虛擬機(jī)。進(jìn)入虛擬機(jī)系統(tǒng)就可以通過命令行進(jìn)行Cloud-Lab的安裝了。需要注意的是default系統(tǒng)默認(rèn)的工作目錄是/root,它僅僅掛載在內(nèi)存中,關(guān)閉系統(tǒng)后數(shù)據(jù)會(huì)丟失。/mnt/sda1目錄是VirtualBox上外掛的一個(gè)虛擬磁盤鏡像文件,默認(rèn)有17.9G,足夠存放本文提到的實(shí)驗(yàn)環(huán)境,切換到該目錄下:$:cd /mnt/sda1
安裝Linux 0.11的方式是從github下載Cloud-Lab源碼到本地,并選擇linux-0.11-lab作為實(shí)驗(yàn)環(huán)境:
$:git clone https://github.com/tinyclub/cloud-lab.git
$:cd cloud-lab
$:tools/docker/choose linux-0.11-lab
$:tools/deploy/run
該命令運(yùn)行后,會(huì)輸出實(shí)驗(yàn)環(huán)境登錄地址、noVNC鏈接的賬號(hào)(包括用戶名和密碼),有Normal和View兩種模式,如圖1所示。
圖1 實(shí)驗(yàn)環(huán)境賬號(hào)
由上圖可以看到Cloud-Lab使用的端口是6080,192.168.99.100是default虛擬機(jī)的IP地址。Normal鏈接可以在多處登錄,登錄后便可以操作,也可以看到彼此的操作,但是由于登錄的是同一個(gè)桌面,多人同時(shí)操作時(shí)會(huì)相互干擾。使用View鏈接登錄時(shí),只能觀看對應(yīng)的Normal鏈接的實(shí)時(shí)操作,不能親自操作。兩種模式結(jié)合非常適用于教學(xué),教師使用Normal鏈接做演示,學(xué)生登錄View鏈接學(xué)習(xí)。
如果要為用戶同時(shí)創(chuàng)建10個(gè)noVNC連接賬號(hào),獨(dú)立實(shí)驗(yàn)可以使用如下指令:$:tools/deploy/run linux-0.11-lab student 10。
另外還有一個(gè)很重要的指令,可以在出錯(cuò)時(shí)清理實(shí)驗(yàn)環(huán)境,保證實(shí)驗(yàn)環(huán)境干凈:
$:tools/docker/clean-all
由于Docker的底層使用了LXC,其實(shí)它只能運(yùn)行在Linux上,而在Windows系統(tǒng)下要運(yùn)行Docker,實(shí)際上是在虛擬機(jī)下運(yùn)行的。物理網(wǎng)絡(luò)中的計(jì)算機(jī)要訪問虛擬機(jī)還需要進(jìn)入VirtualBox中,將default虛擬機(jī)的網(wǎng)絡(luò)做個(gè)端口映射。如圖2所示,選擇使用網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)模式的網(wǎng)卡1,新建一條端口轉(zhuǎn)發(fā)規(guī)則,將主機(jī)的6080端口映射給子系統(tǒng)的6080端口。
圖2 設(shè)置端口轉(zhuǎn)發(fā)
查看服務(wù)器的IP地址,將圖1輸出的登錄地址的虛擬機(jī)IP替換為服務(wù)器的IP,就可以進(jìn)入Linux實(shí)驗(yàn)環(huán)境了,如圖3所示實(shí)驗(yàn)所用服務(wù)器的IP為192.168.31.14。
圖3 Linux在線實(shí)驗(yàn)環(huán)境
在服務(wù)器上的default虛擬機(jī)里運(yùn)行“docker ps”命令可以看到,本方法開啟了一個(gè)tinylab/cloud-ubuntu-web鏡像,并為每個(gè)noVNC鏈接的賬號(hào)開啟一個(gè)tinylab/linux-0.11-lab鏡像。所有登錄到服務(wù)器的終端數(shù)據(jù)都存放在虛擬機(jī)掛載的數(shù)據(jù)盤上,客戶端幾乎不消耗資源。
在實(shí)驗(yàn)室機(jī)房進(jìn)行了本方法的性能測試。機(jī)房安裝有80臺(tái)學(xué)生機(jī)、1臺(tái)服務(wù)器。服務(wù)器的配置為:cpu(型號(hào)E5-2609)、8個(gè)內(nèi)核、8GB內(nèi)存、1T硬盤、Windows Server 2008企業(yè)版64位操作系統(tǒng)。學(xué)生機(jī)瀏覽器版本為Chrome 8.0。所有計(jì)算機(jī)連接在4臺(tái)24口H3C千兆交換機(jī)上,型號(hào)為S1224R。所有交換機(jī)連接在1臺(tái)H3C路由器上,型號(hào)為S5120。
為虛擬機(jī)分配5G(5120MB)物理內(nèi)存,4個(gè)內(nèi)核。每當(dāng)在服務(wù)器上新建一個(gè)賬號(hào)后,就在一臺(tái)學(xué)生機(jī)上登錄該賬號(hào)的Normal模式進(jìn)入Lab,然后在Lab控制臺(tái)輸入如下內(nèi)容:
$:sudo -s
$:(while true; do echo -n A >> log; sleep 1; done)
以上命令首先切換到root用戶,然后新建一個(gè)進(jìn)程,不斷把字母“A”添加到~/log文件中去,模擬多個(gè)學(xué)生同時(shí)進(jìn)行獨(dú)立實(shí)驗(yàn)的一般情形。打開任務(wù)管理器,記錄下Lab數(shù)量對服務(wù)器性能的影響,實(shí)驗(yàn)結(jié)果如表1所示。
表1 虛擬機(jī)分配5G內(nèi)存時(shí)服務(wù)器性能與Lab個(gè)數(shù)關(guān)系表
實(shí)驗(yàn)過程可以看出,虛擬機(jī)分配5 G內(nèi)存時(shí),最多能支持45個(gè)獨(dú)立實(shí)驗(yàn)環(huán)境,多于此值時(shí)CPU處于繁忙狀態(tài),實(shí)驗(yàn)環(huán)境出現(xiàn)卡頓,掉線情況。在Lab個(gè)數(shù)為20~25之間的某一個(gè)值之前,物理內(nèi)存消耗與Lab個(gè)數(shù)成線性關(guān)系。每個(gè)實(shí)驗(yàn)環(huán)境大約需要200 MB內(nèi)存。在那個(gè)值之后,內(nèi)存消耗極少,主要是靠CPU處理缺頁中斷來保持Lab穩(wěn)定工作。
另外,調(diào)整實(shí)驗(yàn)中給虛擬機(jī)分配的物理內(nèi)存,最多能夠支持的獨(dú)立實(shí)驗(yàn)環(huán)境個(gè)數(shù)如表2所示。
表2 虛擬機(jī)內(nèi)存與最多支持的Lab個(gè)數(shù)關(guān)系表
由此可見,在集中式服務(wù)器場景中,使用本文方法建立Linux在線實(shí)驗(yàn)環(huán)境時(shí),服務(wù)器的硬件資源需要根據(jù)實(shí)驗(yàn)人數(shù)進(jìn)行合理配置。
本文研究并實(shí)現(xiàn)了一種基于Docker的Linux在線實(shí)驗(yàn)環(huán)境。該方法為Linux操作系統(tǒng)的學(xué)習(xí)提供了低成本高效率的實(shí)驗(yàn)環(huán)境建設(shè)方案。學(xué)生沒有本地安裝實(shí)驗(yàn)環(huán)境的必要,只需有個(gè)瀏覽器就足夠。離開了實(shí)驗(yàn)室,學(xué)生也可以通過自己的筆記本或者臺(tái)式計(jì)算機(jī)遠(yuǎn)程訪問實(shí)驗(yàn)環(huán)境進(jìn)行實(shí)驗(yàn),降低了學(xué)習(xí)的門檻,提高了學(xué)生動(dòng)手學(xué)習(xí)的積極性。