1. 程式人生 > >雲端計算之路-虛擬化環境搭建及虛擬機器建立

雲端計算之路-虛擬化環境搭建及虛擬機器建立

1. 前言

在計算機技術中,虛擬化(Virtualization)是一種資源管理技術,它將計算機相關的各種資源(CPU、記憶體、磁碟、網路介面卡等)進行抽象、轉換後重新分配使用,大大增加了使用的靈活性。虛擬化有很多類別,包括硬體虛擬化、作業系統級虛擬化、應用虛擬化、服務虛擬化等。本文中所討論的虛擬化環境指硬體虛擬化環境,即通過使用虛擬機器監視器(Virtual Machine Monitor),隱藏底層硬體資訊,虛擬出通用的計算環境(即虛擬機器)。虛擬機器中執行的作業系統稱為客戶機作業系統(Guest OS),虛擬機器監視器(Virtual Machine Monitor)所在的作業系統成為宿主機作業系統(Host OS)。

當前硬體虛擬化技術有很多實現,包括VMware ESXi、XEN、QEMU/KVM、Microsoft Hyper-V、VirtualBox等。其中,QEMU/KVM由於KVM程式碼簡潔,複用了Linux Kernel中的CPU和記憶體排程等功能,進入了Linux Kernel主幹,因此最受歡迎。在筆者撰寫此文時,AWS剛剛宣佈放棄XEN,改用KVM作為其虛擬化引擎。本文在此也主要介紹QEMU/KVM虛擬化環境的搭建。

QEMU(Quick Emulator)是最早由Fabrice Bellard所編寫的硬體虛擬化軟體,通過對指令進行動態翻譯來實現虛擬化;同時,還支援模擬多種裝置。儘管QEMU的動態指令翻譯已經做得很好了,然而還是不可避免的存在效能損失,而KVM和硬體輔助虛擬化技術解決了該問題。KVM(Kernel-based Virtual Machine)是Linux Kernel中的一個模組,它藉助CPU的虛擬化特性,實現客戶機和宿主機執行狀態的切換。有了KVM,QEMU只需要負責模擬其他硬體,CPU和記憶體的虛擬化藉助KVM即可完成,大大提高了虛擬化的效能。

2. 虛擬化環境安裝

2.1 宿主機作業系統安裝

本文選用CentOS 7 X86_64位版本作為宿主機作業系統進行安裝和部署。從下載其發行版的ISO檔案(初學者建議下載Everything ISO,其中包含了所需的所有軟體包,省去了安裝時聯網下載過程)。宿主機作業系統建議安裝在硬體(PC或者伺服器)之上,若沒有硬體環境,可在VMware Workstation中進行安裝。在安裝過程中“軟體選擇”時,請勾選“虛擬化主機”中的“虛擬化平臺”、“GNOME桌面”中的“GNOME應用程式”與“傳統X Windows系統的相容性”,如圖所示:

圖 1 宿主機作業系統安裝(1)

圖 2 宿主機作業系統安裝(2)

若在安裝過程中沒有建立新的系統使用者,則在首次進入GNOME圖形介面後會要求建立,待建立使用者之後,即可開始使用。

2.1.1 QEMU/KVM安裝

	由於KVM是Linux Kernel的一個模組,因此在系統安裝好後,KVM也安裝完成;同時,對於KVM的版本號,由於KVM隨著Linux Kernel一起釋出,所謂KVM的版本就是Linux Kernel的版本。
	因為前文在系統安裝時選擇了“虛擬化平臺”選項,因此QEMU也已經自動被安裝。若讀者需要在已有的CentOS系統中安裝QEMU,可以使用以下命令手動安裝(其他不同發行版的Linux作業系統,安裝命令會有所不同):

	[[email protected] ~]$ sudo yum install qemu-kvm
	要檢驗是否已經安裝QEMU,可以使用rpm命令查詢,如下圖所示:
	[[email protected] ~]$ sudo rpm -qa | grep qemu 
	ipxe-roms-qemu-20170123-1.git4e85b27.el7.noarch 
	libvirt-daemon-driver-qemu-3.2.0-14.el7.x86_64 
	qemu-img-1.5.3-141.el7.x86_64 
	qemu-kvm-1.5.3-141.el7.x86_64 
	qemu-kvm-common-1.5.3-141.el7.x86_64 
	qemu-guest-agent-2.8.0-2.el7.x86_64

2.1.2 virt-viewer安裝

	在啟動虛擬機器之後,可以使用遠端桌面連線軟體來交付虛擬機器桌面。由於QEMU支援基於VNC和Spice的交付方式,這裡使用支援上述兩種交付模式的virt-viewer包中的remote-viewer程式作為連線的客戶端。
	使用如下命令安裝virt-viewer即可。
	[lingyuecloud[email protected] ~]$ sudo yum install virt-viewer

3. 建立虛擬機器

3.1 映象準備

建議初學者使用現有映象來建立虛擬機器,待熟悉之後再手動製作映象。現有映象可以從OpenStack官方網站上下載,推薦下載CirrOS映象,其是體積非常小的Linux映象,非常適合用於測試場景。

3.2 啟動虛擬機器

3.2.1 使用QEMU命令啟動虛擬機器

	通過QEMU啟動虛擬機器的命令如下:
	[[email protected] ~]$ /usr/libexec/qemu-kvm -hda cirros-0.3.5-x86_64-disk.img -m 256 -boot c -vnc :0
	Could not access KVM kernel module: No
	such file or directory
	failed to initialize KVM: No such file ordirectory
	Back to tcg accelerator.
	其中,後面三行列印日誌是說當前環境下的KVM支援未啟用,將採用指令翻譯模式執行。針對該問題,若要啟用KVM支援,則需要結合宿主主機作業系統所在的環境進行考慮:(1)若宿主機作業系統直接安裝在物理硬體之上,則需要在BIOS中設定開啟虛擬化支援;(2)若宿主機作業系統安裝在VMware Workstation中,需要在VMware環境設定的“處理器設定”選項中勾選“虛擬化 Intel VT-x/EPT 或 AMD-V/RVI(V)”選項。
	啟動命令中各引數含義如下:
	Ø  “/usr/libexec/qemu-kvm”:QEMU二進位制可執行檔案完整路徑;
	Ø  “-hdacirros-0.3.5-x86_64-disk.img”:使用下載的cirros映象作為第1塊虛擬硬碟;
	Ø  “-m 256”:記憶體設定為256MB;
	Ø  “-boot c”:設定為首先從硬碟啟動;
	Ø  “-vnc :0”:在埠0(連線的時候使用5900)上開啟vnc服務;
	虛擬機器執行之後,即可使用remote-viewer進行連線。在本地Linux環境下在shell中執行“remote-viewer”命令,然後輸入連線地址“vnc://127.0.0.1:5900”即可連線到虛擬機器,如圖所示:

圖 3 使用remote-viewer連線虛擬機器(1)

圖 4 使用remote-viewer連線虛擬機器(2)

若要關閉虛擬機器,可在虛擬機器視窗中執行關機命令,或在執行QEMU命令的Shell視窗執行“Ctrl+C”命令(注意:此操作結束QEMU命令相當於對PC進行斷電操作,會丟失Guest OS中未及時儲存的資料)即可。

3.2.2 使用libvirt啟動虛擬機器

libvirt是為了更方便地管理虛擬化平臺而設計的開源應用程式介面、守護程序和管理工具,不僅提供了對虛擬化客戶機的管理,也提供了對虛擬化網路和儲存的管理。libvirt支援多種底層虛擬化技術,遮蔽了底層細節,使得對虛擬機器的管理更加方便。

預設情況下,CentOS並未安裝libvirt,讀者可使用如下命令進行安裝:

[[email protected] ~]$ sudo yum install libvirt

安裝完成後,可使用如下命令檢視libvirt版本。本文撰寫時,CentOS官方libvirt已經更新到3.2.0版本。

[[email protected] ~]$ virsh --version

3.2.0

libvirt通過xml檔案來對虛擬機器的配置進行管理,在啟動虛擬機器之前,我們首先需要建立一個xml檔案,內容如下所示。其中紅色的註釋,簡單解釋了xml各個欄位的含義。

<domain type='kvm'> <!--這裡的’kvm’表示使用kvm加速,也可以填’qemu’,則虛擬機器是qemu全模擬的-->

<name>lingyuecloud</name> <!--虛擬機器名字,使用者自己定義-->

<os>

<type arch='x86_64' machine='pc'>hvm</type> <!--虛擬機器架構以及型別,如果要建立32位虛擬機器,這裡可以將x86_64改成i686 -->

<boot dev='hd'/> <!--此項表示首先從硬碟啟動,如果需要首先從CDROM啟動,使用者可以在前面加上<boot dev=’cdrom’> -->

</os>

<features> <!--定義一些需要傳給虛擬機器的VCPU的特性-->

<acpi/>

    <apic/>

  </features>

  <memory unit='KiB'>262144</memory> <!--虛擬機器記憶體規格-->

  <vcpu>1</vcpu> <!--虛擬機器VCPU數量-->

  <clock offset='utc'> <!--設定虛擬機器的時鐘,不同時鐘之間的區別可以參考核心文件Timekeeping Virtualization for X86-Based Architectures -->

    <timer name='pit' tickpolicy='delay'/>

    <timer name='rtc' tickpolicy='catchup'/>

    <timer name='hpet' present='no'/>

  </clock>

  <on_poweroff>destroy</on_poweroff>  <!--設定虛擬機器內部poweroff的時候,libvirt的動作為destroy -->

  <on_reboot>restart</on_reboot> <!--設定虛擬機器內部reboot的時候,libvirt的動作為restart -->

  <on_crash>destroy</on_crash> <!--設定虛擬機器內部crash的時候,libvirt的動作為destroy;此項對debug很有用,debug時設定此項為pause,可以在虛擬機器內部crash的時候,libvirt使得虛擬機器暫停,此時開發人員可以將虛擬機器記憶體dump出來進行分析 -->

  <devices> <!-- device標籤下都是定義要呈現給虛擬機器的各種裝置-->

    <emulator>/usr/libexec/qemu-kvm</emulator> <!-- QEMU二進位制檔案的完整路徑-->

    <disk type='file' device='disk'> <!--定義一塊磁碟-->

      <driver name='qemu' type='qcow2' cache='none'/> <!--磁碟型別以及cache設定-->

      <source file='/home/lingyuecloud/cirros-0.3.5-x86_64-disk.img'/>

      <target dev='vda' bus='virtio'/> <!-- vda表示硬碟裝置名,或者說碟符,每個硬碟一個,不能重複,後續依次為vdb、vdc等,bus表示裝置型別,如果是virtio,系統必須有virtio驅動;若系統沒有virtio驅動則可以改成ide型別;-->

    </disk>

    <controller type='ide' index='0'/>

    <controller type='usb' index='0'/>

    <input type='tablet' bus='usb'/> <!--鍵盤,此處為USB型別-->

    <input type='mouse' bus='ps2'/> <!--滑鼠,此處為PS2型別-->

    <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0' keymap='en-us'/> <!-- vnc設定,通常port設定為-1,libvirt會自動分配port -->

    <video> <!--顯示設定-->

      <model type='cirrus' vram='32768' heads='1'/>

    </video>

  </devices>

</domain>

利用libvirt xml檔案,通過virsh命令即可實現對虛擬機器的生命週期管理。其中,virsh有兩種使用方式:(1)在virsh命令後直接跟相關子命令和引數來;(2)在輸入virsh命令並敲擊回車進入virsh環境後,再輸入相關子命令和引數。本文使用virsh後緊跟子命令的用法。

利用virsh建立虛擬機器的步驟包括define和start兩個步驟。(1)依據建立的虛擬機器配置檔案,使用“virsh define 虛擬機器配置檔案.xml”命令定義後的該虛擬機器就在libvirt的管理之下了;即使libvirt服務重啟或者宿主機系統重啟,define過的虛擬機器依然存在。define之後虛擬機器不會啟動;使用“virsh list”命令檢視虛擬機器列表時,該虛擬機器預設不顯示,需要加“--all”引數。(2)虛擬機器define之後,使用“virsh start 虛擬機器名”命令來啟動,上述過程如下所示:

[[email protected] ~]$ virsh define cirros-0.3.5-x86_64-disk.xml

定義域lingyuecloud(從cirros-0.3.5-x86_64-disk.xml)

[[email protected] ~]$ virsh list

 Id   名稱                        狀態

----------------------------------------------------

[[email protected] ~]$ virsh list --all

 Id   名稱                        狀態

----------------------------------------------------

 -     lingyuecloud         關閉

[[email protected] ~]$ virsh start lingyuecloud

域lingyuecloud已開始

[[email protected] ~]$ virsh list

 Id   名稱                        狀態

----------------------------------------------------

 1     lingyuecloud          running

[[email protected] ~]$ virsh domdisplay lingyuecloud

vnc://localhost:1

之後,可使用“virsh domdisplay”命令來檢視虛擬機器vnc的連線埠,根據返回的埠號,可使用remote-viewer連線地址“vnc://127.0.0.1:5901”即可連線到該虛擬機器。

若要關閉虛擬機器,可執行“virsh shutdown 虛擬機器名”命令(傳送關機訊號到Guest OS中)或者“virsh destroy 虛擬機器名”命令(強制關閉虛擬機器,可能造成資料丟失)。其他libvirt命令讀者可執行“virsh help”進行查閱。

3.2.3 使用virt-manager啟動虛擬機器

virt-manager是一個圖形化的虛擬機器管理工具,相比命令列,virt-manager操作更加直觀且不容易出錯。CentOS系統預設沒有安裝virt-manager,使用者需要使用以下命令來安裝:

[[email protected] ~]$ sudo yum install virt-manager

安裝完成後,在shell中執行命令“sudo virt-manager”來開啟virt-manager的圖形介面,然後點選“檔案”->“新建虛擬機器”即可建立新的虛擬機器。建立之前,先將下載的CirrOS映象複製一份,建立過程中,選擇“匯入現有磁碟印象(E)”,然後瀏覽選擇到複製的CirrOS映象,其他選項預設即可,如圖所示:

圖 5 新建虛擬機器(1)

圖 6 新建虛擬機器(2)

虛擬機器執行後,virt-manager會自動連線到虛擬機器的控制檯,使用者可以看到虛擬機器啟動過程並進行操作。在控制檯介面上,點選“檢視”->“詳情”還可檢視和編輯虛擬機器的詳細配置(部分配置需要關機後才能修改、部分配置編輯後需要重啟生效),如圖所示:

圖 7 編輯虛擬機器配置

4. 總結

本文介紹了簡易的虛擬化環境的安裝搭建以及虛擬機器的建立過程。總體上講,不論是QEMU命令操作、libvirt命令操作還是利用virt-manager圖形化管理工具,對虛擬機器的管理都略顯複雜,尤其涉及到更多功能操作時如網路虛擬化、儲存虛擬化、虛擬機器連線認證等更是難以管理。針對上述問題,可考慮採用雲端計算平臺管理工具進行統一管理,其更加高效、簡潔,相關討論將持續更新,敬請關注。

本文轉載於 靈躍雲:原文連結