李慧春, 王成喜, 朱曉旭
(吉林大學 公共計算機教學與研究中心, 吉林 長春 130021)
目前,高校的Linux系統課程主要依賴于“授課為主、實驗為輔”的教學方式[1]。在實驗環節,學生需要在真實的Linux環境下才能夠開展實驗。本文探索了一種在Windows服務器上搭建的基于Docker的Linux在線實驗環境。該實驗環境可以直接通過web瀏覽器去訪問。只要有賬號和密碼就可以登錄并開展實驗。學生如果有興趣在個人計算機上搭建使用也是很方便的。
Linux是一個優秀的、日益成熟的操作系統,現在擁有大量的用戶。由于其安全、高效、功能強大,具有良好的兼容性和可移植性,已經被越來越多的人了解和使用[2]。許多互聯網公司、網絡服務提供商、系統集成公司,都采用Linux作為其服務器操作系統[3]。近年來,隨著物聯網、云計算及大數據等技術的快速發展,社會對Linux人才的需求不斷增加?!癓inux操作系統”課程是高校計算機相關專業的必修課,學生提前接觸Linux環境,能夠為以后的就業打下良好的基礎[4]。
當前計算機,主流設備上安裝的是Windows操作系統,建立Linux環境主要有以下幾種方式[5]。
(1) 雙系統方式。Windows與Linux同時安裝在一臺計算機上,開機時可以選擇進入哪個系統。該方式的優點是能夠在較快時間內進入系統,學生可以直觀地體驗到真實的Linux,缺點是在實驗室條件下硬盤保護卡無法對Linux自動復原,手動恢復需要時間長,增加了實驗員維護工作量。學生如果想在自己的筆記本計算機上本地安裝雙系統難度比較大。
(2) 虛擬機方式。在Windows系統里安裝一個虛擬機,如Virtual PC,VMware,然后把Linux系統安裝在虛擬機上。該方式的優點是在實驗室條件下可以使用硬盤保護功能,不影響Windows運行,機房維護輕松。缺點是每個虛擬機都需運行一個完整的操作系統,至少需要占用5G的磁盤空間[6],而且虛擬機啟動慢。學生本地安裝虛擬機同樣有很大難度。
(3) 集中服務器方式。需要建立一臺Linux操作系統的服務器,學生機通過網絡遠程登錄到Linux服務器進行訪問。如果要實現Linux系統以圖形界面形式顯示在學生機上,可以使用VNC技術,或者安裝C/S架構的軟件,常見的軟件有Xpra、Cygwin等。
(4) DRBL(diskless remote boot in Linux)方式。在一臺Linux服務器上安裝DRBL軟件,將Linux系統提供給大量的終端操作與使用。該方法只適用于實驗室環境,并且要求所有計算機終端的主板和網卡都支持PXE網絡啟動。
(5) Bash/WSL[7]。WSL的全稱是Windows Subsystem for Linux,Bash是一個Linux Shell。它是Windows 10新推出的一項功能,是Windows中只帶指令運行,沒有圖形界面的Linux系統。它可以在Windows 10的開始菜單里通過“Bash on Ubuntu on Windows”入口直接啟動。
本文所介紹的是屬于集中服務器方式。服務器是利用泰曉科技于2017年開發的Cloud-Lab搭建的[8]。Cloud-Lab是基于Docker技術的開源實驗環境,只需要簡單的幾步命令就可以安裝成功。由于Cloud-Lab開發時引入了noVNC技術,所以學生機需要使用支持HTML5的瀏覽器進入實驗環境。當前支持HTML5的瀏覽器有Chrome 8.0+、Firefox 3.6+、IE 9.0+等。
Docker是基于go語言實現的開源的容器引擎,誕生于2013年,最初發起者是dotCloud公司[9]。Docker通過將運行環境和應用程序打包到一起,來解決部署時的環境依賴問題,真正做到跨平臺的開發和使用。借助于LXC(Linux container)內核虛擬化技術和AUFS(advanced multi-layered unification filesystem)分層鏡像方法,Docker可以在幾乎沒有額外開銷的前提下提供資源隔離的應用運行環境,并且具有啟動速度快和資源占用少的優點。一臺普通服務器能運行數百個容器(container)[10]。
Docker具有三大核心概念:鏡像(image)、容器(container)和倉庫(repository)。鏡像是基于聯合(union)文件系統的一種層式的結構,由一系列指令一步一步構建出來的。一個鏡像可以是一個完整的CentOS操作系統環境,稱為CentOS鏡像。也可以在CentOS基礎上安裝MySQL的應用程序,制作成MySQL鏡像。容器是從鏡像創建的運行實例,它可以被啟動、停止和刪除。所創建的每一個容器都是相互隔離、互不可見的,可以保證平臺的安全性。容器是一個動態的概念,而鏡像是一個相對靜止的概念。可以把鏡像理解為容器的文件系統,或者容器的源代碼。倉庫是用來保存鏡像的場所。倉庫分為公有和私有兩種。Docker公司運營的公共倉庫叫做Docker Hub。任何用戶都可以在Docker Hub上下載已經發布的鏡像,也可以上傳自己的鏡像供他人使用。Docker是跨平臺的,可以在Windows、Linux和MacOS操作系統下自由使用。
首先,Cloud-Lab實現了一個B/S架構的Docker桌面系統。它基于noVNC和Gateone分別實現了VNC的Web終端,達到通過瀏覽器訪問Linux實驗環境的目的。前者顯示的是圖形界面,后者是命令行界面[11]。VNC(virtual network computing)的功能類似于Windows的遠程桌面。它把鍵盤、鼠標動作發送到遠程計算機,并把遠程計算機的屏幕發送回本地,從而實現對另一臺計算機的遠程控制[12]。noVNC是基于HTML5的遠程桌面Web客戶端,可以通過WebSockets與遠程的VNCServer進行通信[13]。Gateone是一款使用HTML5技術編寫的網頁版SSH終端模擬器,當用戶通過SSH方式(最終也是瀏覽器方式)登錄Linux實驗環境時使用到了該技術[14]。
其次,Cloud-Lab把Linux的一整套環境也打包進了Docker鏡像,包括編譯器、Qemu及相關工具。也可在里面安裝其他東西。Cloud-Lab現在已包括一系列實驗環境,如CS630 Qemu Lab(X86 Linux匯編語言)、Linux 0.11 Lab(Linux 0.11內核實驗環境)、Linux Lab(內核和嵌入式Linux實驗環境)等[15]。將來深入學習Linux開發技術時,可以根據需要選擇開發環境。當前,這些環境都可以作為“Linux操作系統”課程的實驗環境。本文選擇的Cloud-Lab實驗環境為Linux 0.11 Lab。
另外,Cloud-Lab實現了一些簡化Docker操作的命令,如容器啟動、端口映射、提供登錄鏈接等。
目前,對于Windows 10專業版和企業版用戶,Docker官方提供了原生虛擬化應用Docker for Windows。Windows 10其他版本及以下版本需要通過官網下載的Docker Toolbox安裝[16]。本文是使用Docker Toolbox工具安裝的。安裝完成后,桌面上會出現三個應用圖標:Docker Quickstart Terminal、Oracle VM VirtualBox和Kitematic。第一次打開Docker Quickstart Terminal會自動從github下載boot2docker.iso文件,并創建一個默認虛擬機。打開Oracle VM VirtualBox應用,就能看到Docker默認創建的虛擬機default。啟動default虛擬機。進入虛擬機系統就可以通過命令行進行Cloud-Lab的安裝了。需要注意的是default系統默認的工作目錄是/root,它僅僅掛載在內存中,關閉系統后數據會丟失。/mnt/sda1目錄是VirtualBox上外掛的一個虛擬磁盤鏡像文件,默認有17.9G,足夠存放本文提到的實驗環境,切換到該目錄下:$:cd /mnt/sda1
安裝Linux 0.11的方式是從github下載Cloud-Lab源碼到本地,并選擇linux-0.11-lab作為實驗環境:
$:git clone https://github.com/tinyclub/cloud-lab.git
$:cd cloud-lab
$:tools/docker/choose linux-0.11-lab
$:tools/deploy/run
該命令運行后,會輸出實驗環境登錄地址、noVNC鏈接的賬號(包括用戶名和密碼),有Normal和View兩種模式,如圖1所示。

圖1 實驗環境賬號
由上圖可以看到Cloud-Lab使用的端口是6080,192.168.99.100是default虛擬機的IP地址。Normal鏈接可以在多處登錄,登錄后便可以操作,也可以看到彼此的操作,但是由于登錄的是同一個桌面,多人同時操作時會相互干擾。使用View鏈接登錄時,只能觀看對應的Normal鏈接的實時操作,不能親自操作。兩種模式結合非常適用于教學,教師使用Normal鏈接做演示,學生登錄View鏈接學習。
如果要為用戶同時創建10個noVNC連接賬號,獨立實驗可以使用如下指令:$:tools/deploy/run linux-0.11-lab student 10。
另外還有一個很重要的指令,可以在出錯時清理實驗環境,保證實驗環境干凈:
$:tools/docker/clean-all
由于Docker的底層使用了LXC,其實它只能運行在Linux上,而在Windows系統下要運行Docker,實際上是在虛擬機下運行的。物理網絡中的計算機要訪問虛擬機還需要進入VirtualBox中,將default虛擬機的網絡做個端口映射。如圖2所示,選擇使用網絡地址轉換(NAT)模式的網卡1,新建一條端口轉發規則,將主機的6080端口映射給子系統的6080端口。

圖2 設置端口轉發
查看服務器的IP地址,將圖1輸出的登錄地址的虛擬機IP替換為服務器的IP,就可以進入Linux實驗環境了,如圖3所示實驗所用服務器的IP為192.168.31.14。

圖3 Linux在線實驗環境
在服務器上的default虛擬機里運行“docker ps”命令可以看到,本方法開啟了一個tinylab/cloud-ubuntu-web鏡像,并為每個noVNC鏈接的賬號開啟一個tinylab/linux-0.11-lab鏡像。所有登錄到服務器的終端數據都存放在虛擬機掛載的數據盤上,客戶端幾乎不消耗資源。
在實驗室機房進行了本方法的性能測試。機房安裝有80臺學生機、1臺服務器。服務器的配置為:cpu(型號E5-2609)、8個內核、8GB內存、1T硬盤、Windows Server 2008企業版64位操作系統。學生機瀏覽器版本為Chrome 8.0。所有計算機連接在4臺24口H3C千兆交換機上,型號為S1224R。所有交換機連接在1臺H3C路由器上,型號為S5120。
為虛擬機分配5G(5120MB)物理內存,4個內核。每當在服務器上新建一個賬號后,就在一臺學生機上登錄該賬號的Normal模式進入Lab,然后在Lab控制臺輸入如下內容:
$:sudo -s
$:(while true; do echo -n A >> log; sleep 1; done)
以上命令首先切換到root用戶,然后新建一個進程,不斷把字母“A”添加到~/log文件中去,模擬多個學生同時進行獨立實驗的一般情形。打開任務管理器,記錄下Lab數量對服務器性能的影響,實驗結果如表1所示。

表1 虛擬機分配5G內存時服務器性能與Lab個數關系表
實驗過程可以看出,虛擬機分配5 G內存時,最多能支持45個獨立實驗環境,多于此值時CPU處于繁忙狀態,實驗環境出現卡頓,掉線情況。在Lab個數為20~25之間的某一個值之前,物理內存消耗與Lab個數成線性關系。每個實驗環境大約需要200 MB內存。在那個值之后,內存消耗極少,主要是靠CPU處理缺頁中斷來保持Lab穩定工作。
另外,調整實驗中給虛擬機分配的物理內存,最多能夠支持的獨立實驗環境個數如表2所示。

表2 虛擬機內存與最多支持的Lab個數關系表
由此可見,在集中式服務器場景中,使用本文方法建立Linux在線實驗環境時,服務器的硬件資源需要根據實驗人數進行合理配置。
本文研究并實現了一種基于Docker的Linux在線實驗環境。該方法為Linux操作系統的學習提供了低成本高效率的實驗環境建設方案。學生沒有本地安裝實驗環境的必要,只需有個瀏覽器就足夠。離開了實驗室,學生也可以通過自己的筆記本或者臺式計算機遠程訪問實驗環境進行實驗,降低了學習的門檻,提高了學生動手學習的積極性。