朱小軍
(南京航空航天大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,江蘇 南京 211106)
操作系統(tǒng)課程一般分為原理課程和實(shí)踐課程兩部分,在筆者所在高校這兩部分是同步開(kāi)展的。但學(xué)生的反饋一般是“理論簡(jiǎn)單,實(shí)驗(yàn)難”。原因在于,實(shí)驗(yàn)涉及大量的軟硬件交互,一方面需要用匯編語(yǔ)言管理硬件,同時(shí)要用高級(jí)語(yǔ)言給上層應(yīng)用提供支撐。雖然“難”,但是學(xué)生在堅(jiān)持完成后獲得了收獲和成長(zhǎng),因此,“難”是不可或缺的[1]。作為任課教師,我們希望盡力為學(xué)生減少不必要的、與核心知識(shí)點(diǎn)相關(guān)性較弱的負(fù)擔(dān)。在教學(xué)實(shí)踐中,“配置實(shí)驗(yàn)環(huán)境”給學(xué)生帶來(lái)了不小的麻煩。如何在經(jīng)費(fèi)有限的前提下,搭建一個(gè)既方便學(xué)生修改調(diào)試內(nèi)核,又能夠?yàn)榻處熍某绦蛱峁┲蔚牟僮飨到y(tǒng)實(shí)驗(yàn)平臺(tái),十分必要。
操作系統(tǒng)實(shí)驗(yàn),尤其是內(nèi)核實(shí)驗(yàn),需要特殊的運(yùn)行環(huán)境。筆者提出了一套基于xv6 的內(nèi)核實(shí)驗(yàn)[1]。由于編譯工具鏈的原因,這套實(shí)驗(yàn)依賴Ubuntu 操作系統(tǒng),并且編譯完成的xv6 內(nèi)核需要在QEMU(一個(gè)虛擬機(jī))上運(yùn)行。如果電腦是Windows 操作系統(tǒng),則需要首先創(chuàng)建一個(gè)虛擬機(jī),在虛擬機(jī)上安裝Ubuntu 操作系統(tǒng),整個(gè)運(yùn)行環(huán)境如圖 1 所示。
在教學(xué)中嘗試多種實(shí)驗(yàn)教學(xué)平臺(tái)搭建方案,遇到一些困難。
圖1 教學(xué)實(shí)踐中xv6 操作系統(tǒng)通常的運(yùn)行環(huán)境
機(jī)房中的機(jī)器預(yù)裝了Ubuntu 系統(tǒng),事先配置了xv6 操作系統(tǒng)的編譯、運(yùn)行環(huán)境,學(xué)生開(kāi)機(jī)即可使用。遺憾的是,自從開(kāi)展xv6 內(nèi)核實(shí)驗(yàn)以來(lái),這種方案是學(xué)生采納最少的方案。原因在于xv6 內(nèi)核實(shí)驗(yàn)任務(wù)較重,需要長(zhǎng)時(shí)間的思考與調(diào)試,而機(jī)房的位置以及開(kāi)放時(shí)間存在極大局限性。當(dāng)同時(shí)提供該方案和以下方案給學(xué)生時(shí),幾乎沒(méi)有學(xué)生選擇此方案完成實(shí)驗(yàn)任務(wù)。
目前,大多數(shù)學(xué)生都配備有個(gè)人電腦,可以讓學(xué)生在自己的電腦上配置如圖 1 所示的運(yùn)行環(huán)境。為了避免工具鏈上的差異,教師可以發(fā)布虛擬機(jī)映像給學(xué)生,要求學(xué)生安裝、運(yùn)行規(guī)定的虛擬機(jī)映像。清華大學(xué)向勇、陳渝老師的操作系統(tǒng)公開(kāi)課采用了類似方案[2]。筆者在2016 年、2017年春季學(xué)期使用了這個(gè)方案,但在教學(xué)過(guò)程中遇到了以下問(wèn)題:①部分學(xué)生的機(jī)器性能較弱,無(wú)法流暢運(yùn)行虛擬機(jī)。尤其對(duì)于上網(wǎng)本,在其上安裝虛擬機(jī)會(huì)有較高時(shí)延,影響學(xué)生做實(shí)驗(yàn)的積極性。有一部分學(xué)生最終選擇了借用同學(xué)的筆記本做實(shí)驗(yàn),一方面無(wú)法保證開(kāi)展實(shí)驗(yàn)的時(shí)間,另一方面也對(duì)教師評(píng)定成績(jī)?cè)斐闪擞绊憽"诮處煙o(wú)法實(shí)時(shí)跟蹤學(xué)生進(jìn)展,即較難統(tǒng)計(jì)學(xué)生在各個(gè)實(shí)驗(yàn)中所花費(fèi)的時(shí)間,而這點(diǎn)對(duì)于改進(jìn)實(shí)驗(yàn)課程至關(guān)重要。
Cloud9 是一個(gè)免費(fèi)的云服務(wù)提供商,用戶可以創(chuàng)建虛擬主機(jī)(只支持Ubuntu 操作系統(tǒng)),然后通過(guò)網(wǎng)頁(yè)瀏覽器訪問(wèn)虛擬主機(jī)。其方便之處在于用戶可以在瀏覽器中直接編輯、調(diào)試、運(yùn)行虛擬主機(jī)上的程序。雖然偶爾網(wǎng)速較慢、一些特殊時(shí)期網(wǎng)頁(yè)無(wú)法打開(kāi),但最終學(xué)生均順利完成了任務(wù),反饋良好。遺憾的是,該平臺(tái)已被亞馬遜收購(gòu),自2019 年起無(wú)法使用。
在2018 年春季,經(jīng)學(xué)生的推薦,采用Cloud9(https://c9.io)作為實(shí)驗(yàn)平臺(tái)。在一個(gè)學(xué)期的使用過(guò)程中,筆者發(fā)現(xiàn)了使用云服務(wù)器的便捷之處,為本文的方案提供了基礎(chǔ)。
部分美國(guó)高校,如威廉瑪麗學(xué)院、紐約州立大學(xué)賓漢姆頓大學(xué),為學(xué)生提供了超級(jí)計(jì)算機(jī)賬號(hào),其操作方式類似于云服務(wù)器,相當(dāng)于每個(gè)學(xué)生擁有一臺(tái)位于學(xué)院/系的、可遠(yuǎn)程操作的計(jì)算機(jī)。當(dāng)然,這個(gè)賬號(hào)并非是針對(duì)某個(gè)課程而分配的。除了學(xué)習(xí)以外,學(xué)生完成科研任務(wù)也是用此賬號(hào)。采用這種方案完成操作系統(tǒng)實(shí)驗(yàn)的主要優(yōu)點(diǎn)包括:①學(xué)生可以使用低配置的設(shè)備登錄超級(jí)計(jì)算機(jī);②教師同樣有超級(jí)計(jì)算機(jī)的賬號(hào),通過(guò)一定的權(quán)限設(shè)置,可以方便發(fā)布實(shí)驗(yàn)任務(wù),同時(shí)收集學(xué)生的內(nèi)核實(shí)驗(yàn)信息。
國(guó)內(nèi)部分高校使用自有硬件搭建了用于教學(xué)的私有云平臺(tái)[3],南京航空航天大學(xué)目前正在搭建類似平臺(tái),同時(shí)用于教學(xué)和科研。目前,這種平臺(tái)的硬件、維護(hù)成本較高,距離大規(guī)模推廣需要一定時(shí)間。
綜合以上方案,搭建基于公有云的實(shí)驗(yàn)平臺(tái),并在2019 年春季學(xué)期進(jìn)行試點(diǎn),得到了學(xué)生的積極響應(yīng)和大量正面反饋。
目前國(guó)內(nèi)的公有云平臺(tái)包括阿里云、騰訊云、京東云等。由于經(jīng)費(fèi)不足,可以選取騰訊云,使用2 核、2GB 內(nèi)存、50G 硬盤(pán)、1Mbps 寬帶、預(yù)裝Ubuntu 的云服務(wù)器一臺(tái)(價(jià)格為3 年¥3 060,2019 年11 月27 日查詢)。學(xué)生和教師訪問(wèn)和修改同一臺(tái)云服務(wù)器,通過(guò)適當(dāng)?shù)脑O(shè)置限制學(xué)生賬號(hào)的權(quán)限。以下命令和腳本在Ubuntu 16.04.1 LTS 上測(cè)試成功,關(guān)于命令和腳本的詳細(xì)介紹參見(jiàn)專業(yè)書(shū)籍[4]。
教師為云服務(wù)器的管理員,是Ubuntu 系統(tǒng)的超級(jí)用戶,可以訪問(wèn)系統(tǒng)中的所有資源,可以直接使用騰訊云提供的默認(rèn)超級(jí)用戶(用戶名為:Ubuntu)。
教師需要配置實(shí)驗(yàn)環(huán)境,包括安裝編譯工具鏈和虛擬機(jī)QEMU。配置環(huán)境方法等同于配置單獨(dú)一臺(tái)機(jī)器的方法。這個(gè)實(shí)驗(yàn)環(huán)境由教師和學(xué)生共享,而且學(xué)生賬號(hào)無(wú)法升級(jí)、更新工具鏈,可以避免出現(xiàn)學(xué)生的程序教師無(wú)法運(yùn)行的情況。
教師需要?jiǎng)?chuàng)建學(xué)生賬號(hào),學(xué)生賬號(hào)的權(quán)限需要特殊設(shè)計(jì)。
(1)學(xué)生賬號(hào)可以有ssh 的權(quán)限。
(2)學(xué)生賬號(hào)只可以在自己的用戶目錄下創(chuàng)建文件,不可以讀寫(xiě)其他學(xué)生用戶目錄下的內(nèi)容。
(3)學(xué)生賬號(hào)的shell 為bash(默認(rèn)為/bin/dash,不支持自動(dòng)命令補(bǔ)全)。
在Ubuntu 系統(tǒng)下,創(chuàng)建滿足以上條件的學(xué)生用戶Alice 的步驟如下。
(1)修改/etc/skel/.profile 文件中的umask 為027,即,用戶新創(chuàng)建的文件,同組用戶不可寫(xiě)、其他用戶不可讀不可寫(xiě)不可執(zhí)行。
(2)執(zhí)行命令useradd -m -s/bin/bash -K UMASK=027 Alice。其含義是,創(chuàng)建用戶Alice,同時(shí)創(chuàng)建其用戶目錄(-m 選項(xiàng)指明)、用戶目錄的權(quán)限減去027(-K UMASK=027 指明)、用戶的shell 為/bin/bash(-s/bin/bash 指明)。經(jīng)過(guò)測(cè)試,如果不加上-K UMASK=027,則創(chuàng)建的Alice 的用戶目錄權(quán)限為“drwxr-xr-x”,即A 學(xué)生可以進(jìn)入B 學(xué)生的目錄,雖然不可以創(chuàng)建文件或者讀文件(由于步驟1 改了umask),但是A 學(xué)生依然可以看到B 學(xué)生添加了哪些文件。使用步驟2 的命令后,用戶目錄權(quán)限為“drwxr-x---”,A 學(xué)生無(wú)法讀取或者進(jìn)入B 學(xué)生的目錄。創(chuàng)建的用戶默認(rèn)擁有ssh 權(quán)限。
(3)執(zhí)行命令 echo -e “Alice Alice”|passwd Alice。其含義是,修改Alice 用戶的默認(rèn)密碼為Alice。選項(xiàng)“-e”的含義是將字符串中的“ ”進(jìn)行解釋,即換行。之所以采用這種寫(xiě)法是為了便于編寫(xiě)腳本。
創(chuàng)建學(xué)生用戶的shell 腳本如下:
其中學(xué)生用戶名存放在同目錄下的stulist 文件中,并且每行存儲(chǔ)一個(gè)用戶名。執(zhí)行“sudo su”后(即在root 用戶下)運(yùn)行此腳本。
每個(gè)實(shí)驗(yàn)在發(fā)布時(shí)包括兩部分,一部分是文字要求,一部分為基礎(chǔ)要求。學(xué)生需要按照文字要求在基礎(chǔ)代碼上加以改進(jìn)達(dá)到實(shí)驗(yàn)?zāi)康?。文字要求可以通過(guò)網(wǎng)頁(yè)發(fā)布。相對(duì)而言,如果基礎(chǔ)代碼通過(guò)網(wǎng)頁(yè)發(fā)布,則學(xué)生需要下載代碼到本地、上傳代碼到云服務(wù)器、解壓代碼,造成不必要的麻煩。
為此,將基礎(chǔ)代碼直接放置在云服務(wù)器上,設(shè)置為學(xué)生可讀但不可寫(xiě)。例如,可以將基礎(chǔ)代碼目錄命名為proj0-base,放置在/home 目錄下,設(shè)置該目錄的其他用戶權(quán)限為“r-x”,即其他用戶可讀、不可寫(xiě)、可執(zhí)行,對(duì)proj0-base 目錄下的所有文件的其他用戶權(quán)限設(shè)置為“r--”,即可讀、不可寫(xiě)、不可執(zhí)行。如此,學(xué)生在命令行執(zhí)行命令cp -r/home/proj0-base .即可將基礎(chǔ)代碼復(fù)制到本地目錄下。
學(xué)生在完成實(shí)驗(yàn)后,需要在截止日期前提交作業(yè)。通常的方法是搭建ftp 服務(wù)器讓學(xué)生上傳作業(yè),在截止日期后關(guān)閉ftp 服務(wù)器;或者讓學(xué)生發(fā)送郵件提交作業(yè),利用郵件發(fā)送時(shí)間過(guò)濾超期的作業(yè)。這兩種方法都有一個(gè)缺陷,即教師需要花費(fèi)精力維護(hù)ftp 服務(wù)器,或者提取郵件的附件。
可以使用另外一種簡(jiǎn)單的方案,讓學(xué)生將作業(yè)放在自己用戶目錄下的指定文件夾內(nèi),例如,每個(gè)學(xué)生將proj0 需要提交的代碼和文件放置到用戶目錄的submit-proj0 文件夾下。教師設(shè)置一個(gè)定時(shí)任務(wù),在截止日期時(shí)將此目錄的擁有者改為root,這樣,學(xué)生在截止日期后便不可以向該目錄添加任何內(nèi)容(因?yàn)槲募趧?chuàng)建時(shí)的umask為027,即其他用戶不可讀不可寫(xiě)不可執(zhí)行,當(dāng)擁有者被修改后,原擁有者相對(duì)于文件而言變?yōu)槠渌脩簦?。將以下腳本保存在chown.sh 文件中:
然后,以root 身份執(zhí)行命令
at -f chown.sh 23:59 032119
即可在2019 年3 月21 日23 點(diǎn)59 分執(zhí)行腳本文件chown.sh。此后,教師可以通過(guò)腳本將所有學(xué)生提交的作業(yè)集中到某個(gè)文件夾下供批閱。
學(xué)生拿到賬號(hào)后,可以通過(guò)ssh 命令登錄到服務(wù)器編寫(xiě)程序,但這樣只能使用nano、vim 等命令行編輯器,對(duì)學(xué)生而言有困難。相對(duì)而言,學(xué)生更熟悉Sublime Text 以及VS Code 等工具。測(cè)試發(fā)現(xiàn)這些工具通過(guò)恰當(dāng)?shù)呐渲?,均可以連接到課程的服務(wù)器。具體配置方式參見(jiàn)各工具的網(wǎng)站。
學(xué)生在調(diào)試和運(yùn)行內(nèi)核時(shí),依然需要從命令行通過(guò)ssh 命令登錄到課程服務(wù)器。筆者建議學(xué)生通過(guò)公鑰的方式登錄服務(wù)器,避免重復(fù)輸入密碼。具體如下:①在本地客戶端(如git bash),執(zhí)行命令 ssh-keygen 生成一對(duì)密鑰;②在命令行執(zhí)行 ssh-copy-id Alice@202.119.32.6 的方式將本地公鑰添加到服務(wù)器端,這里假設(shè)用戶名為Alice,課程服務(wù)器為202.119.32.6.
此后,用戶登錄服務(wù)器無(wú)需輸入密碼。
當(dāng)服務(wù)器無(wú)域名或者域名不容易記憶時(shí),可以通過(guò)設(shè)置ssh 的config 文件縮短服務(wù)器名稱,具體操作方式如下:
打開(kāi)ssh 客戶端,進(jìn)入到~/.ssh 目錄下,創(chuàng)建一個(gè)名為config 的文件,輸入以下內(nèi)容:
其中,關(guān)鍵字Host 后的uos 即為別名,HostName 關(guān)鍵字指明、服務(wù)器地址,Port 關(guān)鍵字指明端口號(hào),默認(rèn)為22,User 關(guān)鍵字指明用戶名,IdentityFile 關(guān)鍵字指明公鑰文件。
設(shè)置完成后,學(xué)生只需在命令行輸入 ssh uos,即可登錄到課程服務(wù)器。
筆者在2019 年春季學(xué)期在南航計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院軟件培優(yōu)班進(jìn)行了試點(diǎn),獲得了學(xué)生的積極反饋。
學(xué)生對(duì)云服務(wù)器的使用充滿了興趣,一方面給教學(xué)方案提供了寶貴的意見(jiàn),如2.4 節(jié)的方法是在學(xué)生提出意見(jiàn)后筆者改進(jìn)的方案;另一方面,學(xué)生可以隨時(shí)使用各種設(shè)備登錄課程服務(wù)器,學(xué)生在課堂上使用小型平板電腦調(diào)試程序,驗(yàn)證理論課的概念。事實(shí)上,安卓與蘋(píng)果手機(jī)均有ssh 客戶端軟件,可以遠(yuǎn)程訪問(wèn)服務(wù)器。筆者采用的方案做到了讓學(xué)生能夠隨時(shí)隨地訪問(wèn)課程服務(wù)器,隨時(shí)隨地做實(shí)驗(yàn)。課程結(jié)束后,部分學(xué)生自行采購(gòu)了云服務(wù)器,從一定程度上推動(dòng)了學(xué)生對(duì)云計(jì)算的了解。
教師可以順利復(fù)現(xiàn)學(xué)生的結(jié)果,此外,發(fā)布實(shí)驗(yàn)和收集學(xué)生作業(yè)更方便?;谠摲桨?,教師可以全面了解學(xué)生的實(shí)驗(yàn)進(jìn)展。例如,可以統(tǒng)計(jì)實(shí)驗(yàn)從發(fā)布到截止期間學(xué)生的登錄情況。圖2 所示為某一次實(shí)驗(yàn)的登錄狀況。
圖2 某次實(shí)驗(yàn)從發(fā)布到截止學(xué)生登錄服務(wù)器的狀況
可以看到,雖然留給學(xué)生2 周時(shí)間,但大部分學(xué)生從最后一周才開(kāi)始登錄服務(wù)器做實(shí)驗(yàn)(課程班共有20 位學(xué)生)。事后分析,應(yīng)該是筆者強(qiáng)調(diào)每個(gè)實(shí)驗(yàn)至少需要一周的時(shí)間完成,所以學(xué)生恰好留了一周時(shí)間做實(shí)驗(yàn)。
應(yīng)當(dāng)指出,并不建議將學(xué)生的工作時(shí)間或者登錄次數(shù)與最終成績(jī)關(guān)聯(lián)。掌握學(xué)生的編程時(shí)間或登錄次數(shù)可以從一定程度反應(yīng)實(shí)驗(yàn)的難度和工作量,從而可以動(dòng)態(tài)調(diào)節(jié)截止日期或?qū)嶒?yàn)的難度,例如在課堂講授中給與提示。
在公有云上搭建操作系統(tǒng)實(shí)驗(yàn)平臺(tái)的方案,具有快速部署、成本低的優(yōu)點(diǎn)。云服務(wù)器的租賃價(jià)格約為每年1 000 元,可以流暢支持20 人的教學(xué)班。學(xué)生可以通過(guò)支持ssh 的任意智能終端(如筆記本、平板電腦、上網(wǎng)本等)隨時(shí)隨地登錄課程服務(wù)器,編寫(xiě)、調(diào)試內(nèi)核程序。教師可以通過(guò)簡(jiǎn)單的腳本統(tǒng)計(jì)學(xué)生工作時(shí)間以便動(dòng)態(tài)調(diào)整實(shí)驗(yàn)難度和內(nèi)容。筆者在2019 年春季學(xué)期在包含20人的班級(jí)試點(diǎn)了該方案,受到了學(xué)生的普遍歡迎和積極評(píng)價(jià)。
該方案還有一些欠缺之處。筆者并未在更大規(guī)模的班級(jí)做測(cè)試,不確定單臺(tái)云服務(wù)器能夠支持的學(xué)生數(shù)的極限。此外,目前學(xué)生提交的程序由教師和助教人工測(cè)試,如何進(jìn)行自動(dòng)化測(cè)試甚至實(shí)時(shí)反饋給學(xué)生成績(jī)是一個(gè)很有價(jià)值且值得探索的方向。