雲計算之路-虛擬化環境搭建及虛擬機創建
轉載自 靈躍雲 :原文鏈接
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操作系統,安裝命令會有所不同):
[lingyuecloud@lingyuecloud ~]$ sudo yum install qemu-kvm 要檢驗是否已經安裝QEMU,可以使用rpm命令查詢,如下圖所示: [lingyuecloud@lingyuecloud ~]$ 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@lingyuecloud ~]$ sudo yum install virt-viewer
3. 創建虛擬機
3.1 鏡像準備
靈躍桌面雲建議初學者使用現有鏡像來創建虛擬機,待熟悉之後再手動制作鏡像。現有鏡像可以從OpenStack官方網站上下載,推薦下載CirrOS鏡像,其是體積非常小的Linux鏡像,非常適合用於測試場景。
3.2 啟動虛擬機
3.2.1 使用QEMU命令啟動虛擬機
通過QEMU啟動虛擬機的命令如下:
[lingyuecloud@lingyuecloud ~]$ /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,讀者可使用如下命令進行安裝:
[lingyuecloud@lingyuecloud ~]$ sudo yum install libvirt |
安裝完成後,可使用如下命令查看libvirt版本。本文撰寫時,CentOS官方libvirt已經更新到3.2.0版本。
[lingyuecloud@lingyuecloud ~]$ 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 虛擬機名”命令來啟動,上述過程如下所示:
[lingyuecloud@lingyuecloud ~]$ virsh define cirros-0.3.5-x86_64-disk.xml 定義域lingyuecloud(從cirros-0.3.5-x86_64-disk.xml)
[lingyuecloud@lingyuecloud ~]$ virsh list Id 名稱 狀態 ----------------------------------------------------
[lingyuecloud@lingyuecloud ~]$ virsh list --all Id 名稱 狀態 ---------------------------------------------------- - lingyuecloud 關閉
[lingyuecloud@lingyuecloud ~]$ virsh start lingyuecloud 域lingyuecloud已開始
[lingyuecloud@lingyuecloud ~]$ virsh list Id 名稱 狀態 ---------------------------------------------------- 1 lingyuecloud running
[lingyuecloud@lingyuecloud ~]$ 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,用戶需要使用以下命令來安裝:
[lingyuecloud@lingyuecloud ~]$ 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圖形化管理工具,對虛擬機的管理都略顯復雜,尤其涉及到更多功能操作時如網絡虛擬化、存儲虛擬化、虛擬機連接認證等更是難以管理。針對上述問題,靈躍桌面雲建議采用雲計算平臺管理工具進行統一管理,其更加高效、簡潔,相關討論將持續更新,敬請關註。
雲計算之路-虛擬化環境搭建及虛擬機創建