A. virsh命令和調用libvirt api有什麼區別
libvirt是用來管理虛擬機或虛擬化功能的軟體集合,主要包括:libvirt API,libvirtd進程和virsh工具集三部分。最初的目的是為不同的hypervisor提供統一的管理介面。
The goal of libvirt: to provide a common and stable layer sufficient to securely manage domains on a node, possibly remote。
1. Libvirt API
不同版本的API具體參見:http://libvirt.org/hvsupport.html,主要為不同的虛擬化技術方案對外提供統一的介面,其設計思想為:
(1)isolation from HV API changes - 隔離底層硬體虛擬化介面對上層的影響
(2)portable across HV - 支持多種os,如linux,windows,solairs等
(3)rapid application development - 提供封裝的API,加快軟體開發的過程
(4)TLS, SASL, SSH, PolicyKit - 提供各種加密協議,保證了上層應用對下層資源的安全訪問
通過封裝最原始的C庫,實現了多種編程語言的介面:Perl, python, OCaml, Java, Ruby,C#, Php,並對目前在應用層編程中常用的協議進行封裝,形成不同的協議庫,方便在應用層編程中調用,目前主要支持:
(1)Mapping to CIM/DMTF: libvirt-cim
公共信息模型CIM,是一個與具體實現無關的、用於描述管理信息的概念性模型。
(2)Mapping to AMQP/QMF: libvirt-qmf
AMQP是一個提供統一消息服務的應用層標准協議,是一種二進制協議,提供客戶端應用與消息中間件之間非同步、安全、高效地交互。
基於此協議的客戶端與消息中間件可傳遞消息,並不受客戶端/中間件不同產品,不同開發語言等條件的限制。
(3)Mapping to SNMP: libvirt-snmp
該庫使得libvirt具備SNMP的功能,開發人員能夠通過SNMP來監控和設置每個node上不同domain的信息
(4)Mapping to GObject: libvirt-glib
2. daemon進程(libvirtd )
該後台進程主要實現以下功能:
(1)遠程代理
所有remote client發送來的命令,由該進程監測執行
(2)本地環境初始化
libvirt服務的啟停,用戶connection的響應等
(3)根據環境注冊各種Driver(qemu, xen, storage…)的實現
不同虛擬化技術以Driver的形式實現,由於libvirt對外提供的是統一的介面,所以各個Driver就是實現這些介面, 即將Driver注冊到libvirt中
3. virsh 工具集
即將libvirt API封裝,以Command Line Interface提供的對外介面。
4. libvirt層次體系結構
為了便於理解,將libvirt分為三個層次結構,具體參見下圖。
參照上圖,來理一下通過virsh命令或介面創建虛擬機實例的代碼執行路徑:
(1)virsh命令或API介面c創建虛擬機 -- 介面層
virsh create vm.xml 或者 virDomainPtr virDomainCreateXML (virConnectPtr conn, const char * xmlDesc, unsigned int flags)
(2)調用libvirt提供的統一介面 -- 抽象驅動層
conn->driver->domainCreateXML(conn, xmlDesc, flags); //此處的domainCreateXML即抽象的統一介面,這里並不需要關心底層的driver是kvm,還是xen
(3)調用底層的相應虛擬化技術的介面 -- 具體驅動層
domainCreateXML = qemuDomainCreateXML; //如果driver=qemu,那麼此處即調用的qemu注冊到抽象驅動層上的函數qemuDomainCreateXML
(4)拼裝shell命令,並執行
以qemu為例,qemuDomainCreateXML首先會拼裝一條創建虛擬機的命令,比如qemu -hda disk.img,然後創建一個新的線程來執行
回過頭來思考,libvirt通過4步,將最底層的直接在shell中輸入命令來完成的操作進行了抽象封裝,給應用程序開發人員提供了統一的,易用的介面。
5. 抽象驅動層
目前,libvirt以下幾種類型的抽象驅動,每一種類型的驅動代表某以功能模塊的抽象封裝:
(1)虛擬化驅動(virDriverPtr)
(2)虛擬網路驅動(virNetworkDriverPtr)
(3)物理網卡驅(virInterfaceDriverPtr)
(4)存儲驅動(virStorageDriverPtr)
(5)監控驅動(virDeviceMonitorPtr)
(6)安全驅動(virSecretDriverPtr)
(7)過濾驅動(virNWFilterDriverPtr)
(8)狀態驅動(virStateDriverPtr)
B. openstack的虛擬化技術有個kvm,什麼是kvm什麼qemu,libvirt
在所謂的kvm技術中,應用到的其實有2個東西:qemu+kvm
kvm負責cpu虛擬化+內存虛擬化,實現了cpu和內存的虛擬化,但kvm不能模擬其他設備;
qemu是模擬IO設備(網卡,磁碟),kvm加上qemu之後就能實現真正意義上伺服器虛擬化。
因為用到了上面兩個東西,所以一般都稱之為qemu-kvm。
libvirt則是調用kvm虛擬化技術的介面用於管理的,用libvirt管理方便,直接用qemu-kvm的介面太繁瑣
C. 如何使用KVM libvirt命令管理虛擬機
在Ubuntu系統上安裝KVM組件服務
使用如下命令:
$ sudo apt-get install kvm qemu
$ sudo apt-get install virtinst python-libvirt virt-viewer virt-manager
安裝橋接網卡
$ sudo apt-get install bridge-utils
使用qemu命令創建虛擬機的虛擬磁碟文件
使用如下命令創建一個10G的磁碟空間用於安裝和允許虛擬機
$qemu-img create -f qcow2 lion.disk 10G
創建虛擬機Domain配置文件用於創建虛擬機實例
使用vim命令創建lionServer.xml配置文件,輸入如下內容:
<domain type='kvm' id='1'>
<name>lion</name>
<memory unit='KiB'>1048576</memory>
<currentMemory unit='KiB'>1048576</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64' machine='pc-i440fx-xenial'>hvm</type>
<boot dev='cdrom'/>
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/home/hxb/image/lion.disk'/>
<backingStore/>
<target dev='vda' bus='virtio'/>
<alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</disk>
<disk type='file' device='cdrom'>
<source file='/home/hxb/iso/ubuntu.iso' />
<target dev='hdb' bus='ide'/>
</disk>
<controller type='usb' index='0'>
<alias name='usb'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pci-root'>
<alias name='pci.0'/>
</controller>
<controller type='ide' index='0'>
<alias name='ide'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<interface type='network'>
<mac address='52:54:00:7d:4d:d1'/>
<source network='br1' bridge='virbr1'/>
<target dev='vnet0'/>
<model type='virtio'/>
<alias name='net0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<serial type='pty'>
<source path='/dev/pts/3'/>
<target port='0'/>
<alias name='serial0'/>
</serial>
<console type='pty' tty='/dev/pts/3'>
<source path='/dev/pts/3'/>
<target type='serial' port='0'/>
<alias name='serial0'/>
</console>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='vnc' port='5900' autoport='yes' listen='0.0.0.0'>
<listen type='address' address='0.0.0.0'/>
</graphics>
<sound model='ich6'>
<alias name='sound0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</sound>
<video>
<model type='cirrus' vram='16384' heads='1'/>
<alias name='video0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<memballoon model='virtio'>
<alias name='balloon0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</memballoon>
</devices>
<seclabel type='dynamic' model='apparmor' relabel='yes'>
<label>libvirt-d828c766-9826-99a9-f495-67a3a55a5643</label>
<imagelabel>libvirt-d828c766-9826-99a9-f495-67a3a55a5643</imagelabel>
</seclabel>
</domain>
使用virsh命令創建新的虛擬機實例
使用如下命令:
定義虛擬機domain,
$virsh define lionServer.xml
啟動虛擬機lion
$virsh start lion
顯示系統中的虛擬機列表
$virsh list
在創建的虛擬機實例lion上安裝操作系統
打開VirtualManager工具,打開虛擬機管理工具,選擇lion虛擬機進行連接。
連接虛擬機lion成功後,進行系統的安裝。
完成虛擬機lion的系統安裝後,需要進行虛擬機domain的配置修改,將系統引導從cdrom切換到硬碟hd,重啟虛擬機後,既可以正常登陸lion虛擬機。
使用如下命令進行boot配置修改:
$ virsh edit lion
...
<os>
<type arch='x86_64' machine='pc-i440fx-xenial'>hvm</type>
<boot dev='cdrom'/>
</os>
...
將 <boot dev='cdrom'/> 修改為 <boot dev='hd'/>
如何刪除創建的lion虛擬機
1)關閉lion虛擬機
$ virsh shutdown lion
2) 刪除lion虛擬機
$virsh destroy lion
3) 取消lion domain的定義
$virsh undefine lion