天天看點

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

點選檢視第一章 點選檢視第三章

第2章

Linux虛拟化:建構Linux工作環境

本章内容提要

  • 發現正确的虛拟化技術
  • 使用Linux軟體倉庫管理器
  • 使用VirtualBox建構有效的環境
  • 使用LXC建構容器
  • 如何以及何時嚴密地管理虛拟機(VM)

虛拟化是最近幾乎所有服務和産品傳遞方式改進背後最重要的技術。這不僅使從雲計算到自主駕駛汽車的所有産業成為可能,也更引人注目。好奇嗎?你從一開始就需要了解關于虛拟化的兩個事實:

  • Linux在虛拟空間占據絕對的主導地位。
  • 虛拟化使得對任何技術的學習都變得更加簡單。

本章介紹目前使用的主流企業虛拟化技術。但更确切地講,本章也會使你能夠使用虛拟化環境,在那裡你可以安全地學習Linux管理技能。為什麼要在本書中這麼早地闡述如此複雜的技術呢?原因在于,這将讓你更加輕松地完成後續章節的學習。

需要一個新的、幹淨的作業系統(OS)來嘗試新的技術嗎?那就花一點時間建立一個吧。發生了讓你不能進入機器的配置錯誤嗎?沒問題。将其删除并重新啟動一個。沿着這條道路,你将學會如何使用Linux包管理器下載下傳、安裝并管理你需要的全部軟體(如VirtualBox和LXC)。

2.1 什麼是虛拟化

以前,當你想用一台新的伺服器為公司或公司客戶提供web伺服器或文檔共享服務時,你需要先進行研究、申請預算、協商、訂購、安全安裝和配置,之後啟動一個嶄新的計算機。從開始到結束的整個過程可能花費數月(請相信我—我曾經經曆過)。當增加的服務需求遠超過伺服器的能力時,你就要再次重複上述過程,并且希望最終能夠平衡能力與需求。

常見的情形是,公司常常會提供多個互相依賴的服務,并将其部署在分布式的硬體上。試想部署一個有後端資料庫的前端web伺服器。然而,當一切完成時,通常你會發現,一台伺服器未被充分利用而另一台伺服器(通常在機櫃中的一側)卻無法滿足要求。但是,再來設想你可以在多個服務之間安全地共享一台高性能伺服器的計算、記憶體、存儲和網絡資源。想象一下,通過在實體伺服器上建立多個僅需配置設定所需資源的虛拟伺服器執行個體,之後及時調整資源配置設定來滿足不斷變化的需求是多麼友善。

現在,設想能夠将一組運作多個作業系統的虛拟計算機有效地打包部署到一台裸機伺服器上,由此,絕對不會存在任何浪費。再設想一下,目前面的實體伺服器滿負載時,虛拟機(Virtual Machine,VM)将會被自動部署到後續的其他實體伺服器上。再來設想一下,殺死一個故障的或者需要更新的虛拟機是非常友善的,甚至快速地進行替代以緻使用者感覺不到任何變化。在你的腦海中已經出現這樣的情景了嗎(希望如此,類似于圖2-1所示的内容)?你正在設想的便是虛拟化(virtualization)。圖2-1非常具有吸引力,現在已經成為企業計算領域的主流。在這點上,我懷疑本地伺服器或基于雲的伺服器有許多負載剩餘,它們沒有運作在某種虛拟化技術上。而且,運作絕大多數虛拟負載的作業系統正是Linux。

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

順便說一下,亞馬遜Web服務(Amazon Web Service,AWS)允許客戶租用(Linux)伺服器上的服務能力,這些伺服器運作數百萬計的虛拟機,而這些虛拟機則運作着無數的負載,包括諸多最流行的線上服務。圖2-2給出了AWS彈性計算雲(Elastic Compute Cloud,EC2)執行個體如何作為各種存儲、資料庫和網絡化工具的服務樞紐。

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

如果還不清楚AWS的某些細節,請不要擔心,無論如何它都并非本書的主題。但如果你确實想學習關于亞馬遜Web服務的更多内容,可以閱讀我寫的《Learn Amazon Web Services in a Month of Lunches》一書(Manning出版社,2017年)。那關于虛拟化呢?請閱讀我寫的《Teach Yourself Linux Virtualization and High Availability》一書(LULU出版社,2017年)。

下一個簡短的章節可能會有些令人頭疼,但是它會為那些有興趣了解背景運作原理的讀者提供一些有用的資訊。成功的虛拟化在實體計算機上使用了可以安裝客體作業系統的某種隔離空間,并且客體作業系統誤以為是在自己的計算機上獨自存在。客體作業系統之間可以共享網絡連接配接,進而使其管理者都可以遠端登入(将在第3章讨論),并且像在傳統計算機上一樣正确地完成工作。這些統一的共享網絡連接配接允許你使用虛拟機來提供網站等公共服務。總體而言,目前有兩種虛拟化方法:

  • 管理程式(Hypervisor,也稱為虛拟機管理器)—在某種程度上控制宿主系統的硬體,為每個客戶作業系統提供所需的資源(如圖2-3所示)。客戶計算機以系統程序的形式運作,但是可以虛拟地通路硬體資源。例如,AWS伺服器早已建構在開源的Xen管理程式技術上(盡管他們近期開始将部分伺服器切換到同等開源的KVM平台)。其他同樣重要的管理程式平台還包括VMware ESXi、KVM和微軟的Hyper-V。
帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章
  • 容器(Containers)—非常輕量級的虛拟伺服器,它們并不以完整作業系統的方式運作,而是共享宿主作業系統的底層核心(如圖2-4所示)。容器可以由純文字的腳本來建構,在數秒時間内完成建立并啟動,并可以簡單又可靠地在網絡上進行共享。目前最有名的容器技術當屬Docker。本章中,我們将要使用的Linux容器(LXC)項目就來源于Docker最初的靈感。
帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

沒有一種技術可以适用于所有項目。但是,如果你決定學習本章的後續内容,你需要學習如何以及為何要使用兩種虛拟化技術:VirtualBox(一個II型虛拟機),以及我之前提及的LXC(一種容器管理器)。

設計注意事項

我可不想你在學完這本書的時候還沒有掌握選擇虛拟化技術的一些基本指導原則,是以這裡給出一些建議:

  • 像Xen和KVM這樣完整的虛拟機管理器(通過像Libvirt這樣的管理前端)通常用于企業級Linux虛拟機部署,涉及大量的Linux虛拟機。
  • VirtualBox(以及VMware Player)在采用現有作業系統進行測試和實驗是很好的,一次一個或兩個,且無須将其安裝到實際的計算機上。但它們相對較高的上限使得它們并不适合于大多數産品環境。
  • 像LXC和Docker這樣的容器技術是輕量級的,且可以在數秒内完成配置和啟動。LXC容器特别适合于運用新技術和安全地建構作業系統的軟體棧。Docker是目前運作無數動态的、內建的容器叢集的技術,它是大量微服務體系結構的一部分(我将在第9章深入讨論微服務)。

2.2 使用VirtualBox

用Oracle的開源軟體VirtualBox可以做很多事情。你可以将其安裝在任何作業系統(包括Windows)中,在桌上型電腦或筆記本電腦上運作,或者使用該軟體在幾乎所有的宿主作業系統上托管運作一組虛拟機執行個體。

在Windows計算機上安裝VirtualBox

想在Windows計算機上試驗該工具嗎?請前往VirtualBox的網站(

https://www.virtualbox.org/wiki/Downloads

)并下載下傳可執行檔案。點選已下載下傳的檔案,然後執行安裝步驟(預設值都應該有效)。安裝最終将會詢問你是否可以重置網絡接口,之後,是否想安裝VirtualBox。由你來操作。

VirtualBox提供了一個環境,你可以在其中啟動實體系統資源所能支援的盡可能多的虛拟機。同時,對于安全地測試和學習新的管理技能(這是目前我們的主要目标),它也是一個特别有用的工具。但在所有這些之前,你需要知道如何在Linux系統中下載下傳和安裝軟體。

2.2.1 使用Linux包管理器

将VirtualBox恰當地安裝在Ubuntu計算機上實際非常簡單。執行如下兩條指令:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

注意:請記住#提示符意味着該指令需要管理者權限,該權限通常通過在指令前加sudo來擷取。

然而,在我們的示例中會發生什麼呢?這一切都圍繞着名為進階軟體包工具(Advanced Package Tool,簡稱APT,通常稱為apt)的軟體包管理器。在Linux的世界裡,包管理器将計算機與成千上萬個軟體應用構成的大量線上軟體倉庫連接配接起來,這些軟體應用大都是免費和開源的。Linux中預設安裝的管理器具有如下一些功能:

  • 維護一個本地索引來跟蹤軟體倉庫及其内容;
  • 跟蹤安裝在本地機器上的所有軟體的狀态;
  • 確定所有可用的更新在已安裝的軟體上都已更新;
  • 確定在新的應用被安裝之前,軟體依賴性(即正在安裝的軟體包所需的其他軟體包和配置參數)是滿足的;
  • 處理安裝和解除安裝軟體包。

圖2-5說明了線上軟體倉庫及Linux計算機上運作的包管理器之間既有關系中的一些元素。

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

該系統運作得很好,出于曆史和市場原因,在Linux世界之外沒有什麼能比它更好了。但問題是,你使用的管理器将依賴于特定的Linux版本。總體而言,如果你的版本是Debian/Ubuntu系列,你需要使用APT。紅帽系列中的成員會使用RMP管理器及Yum(或者其新的替代品DNF)。表2-1給出了一個相關的版本清單。

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

除了使用包管理器從遠端軟體倉庫中安裝軟體,你可能還需要從網站下載下傳軟體。通常,你将會發現一旦使用後端工具從指令行安裝後,由開發人員格式化封裝的軟體包就可以使用APT或Yum了。也就是說,例如,你想要使用Skype。轉到其下載下傳頁(如圖2-6)将可以為Linux下載下傳一個DEB格式或RPM格式的Skype軟體包。如果你正在使用基于Debian的版本及APT,就應該選擇DEB格式,或者,如果你正在使用鐘愛Yum的紅帽系列,就應該選擇RPM。

使用Debian包管理器

一旦下載下傳了這個檔案,你就可以在指令行中使用dpkg來進行安裝。使用-i标志(表示安裝)。你将需要確定你正在skypeforlinux-64檔案所在的目錄中運作dpkg指令。以下示例假設你将軟體包儲存到了你的使用者賬戶下的Downloads目錄中:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

dpkg指令應該會為你處理依賴項。但如果不做處理,其輸出通常會提供足夠的資訊讓你了解目前發生了什麼。

“-64”是什麼?

與其他基于x86體系的作業系統一樣,Linux也存在64位和32位兩種版本。近10年來制造和銷售的大量計算機大都是更快的64位架構。因為仍然存在更老的或者面向開發的硬體,是以有時你需要運作32位的系統,而且你會想讓你安裝的軟體在這樣的系統上運作。

你可以通過在指令行運作arch指令來檢查系統版本。除非你知道你正在老舊的硬體上運作(順便說一下,Linux在舊硬體上也運作得非常好),你可以放心假設你是一名64位的使用者。

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

為RPM包管理器安裝VirtualBox

之前,我介紹了apt update和apt install virtualbox指令。那麼這些簡潔的指令到底完成了什麼工作?為了進行解釋,我将在運作Fedora Linux發行版的機器上安裝相同的VirtualBox軟體。因為我将使用紅帽的DNF包管理器,是以它會要求一些額外的步驟—這是件好事,執行這些步驟将說明這個過程如何運作。該過程部分有點複雜,是以表2-2列舉出了這些步驟。

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

注意:這些步驟是為Fedora 25版本設計并在其上進行測試的,很好地說明了包的管理過程。不過,在最近的Fedora版本中,這一切都可能更加流暢。

回到Ubuntu系統,當我将virtualbox添加到install指令時,APT明白我想做什麼。因為VirtualBox包在APT熟悉的線上軟體倉庫中。然而,紅帽及其衍生版本(如CentOS和Fedora)并非如此,至少不是立即可用的,是以,我将需要把virtualbox軟體倉庫添加到Yum中。

在前一章中,你将記住第三方軟體配置檔案通常儲存在/etc/目錄中,而且,yum/DNF在這方面也沒有什麼不同。軟體倉庫的資訊被儲存在/etc/yum.repos.d/目錄中,是以,你應該切換到這個目錄。在這個目錄中,你将使用wget程式(通常是預設安裝的)來下載下傳.repo檔案。以下是如何做到這一切的方法:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

在Linux上安裝軟體

安裝Linux軟體的具體方法,包括諸如較早前我使用的精确URL等細節,幾乎都可以在網上找到。你可以在軟體開發人員自己的網站上或免費提供的指南中找到這些資訊。網際網路是你的好朋友。

請確定在任何必要的搜尋引擎詞組中指定Linux版本、釋出版本以及體系結構(32位或64位)。我通過自己喜歡的搜尋引擎獲得本項目所需具體軟體包的細節—你也理應如此。

在你告訴RPM有什麼變化之前,将.repo檔案放到正确的目錄下并不會有太大的作用。你可以通過運作update指令來進行操作。update指令同時對本地軟體倉庫的索引及其線上版本進行對照檢查,以判斷是否存在你想要了解的任何新變化。無論你使用的是何種管理器,在安裝新的軟體之前更新repo資訊通常都是一個好主意:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

下一步是安裝VirtualBox正确運作所需的所有軟體依賴項。依賴項(dependency)是為了讓新的軟體包能夠運作而必須事先安裝的軟體。回到Ubuntu系統,APT無形地處理了這些重要的細節;Yum通常也會處理諸多的背景細節。但如果沒有處理,你就必須手動操作,如前所述,可以從相同的線上資源中擷取相關細節。這裡給出一個簡略版本,内容如下:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

這是一個稍微漫長的過程,但是你終于準備好在你的Red Hat、CentOS或Fedora機器上安裝VirtualBox了。本示例中我使用的版本号來自之前使用的線上指南。當然,在你嘗試這一方法的時候,它可能已經不再是5.1版本了:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章
帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

VirtualBox附加元件

你應該意識到Oracle為VirtualBox提供了一個擴充包,它為現有的啟動選項添加了諸如USB支援、硬碟加密等一些可選項。如果在運作标準包時遇到了死胡同,請考慮使用這些工具。

你也可以通過VBox客體系統擴充包的CD-ROM映像(VBox Guest Additions CD-ROM image)在VirtualBox虛拟機及它們的主控端之間增加額外的檔案系統和裝置內建。例如為你提供共享剪切闆和拖拽等功能。如果Vbox功能擴充包在你的主機上還不可用,那麼在Ubuntu系統上使用如下指令安裝擴充包:

sudo apt install virtualbox-guest-additions-iso

随後,将其作為虛拟光驅添加到正在運作的虛拟機中。請搜尋關于在宿主作業系統上運作所需要的任何附加軟體包的線上文檔。

在繼續實際使用VirtualBox這樣的虛拟化工具之前,我應該給你留下一兩個提示來尋找你可能需要的其他倉庫軟體包。APT系統允許你使用apt search指令搜尋可用的軟體包。以下示例搜尋那些可能有助于你監視系統健康狀态的軟體包,之後使用apt show指令顯示軟體包的完整資訊:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

安裝完成後,Aptitude程式是一個半圖形化的shell環境,你可以在其中探索和管理可用的和已經安裝的軟體包。如果你離不開滑鼠,那麼考慮Synaptic,它是一個用于桌面環境的全圖形化的軟體包管理器。而且,Yum世界也是完全可以搜尋的,如下所示:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

2.2.2 定義虛拟機

我不确定你曾經是否組裝過一台計算機,但可能會涉及。在VirtualBox中定義一台新虛拟機的工作方式與之相差不多。唯一顯著的差别在于,虛拟機不需要你用牙齒咬着手電筒然後跪在地上用手将RAM和存儲驅動器安裝到機箱中,而是讓你通過點選滑鼠的方式來定義虛拟機的“硬體”規格。

在VirtualBox界面中點選New(建立)按鈕之後,你可以給将要建立的虛拟機一個描述性名稱。如圖2-7所示,該軟體應該能自動地為Type(類型)和Version(版本)字段填寫正确的内容。這裡所選的Type和Version并不會安裝一個實際的作業系統,而是用于申請一些适當的硬體模拟設定。

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

在下一個界面中,你要給虛拟機配置設定RAM(記憶體)。除非你計劃做一些具有特殊要求的事情,如托管一個容器群或者運作一個重負載的Web伺服器,否則預設容量(768 MB)應該就可以了。如有必要,你當然可以配置設定更多的RAM,但不要忘了,要為宿主計算機及可能已經在其中運作的其他虛拟機留下足夠的空間。如果你的主控端隻有4 GB的實體RAM,你可能就不想将其中的一半配置設定給虛拟機了。

如果你最終決定要一次運作多個虛拟機就要注意這些限制,這對進行本書後續内容中的項目實驗将是有用的。即使每個虛拟機都僅使用預設的記憶體容量,兩三個虛拟機也可能會逐漸消耗掉主控端正常操作所需的RAM。

接下來,VirtualBox設定過程會詢問是否要為虛拟機建立新的虛拟硬碟或者使用已存在的虛拟硬碟(如圖2-8)。沒有硬碟驅動器的計算機會是什麼樣的?有時你可能希望在兩個虛拟機之間共享一個硬碟,但是對于這個練習,我猜你會希望從頭開始。選擇“Create a Virtual Hard Disk Now”(現在建立一個虛拟硬碟)。

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

下一個界面(如圖2-9所示)讓你選擇即将要建立的硬碟檔案類型格式。除非你正在計劃将該盤最終導出并用于其他虛拟環境,否則,預設的VirtualBox硬碟映像(VirtualBox Disk Image,VDI)格式就可以很好地工作。

我也從未後悔過使用預設的動态分區選項(如圖2-10所示)作為虛拟驅動器消耗主機硬碟空間的方式。這裡,動态(dynamic)意味着主機存儲盤上的空間将僅在需要時配置設定給虛拟機。如果虛拟機硬碟的使用率很低,那麼将會為其配置設定更少的主控端空間。

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章
帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

另一方面,無論實際使用多少空間,一個固定大小的虛拟硬碟都會被立即配置設定最大的空間容量。固定大小的唯一優勢是應用的性能。因為通常我隻使用VirtualBox虛拟機進行測試和實驗,是以我很好地避免了這種情況。

因為環境知道你運作的是Linux,并且Linux對存儲空間的利用非常高效,是以,VirtualBox在下一個界面中将可能隻提供總計8 GB的硬碟大小(如圖2-11所示)。除非你對虛拟機有着不尋常的大計劃(例如,你将處理一些複雜的資料庫操作),否則這應該是沒有問題的。另一方面,如果你已經選擇了Windows作業系統,那麼預設選項将會是

25 GB—這是有充分理由的:Windows并不羞于索取大量的資源。這也很好地說明,Linux非常适合于虛拟環境。

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

注意:如果你願意,你也可以在檔案位置和空間大小(FileLocation and Size)界面為VirtualBox設定名字及其在硬碟上的位置。

當完成這些工作後,點選Create(建立),建立的虛拟機将會出現在VirtualBox管理器左側的虛拟機清單中。但是,工作還沒有完成:這隻是一台虛拟機。現在,你需要一個作業系統賦予這台虛拟機生命。

2.2.3 安裝作業系統

現在你已經定義了建立虛拟機的虛拟硬體配置,以下是需要繼續完成的工作:

1.下載下傳一個包含所要使用的Linux發行版映像的檔案(ISO格式的);

2.使用包含下載下傳的ISO檔案的虛拟DVD裝置引導新的虛拟機;

3.執行标準的作業系統安裝過程;

4.引導虛拟機并啟動剛剛安裝的作業系統。

一旦确定了發行版,你就需要下載下傳一個包含作業系統檔案及安裝程式的.ISO檔案。查找合适的檔案通常就是用發行版本名和關鍵字下載下傳(download)在網際網路上進行搜尋。在使用Ubuntu的情況下,可以選擇前往首頁

https://ubuntu.com

page 并點選Downloads(下載下傳)頁籤,如圖2-12所示。請注意,Ubuntu存在多種版本。如果你打算用虛拟機來管理任務,那麼輕巧且快速的伺服器(Server)版本可能比桌面(Desktop)版本更好。

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

在下載下傳過程中,大檔案有時可能會出現損壞。即使.ISO檔案隻有一個位元組發生了改變,安裝也可能無法完成。因為你應該不會花費時間和精力來查找下載下傳中出現的問題,通常,快速計算出你所下載下傳的.ISO檔案的校驗和(或哈希,hash)來确認沒有發生任何改變會是一個更好的選擇。為此,你将需要擷取合适的SHA或MD5校驗和,這看上去就像如下形式的一個字元串:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

你應該能夠從擷取.ISO檔案的相同位置擷取到該字元串。在使用Ubuntu的情況下,可以前往首頁

http://releases.ubuntu.com/

,點選與所下載下傳作業系統版本相比對的目錄,之後,點選其中的一個連結來擷取校驗和(例如,SHA1SUMS)。你應該把從該首頁擷取的特定字元串與在.ISO下載下傳目錄中用指令計算出的結果進行比較,計算指令類似如

下形式:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

如果兩者比對,你下載下傳的作業系統就沒有問題。如果不比對(而且你已經再次确認版本是正确的),你可能就不得不再次下載下傳這個.ISO檔案。

注意:你應該知道有多種雜湊演算法。多年來,MD5SUM算法一直占主導地位,但SHA256(具有更長的256位哈希值)現在正變得越來越流行。實際上,對于大型作業系統映像檔案,哪種方法好還不一定呢。

一旦.ISO檔案準備就緒,請回到VirtualBox。在左側面闆中高亮顯示的新建立的虛拟機上,點選應用頂部綠色的Start(開始)按鈕。此時,将提示你從檔案系統中選擇一個.ISO檔案用作虛拟DVD驅動器。理所應當地,你會選擇你下載下傳好的檔案。新的虛拟機将讀取該DVD驅動器并啟動作業系統安裝。

安裝過程在大多數時間内都運作良好;然而,要闡述每個可能出錯的小問題的解決方案則會需要幾個完整的章節。如果你确實遇到了麻煩,可以查閱Linux發行版中的文檔及指南,或者将你的問題釋出在曼甯網站上的Linux in Action論壇,讓其他人來幫忙。

當每件事情都很好地完成後,在能夠成功引導虛拟機之前仍然會有一些事情需要考慮。高亮選中你的虛拟機,點選黃色的Settings(設定)圖示。在這裡,你可以對虛拟機的環境及硬體設定進行操作。例如,點選Network(網絡)可以定義網絡連接配接。如果你想讓虛拟機能夠通過主機的網絡接口完全接入網際網路,那麼,如圖2-13,你可以從Attached to下拉框中選擇橋接擴充卡(Bridged Adapter),進而選擇主機擴充卡的名字。

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

注意:使用橋接擴充卡可能并非總是你的首選,而且它有時可能會帶來安全風險。實際上,選擇NAT網絡(NAT Network)是為虛拟機提供網際網路接入的一個更為常見的方式。因為本書的很多練習實踐都要求在多個虛拟機之間進行網絡連接配接(使用NAT時更加複雜),是以現在我将使用橋接方法。

你可能永遠不需要如下這條資訊,但是如果你知道,你将會感到萬幸。在某些情況下,為了讓虛拟機以正确的方式進行引導啟動,你還需要将DVD從驅動器中移除,就像“真正的”實體安裝過程一樣。你可以點選Storage選項來進行操作。點選列出的第一個硬碟,随後點選底部的Remove Disk(删除硬碟)圖示(如圖2-14所示)。請一定要確定沒有意外删除掉你的硬碟!

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

你有時也會需要挂載一個DVD(或.ISO檔案)并讓VirtualBox識别它。選中Controller: IDE行後,點選 + 圖示來選擇一個檔案作為虛拟光驅。

2.2.4 克隆和共享VirtualBox虛拟機

本節是一點額外的收獲,誰不喜歡免費的東西呢?我将告訴你們兩個相關的技巧:如何組織VirtualBox虛拟機盡可能快地運作以及如何使用指令行在網絡上共享虛拟機。

克隆虛拟機以快速啟動

使用虛拟機最為明顯的優勢之一就是能夠快速通路一個新的、幹淨的作業系統環境。但是,如果通路這個環境需要經曆完整的安裝過程,那如果你不采用克隆的方法,我們也感受不到它有多快。為什麼不将原始虛拟機保持在安裝後的幹淨狀态,并在任何需要實際使用的時候建立一個相同的克隆呢?

這很簡單。再來看看VirtualBox的應用程式。選擇你想用作主副本的(停機的)虛拟機,點選Machine菜單項,之後點選Clone按鈕。你要給克隆的虛拟機設定名稱,接下來,在點選Next後,無論你是要建立一個完全克隆(表示将為建立虛拟機建立完整的新檔案副本)還是一個連結克隆(表示該建立虛拟機會共享主虛拟機的所有基礎檔案,但會獨立地開始你的新工作)。

注意:選擇Linked選項将會執行得非常快速,同時占用硬碟上更少的空間。唯一的缺點在于,之後你無法将這個特定的克隆移動到另一台計算機上。如何選擇取決于你。

現在,請點選Clone,在虛拟機面闆中将出現一個新的虛拟機。以正常的方式啟動該虛拟機,然後用主虛拟機上設定的認證資訊登入該虛拟機。

從指令行管理虛拟機

VirtualBox帶有其自己的指令行shell,可以用vboxmanage進行調用。為什麼要麻煩指令行呢?因為除了其他優點,指令行還允許你在遠端伺服器上工作,這可以大大增加可能項目的使用範圍。要想知道vboxmanage如何工作,請使用list vms來列出目前系統中所有可用的虛拟機:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

vboxmanage clonevm将完成之前我用圖形界面描述的相同類型的克隆操作。這裡,我要建立Kali Linux模闆虛拟機的一個克隆,并命名為newkali:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

你可以通過再次運作vboxmanage list vms來驗證它是否正常工作。

在本地計算機上使用這個新虛拟機的效果很好,它就會很好地工作。但是假設我希望團隊的其他成員能夠運作該虛拟機的一個精确副本,由此他們可以測試我正在做的一些事情。為此,我需要把該虛拟機轉換為某種标準的檔案格式。以下是我如何将一個本地虛拟機導出為一個使用開放虛拟化格式(Open Virtualization Format,OVF)檔案的操作:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

接下來,你需要将這個.OVA檔案拷貝到同僚的計算機上。請記住,從任何層次來說,該檔案都不會被認為是小巧的。如果你沒有剩餘的網絡帶寬來進行幾個GB的資料傳輸,那麼就考慮使用USB裝置來移動檔案。但如果你确實采用了網絡路由,完成這項工作的最佳工具就是安全拷貝工具(secure copy,scp)。以下是該工具的使用方式示例:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

如果整個scp指令的操作看上去有點晦澀,也請不要擔心:後續就會有幫助。scp指令将會被作為OpenSSH内容的一部分完全包括在第3章中。與此同時,僅當兩台計算機上都安裝了OpenSSH,以及你在遠端計算機上具有通路授權且從本地計算機可以通路到該遠端計算機時,scp指令才能工作。

當傳輸完成時,剩下的事情就是從遠端計算機将該虛拟機導入到該計算機的VirtualBox中。該指令非常簡單,如下:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

使用list vms指令來确認導入操作已經執行,接着從桌面嘗試啟動該虛拟機,指令如下:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

如果你不需要特别地遠端通路,你也可以用GUI來共享虛拟機。高亮顯示要共享的機器,點選VirtualBox中的File菜單,之後點選Export Appliance(導出裝置)。

2.3 使用Linux容器

要執行需要Linux核心通路的操作(就像使用SELinux這樣的安全産品一樣,具體請參見第9章),或者需要GUI桌面會話的時候,或者用于測試Windows這樣的作業系統時,VirtualBox都是非常好的。但是,如果你需要快速通路一個幹淨的Linux環境并且不尋求任何特定的發行版本,那麼,你将很難不選用LXC。

注意:類似于任何複雜系統,LXC并不能在所有的硬體體系結構上都良好地運作。如果你在啟動一個容器時遇到困難,請考慮出現相容性問題的可能。網際網路,應該一如既往地被求助作為更深層資訊的有益來源。

LXC容器會有多快?你将馬上親眼看到它會足夠快。但是,因為這些容器巧妙地在主控端和其他容器之間共享了很多系統資源,它們僅使用最小的存儲空間及記憶體,卻可以像全功能的獨立伺服器那樣運作。

2.3.1 LXC入門

要在你的Ubuntu工作站上安裝LXC嗎?這是輕而易舉的事情:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

如果是在CentOS上安裝呢?是的,依然非常簡單,但需要多做一點處理。在一定程度上是因為,Ubuntu是面向且基于Debian建構的。無論如何,請在CentOS上試一試這個方法,但我不保證一定能成功。首先,你将需要添加一個新的軟體倉庫,即企業版Linux附加軟體包(Extra Packages for Enterprise Linux,EPEL),随後,安裝LXC及一些依賴項,如下:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

就是這樣。你已經準備好着手處理業務了。基本的LXC技能集實際上是非常簡單的。我将向你展示三、四個需要讓其全部運作起來的指令,之後給出一個内部提示,即一旦你明白了LXC是如何組織其自身的,你會恍然大悟。

2.3.2 建立第一個容器

為什麼不立即行動建立你的第一個容器呢?-n參數的值設定了容器的名字,-t參數則告訴LXC使用Ubuntu模闆來建立容器,指令如下:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

注意:你可能會開始看到與相對較新的LXD容器管理器相關的另一組lxc指令的替代引用。LXD在背景仍然使用LXC工具,隻是其使用了一個稍有不同的接口。舉例說明,使用LXD之前的指令可能是這種形式:lxc launch ubuntu:16.04 myContainer。這兩個指令集都将被繼續廣泛地使用。

如你從/usr/share/lxc/templates/目錄清單中所看到的,确實存在相當數量的可用模闆,如下:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

警告:并不能保證所有這些模闆都立即可用。一些隻用于實驗,一些還在不斷完善中(works in progress)。在Ubuntu主機上堅持使用Ubuntu的模闆應該是一個更安全的選擇。正如我說的,出于曆史原因,LXC在Ubuntu主機上一直運作良好。當涉及其他發行版時,情況會有所不同。

也就是說,如果你決定要建立一個CentOS容器,那麼你就應該記下最後幾行的輸出内容,因為它包含了登入時要用到的密碼資訊:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章
帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

你将使用root使用者名及存放在tmp_root_pass檔案中的密碼進行登入。另一方面,如果你的容器使用了Ubuntu模闆,那麼你要使用ubuntu作為使用者名和密碼。當然,如果你計劃将該容器用于任何要求嚴格的事情,你會希望立即修改密碼,操作如下:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

順便說一下,該指令使用了縮寫passwd而非password。我猜passwd程式的設計者不喜歡打字吧。現在,使用lxc-ls --fancy指令檢查容器的狀态:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

很好,該容器已經存在了,但顯然它還需要啟動。如前所述,-n指定想要啟動的容器的名字。-d表示分離(detach),意味着你不希望在容器啟動時被自動放入一個互動式會話中。互動式會話并沒有什麼問題:實際上,我的一些好朋友就是互動的。但在這種情況下,運作沒有-d參數的lxc-start指令将意味着離開的唯一方法是關閉容器,這可能并非是你想要的:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

現在,列舉出你的容器應該會類似地顯示出如下資訊:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

這一次,容器正在運作且已經擷取到一個IP位址(10.0.3.142)。你可以用這個位址及一個安全的shell會話來登入,但要在閱讀第3章之後。現在,你可以使用lxc-attach在一個運作的容器中啟動一個root的shell會話,如下:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

你可能想花幾分鐘來看看相關的資訊。例如,ip addr将列出該容器的網絡接口。這種情況下,eth0接口被配置設定了一個IP位址10.0.3.142,其與較早前從lxc-ls --fancy擷取的IPV4值相符,詳細資訊如下:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

檢視完新容器後,你可以運作exit指令來登出,同時保持容器繼續運作,指令如下:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

或者使用shutdown -h now指令來關閉容器。但在該操作之前,讓我們先來看看LXC容器的速度有多快。之前我為shutdown添加的-h标志表示停機(halt)。如果我使用了r标志,容器不會關閉,而是重新開機。我們來運作reboot,之後再次立即登入,看看容器的恢複需要花費多長時間:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

情況如何?我打賭在你嘗試重新輸入lxc-attach指令的時候,myContainer容器已經喚醒并就緒。你是否知道在Bash中按下向上箭頭按鍵會在指令行中列出之前的指令?這種方式會讓登入請求變得相當快。在我的示例中,沒有明顯的時延。容器在小于2秒的時間内關閉并完全重新開機!

LXC容器在系統資源上運作也很輕松。不像我之前使用VirtualBox虛拟機的體驗,并發運作三個伺服器已經開始嚴重影響8 GB宿主工作站的性能,然而我可以啟動各種LXC容器,且速度不受影響。

你說的是什麼?我答應過你的内部提示呢?好極了。我可以看出你的專注。請回到主機上的終端(注意不是容器),你将需要用sudo su打開一個管理者shell。由此開始直至輸入exit,你将一直處于sudo狀态:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

現在,切換到/var/lib/lxc/目錄并列舉出其内容。你會看到一個以容器命名的目錄,如下所示。如果你在系統中還有其他容器,它們也會擁有自己的目錄:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

切換到你的容器目錄并列出其内容。目錄下有一個名為config的檔案及一個名為rootfs的目錄(fs表示檔案系統):

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

請随意浏覽一下config檔案:容器基礎環境的值在這裡被設定。一旦你對LXC的工作方式有了一些了解,你可能會希望使用該檔案來調整容器的運作方式。但是,我真正想要說明的是rootfs目錄,如下:

帶你讀《Linux實戰》之二:Linux虛拟化:建構Linux工作環境第2章

rootfs目錄下的所有子目錄看上去熟悉嗎?它們都是Linux檔案系統層級标準(Filesystem Hierarchy Standard,FHS)的一部分。這是容器的根目錄(/),但包含于主機的檔案系統中。隻要你擁有主機的管理者權限,你就可以浏覽這些目錄并編輯任何檔案—即使是在容器沒有運作的時候。

你可以用這種通路方式做各種各樣的事情,但這裡有一種方法,它可能在某一天挽救你(職業)生涯。假設你把自己鎖在一個容器外。通過這種方式沒有什麼可以阻擋你操縱檔案系統,修複你搞砸的配置檔案,并重新開始工作。來吧,告訴我這并不酷。但它确實變得更好了。

的确,自從Docker的生态系統在幾年前從LXC的陰影中走出來後,他已經獲得了許多層次的特性和複雜性。然而,在底層,它依然建立在一個基礎結構範式上,任何熟悉LXC的人都能夠立即識别它。這意味着,如果你傾向于使用十年來發展最快的虛拟化技術來試水,那麼你已經在競争中占有一席之地了。

2.4 小結

  • 像VirtualBox這樣的虛拟機管理器提供了虛拟作業系統這樣能夠安全通路硬體資源的環境,而輕量級的容器則共享了它們主機上的軟體核心。
  • 像APT和RPM(Yum)這樣的Linux軟體包管理器使用一個定期更新的索引反應遠端軟體倉庫的狀态,進而由托管的線上軟體倉庫監督軟體的安裝與管理。
  • 在VirtualBox中運作一個虛拟機需要定義其虛拟硬體環境,下載下傳一個作業系統映像并在虛拟機上安裝該作業系統。
  • 你可以從指令行簡單地克隆、共享并管理VirtualBox虛拟機。
  • LXC容器的建構需要預先聲明并指定發行版模闆。
  • LXC資料存儲在主機檔案系統中,這使得容器的管理更加友善。

主要名詞

  • 虛拟化(Virtualization)是計算、存儲、網絡資源在多個程序之間的邏輯分享,允許每個程序像在獨立的實體計算機上運作。

- 虛拟機管理器(hypervisor)是一個運作在主機上的軟體,它将系統資源暴露給某個層次的一個客戶機,允許啟動和管理全棧式的客戶虛拟機。

  • 容器(container)是存在于主控端核心作業系統核心上的一個非全棧式虛拟機。由于其主要面向短期需要,容器的啟動和銷毀非常容易。
  • VirtualBox中動态配置設定(dynamically allocated)的虛拟驅動器隻會在實體驅動器上占用虛拟機實際需要的空間。而固定大小(fixed-size)的驅動器則會占用最大數量的空間,無論實際需要多少。
  • 軟體倉庫(software repository)是一個可以存儲數字資源的位置。倉庫對于軟體包的協作和配置設定都特别有用。

安全最佳實踐

  • 允許一個官方的包管理器在你的Linux系統上安裝和維護軟體是優先于手動操作的方式。線上的軟體倉庫更為安全,同時,下載下傳過程是恰當加密的。
  • 要經常掃描對比已下載下傳檔案的校驗和哈希值與正确的哈希值,這不僅因為軟體包在下載下傳過程中可能損壞,也因為它們有時會被中間人攻擊者修改。

指令行回顧

  • apt install virtualbox指令使用APT從遠端軟體倉庫安裝一個軟體包。
  • dpkg -i skypeforlinux-64.deb指令在Ubuntu機器上直接安裝一個下載下傳的Debian軟體包。
  • wget https://example.com/document-to-download 指令使用wget指令程式下載下傳檔案。
  • dnf update、yum update或apt update指令用線上軟體倉庫中的索引資訊同步本地軟體索引。
  • shasum ubuntu-16.04.2-server-amd64.iso指令計算已下載下傳檔案的校驗和,以确認其值與所提供的值相符。這意味着檔案的内容在傳輸中沒有損壞。
  • vboxmanage clonevm Kali-Linux-template --name newkali指令使用vboxmanage工具克隆一個已存在的虛拟機。
  • lxc-start -d -n myContainer指令啟動一個已存在的LXC容器。
  • ip addr指令顯示系統各個網絡接口上的資訊(包括它們的IP位址)。
  • exit指令離開shell會話而不關閉虛拟機。

自測題

1.容器和虛拟機管理器共享了如下哪一種特性?

a.它們都允許虛拟機在宿主作業系統上獨立運作。
b.它們都依賴于主控端的核心,以進行基礎操作。
c.它們都允許非常輕量級的虛拟機。
d.它們都允許極為高效地使用硬體資源。
           

2.如下哪項不是Linux軟體包管理器的功能?

a.用遠端軟體倉庫同步本地索引。
b.掃描已安裝軟體中的惡意軟體。
c.對已安裝的軟體進行更新。
d.確定所有的軟體包依賴項都已安裝。
           

3.在Ubuntu系統上,你将使用如下哪個指令來直接安裝下載下傳的軟體包?

a. dpkg -i
b. dnf --install
c. apt install
d. yum -i
           

4.在VirtualBox上建立一個虛拟機時,要先進行哪個步驟?

a.選擇一個硬碟檔案類型。
b.在動态配置設定和固定大小之間進行選擇。
c.從驅動器中移除虛拟DVD。
d.配置網絡接口。
           

5.作業系統映像可以使用如下哪種格式?

a. VDI
b. VMI
c. ISO
d. VMDK
           

6.如下哪條指令可以将一個虛拟機儲存到.OVA格式的檔案中?

a. vboxmanage export
b. vboxmanage clonevm
c. vboxmanage import
d. vboxmanage clone-ova
           

7.如下LXC指令行标志中,哪一個啟動容器且不自動打開一個新的shell會話?

a. lxc-start –t
b. lxc-start –a
c. lxc-start –d
d. lxc-start –n
           

8.預設地,如下哪一個目錄中可以找到容器的檔案系統?

a. /usr/share/lxc/
b. /etc/share/lxc/
c. /usr/lib/lxc/
d. /var/lib/lxc/           

答案

1.d 2.b 3.a 4.a 5.c 6.a 7.c 8.d

繼續閱讀