《KVM實戰:原理、進階與性能調優》學習筆記
Qemu 命令
[root@foundation0 ~]# qemu-img create -f raw rhel7.img 40G
Formatting 'rhel7.img', fmt=raw size=42949672960
上述就是用qemu-img create命令創建了一個空白的guest image,以raw格式,image文件的名字是“rhel7.img”,大小是40G。雖然我們看到它的大小是40G,但是它並不占用任何磁盤空間。
[root@foundation0 ~]# du -sh rhel7.img
0 rhel7.img
啟動客戶機,並在其中用准備好的ISO安裝系統,命令行如下:
qemu-system-x86_64 -enable-kvm -m 8G -smp 4 -boot once=d -cdrom RHEL-7.2-20151030.0-Server-x86_64-dvd1.iso rhel7.img
其中,-m 8G是給客戶機分配8G內存,-smp 4是指定客戶機為對稱多處理器結構並分配4個CPU,-boot once=d是指定系統的啟動順序為首次光驅,以后再使用默認啟動項(硬盤)[1],-cdrom**是分配客戶機的光驅。默認情況下,QEMU會啟動一個VNC server端口(5900),可以用vncviwer工具[2]來連接到QEMU的VNC端口查看客戶機。
libvirt 簡介
提到KVM的管理工具,首先不得不介紹的就是大名鼎鼎的libvirt,因為libvirt是目前使用最為廣泛的對KVM虛擬機進行管理的工具和應用程序接口,而且一些常用的虛擬機管理工具(如virsh、virt-install、virt-manager等)和雲計算框架平台(如OpenStack、ZStack、OpenNebula、Eucalyptus等)都在底層使用libvirt的應用程序接口。
libvirt支持多種虛擬化方案,既支持包括KVM、QEMU、Xen、VMware、VirtualBox、Hyper-V等在內的平台虛擬化方案,也支持OpenVZ、LXC等Linux容器虛擬化系統,還支持用戶態Linux(UML)的虛擬化。
libvirt對多種不同的Hypervisor的支持是通過一種基於驅動程序的架構來實現的。libvirt對不同的Hypervisor提供了不同的驅動:對Xen有Xen的驅動,對QEMU/KVM有QEMU驅動,對VMware有VMware驅動。在libvirt源代碼中,可以很容易找到qemu_driver.c、xen_driver.c、xenapi_driver.c、VMware_driver.c、vbox_driver.c這樣的驅動程序源代碼文件。
libvirt作為中間適配層,可以讓底層Hypervisor對上層用戶空間的管理工具是完全透明的,因為libvirt屏蔽了底層各種Hypervisor的細節,為上層管理工具提供了一個統一的、較穩定的接口(API)。通過libvirt,一些用戶空間管理工具可以管理各種不同的Hypervisor和上面運行的客戶機,它們之間基本的交互框架如圖:
比如,在example.com節點上運行了libvirtd,而且允許SSH訪問,在遠程的某台管理機器上就可以用如下的命令行來連接到example.com上,從而管理其上的域。
virsh -c qemu+ssh://root@example.com/system
以RHEL 7.3為例,libvirt相關的配置文件都在/etc/libvirt/目錄之中,如下:
[root@foundation0 ~]# ll /etc/libvirt/
total 72
-rw-r--r--. 1 root root 450 Jun 21 2017 libvirt-admin.conf
-rw-r--r--. 1 root root 547 Jun 21 2017 libvirt.conf
-rw-r--r--. 1 root root 15786 Jun 21 2017 libvirtd.conf
-rw-r--r--. 1 root root 1175 Jun 21 2017 lxc.conf
drwx------. 2 root root 4096 Nov 9 18:10 nwfilter
drwx------. 4 root root 197 Nov 9 18:12 qemu
-rw-r--r--. 1 root root 26773 Jun 21 2017 qemu.conf
-rw-r--r--. 1 root root 2169 Jun 21 2017 qemu-lockd.conf
drwxr-xr-x. 3 root root 42 Nov 28 11:18 storage
-rw-r--r--. 1 root root 2134 Jun 21 2017 virtlockd.conf
-rw-r--r--. 1 root root 1997 Jun 21 2017 virtlogd.conf
libvirt.conf 文件用於配置一些常用libvirt連接(通常是遠程連接)的別名。
libvirtd.conf 是libvirt的守護進程libvirtd的配置文件,被修改后需要讓libvirtd重新加載配置文件(或重啟libvirtd)才會生效。
qemu.conf 是libvirt對QEMU的驅動的配置文件,包括VNC、SPICE等,以及連接它們時采用的權限認證方式的配置,也包括內存大頁、SELinux、Cgroups等相關配置。
qemu 目錄下存放的是使用QEMU驅動的域的配置文件。
在默認情況下,libvirtd在監聽一個本地的Unix domain socket,而沒有監聽基於網絡的TCP/IP socket,需要使用“-l或--listen”的命令行參數來開啟對libvirtd.conf配置文件中TCP/IP socket的配置。另外,libvirtd守護進程的啟動或停止,並不會直接影響正在運行中的客戶機。libvirtd在啟動或重啟完成時,只要客戶機的XML配置文件是存在的,libvirtd會自動加載這些客戶的配置,獲取它們的信息。當然,如果客戶機沒有基於libvirt格式的XML文件來運行(例如直接使用qemu命令行來啟動的客戶機),libvirtd則不能自動發現它。
Unix Domain Socket是網絡socket的優化,適用於服務端與客戶端在同一台機器上的情況。相比網絡socket,它可以提高通信效率。
libvirt 的 Python API 的使用
在4.1.1節中已經介紹過,許多種編程語言都提供了libvirt的綁定。Python作為一種在Linux上比較流行的編程語言,也提供了libvirt API的綁定。在使用Python調用libvirt之前,需要安裝libvirt-python軟件包,或者自行編譯和安裝libvirt及其Python API。
virsh 常用命令
virsh這個命令行工具使用libvirt API實現了很多命令來管理Hypervisor、節點和域,實現了qemu命令行中的大多數參數和QEMU monitor中的多數命令[1]。這里只能說,virsh實現了對QEMU/KVM中的大多數而不是全部功能的調用,這是和開發模式及流程相關的,libvirt中實現的功能和最新的QEMU/KVM中的功能相比有一定的滯后性。一般來說,一個功能都是先在QEMU/KVM代碼中實現,然后再修改libvirt的代碼來實現的,最后由virsh這樣的用戶空間工具添加相應的命令接口去調用libvirt來實現。當然,除了QEMU/KVM以外,libvirt和virsh還實現了對Xen、VMware等其他Hypervisor的支持,如果考慮到這個因素,virsh等工具中有部分功能也可能是QEMU/KVM中本身就沒有實現的。
從 console 中退出虛擬機:
快捷鍵: ctrl+]
徹底刪除虛擬機
#解除標記
virsh undefine 虛擬機名稱
然后刪除虛擬機存儲所在的位置
宿主機和 Hypervisor 的管理命令
一旦建立有特權的連接,virsh也可以對宿主機和Hypervisor進行管理,主要是對宿主機和Hypervisor信息的查詢。
網絡的管理命令
virsh可以對節點上的網絡接口和分配給域的虛擬網絡進行管理。
查看宿主機的網卡配置:
[root@foundation0 ~]# virsh iface-list
Name State MAC Address
---------------------------------------------------
br0 active 00:0c:29:72:8d:d1
lo active 00:00:00:00:00:00
[root@foundation0 ~]# virsh iface-edit br0
<interface type='bridge' name='br0'>
<start mode='onboot'/>
<protocol family='ipv4'>
<ip address='172.25.254.250' prefix='24'/>
<ip address='172.25.0.250' prefix='24'/>
</protocol>
<bridge stp='off' delay='0'>
<interface type='ethernet' name='ens33'>
</interface>
</bridge>
</interface>
存儲池和存儲卷的管理命令
virsh也可以對節點上的存儲池和存儲卷進行管理。