1. Libvirt 是什么
為什么需要Libvirt全陨?
Hypervisor 比如 qemu-kvm 的命令行虛擬機管理工具參數(shù)眾多看疙,難于使用。
Hypervisor 種類眾多源葫,沒有統(tǒng)一的編程接口來管理它們痢掠,這對云環(huán)境來說非常重要驱犹。
沒有統(tǒng)一的方式來方便地定義虛擬機相關(guān)的各種可管理對象。
Libvirt提供了什么足画?
它提供統(tǒng)一雄驹、穩(wěn)定、開放的源代碼的應(yīng)用程序接口(API)锌云、守護進程 (libvirtd)和和一個默認命令行管理工具(virsh)荠医。
它提供了對虛擬化客戶機和它的虛擬化設(shè)備吁脱、網(wǎng)絡(luò)和存儲的管理桑涎。
它提供了一套較為穩(wěn)定的C語言應(yīng)用程序接口。目前兼贡,在其他一些流行的編程語言中也提供了對libvirt的綁定攻冷,在Python、Perl遍希、Java等曼、Ruby、PHP、OCaml等高級編程語言中已經(jīng)有l(wèi)ibvirt的程序庫可以直接使用禁谦。
它對多種不同的 Hypervisor 的支持是通過一種基于驅(qū)動程序的架構(gòu)來實現(xiàn)的胁黑。libvirt 對不同的 Hypervisor 提供了不同的驅(qū)動,包括 Xen 的驅(qū)動州泊,對QEMU/KVM 有 QEMU 驅(qū)動丧蘸,VMware 驅(qū)動等。在 libvirt 源代碼中遥皂,可以很容易找到 qemu_driver.c力喷、xen_driver.c、xenapi_driver.c演训、vmware_driver.c弟孟、vbox_driver.c 這樣的驅(qū)動程序源代碼文件。
它作為中間適配層样悟,讓底層 Hypervisor 對上層用戶空間的管理工具是可以做到完全透明的拂募,因為 libvirt 屏蔽了底層各種 Hypervisor 的細節(jié),為上層管理工具提供了一個統(tǒng)一的乌奇、較穩(wěn)定的接口(API)益楼。
它使用 XML 來定義各種虛擬機相關(guān)的受管理對象他嚷。
目前,libvirt 已經(jīng)成為使用最為廣泛的對各種虛擬機進行管理的工具和應(yīng)用程序接口(API),而且一些常用的虛擬機管理工具(如virsh刁卜、virt-install、virt-manager等)和云計算框架平臺(如OpenStack姚淆、OpenNebula勤哗、Eucalyptus等)都在底層使用libvirt的應(yīng)用程序接口。
1.1 Libvirt C API
1.1.1 Libvirti API 所管理的主要對象
1.1.2 對象的管理模型
1.1.3 API 的簡單分類
Libvirt API 就是對各種對象的各種操作疏叨,包括基本的增潘靖、刪、改蚤蔓、查操作和其它操作卦溢。
1.2 Libvirt XML 定義
Libvirt 使用 XML 來定義各種對象,其中秀又,與 OpenStack Nova 關(guān)系比較密切的有:
disk (磁盤)
任何磁盤設(shè)備单寂,包括軟盤(floppy)、硬盤(hard disk)吐辙、光驅(qū)(cdrom)或者半虛擬化驅(qū)動都使用 <disk> 元素來定義宣决。 方式:
<disk type='' device=''>。其中:
”type“ 用來指定device source 的類型:"file", "block", "dir", "network", 或者 "volume"昏苏。具體的 source 由 <source> 標簽定義尊沸。
”device“ 用來指定 device target 的類型:"floppy", "disk", "cdrom", and "lun", 默認為 "disk" 威沫。具體的 target 由 <target> 標簽定義。
(1)”volume“ 類型的 disk
(2)”file“ 類型的 disk
(3)”block“ 類型的 disk
(4)”network“ 類型的 disk
Host device assignment (主機設(shè)備分配)
有幾種 interface 類型:
(1)type = ‘network’ 定義一個連接 Virtual network 的 interface
(2)type=‘birdge’ 定義一個 Bridge to LAN(橋接到物理網(wǎng)絡(luò))的interface:前提是主機上存在一個 bridge洼专,該 bridge 已經(jīng)連到物理LAN棒掠。
(3)type=‘ethernet’ 定義一個使用指定腳本連接到 LAN 的 interface
(4)type=‘direct’ 定義一個直接連到物理網(wǎng)卡(Direct attachment to physical interface)的 interface:需要 Linux macvtap 驅(qū)動支持
(5)type=‘hostdev’ 定義一個由主機PCI 網(wǎng)卡直接分配(PCI Passthrough)的 interface: 分配主機上的網(wǎng)卡給虛機
network (網(wǎng)絡(luò))
1. bridge:定義一個用于構(gòu)造該虛擬網(wǎng)絡(luò)的網(wǎng)橋。
2. domain:定義 DHCP server 的 DNS domain屁商。
3. forward: 定義虛擬網(wǎng)絡(luò)直接連到物理 LAN 的方式. ”mode“指轉(zhuǎn)發(fā)模式句柠。
(1) mode=‘nat’:所有連接到該虛擬網(wǎng)絡(luò)的虛擬的網(wǎng)絡(luò)都會經(jīng)過物理機器的網(wǎng)卡,并轉(zhuǎn)換成物理網(wǎng)卡的地址棒假。
(2) mode=‘route’:類似于 NAT溯职,但是不使用NAT,而是使用routing table帽哑。 </pre>
(3) mode=‘bridge’:使用不受libvirt管理的bridge谜酒,比如主機上已有的bridge;open vswitch bridge妻枕;使用 macvtap's "bridge" 模式
(4) mode=‘passthrough’:使用 a macvtap "direct" connection in "passthrough" mode 指定主機上的特定網(wǎng)卡用于虛擬網(wǎng)絡(luò)
(5) mode=‘hostdev’:直接分配主機上的網(wǎng)絡(luò)設(shè)備僻族。
詳細的 XML 定義說明在 https://libvirt.org/format.html。
1.3 Libvirt API 的實現(xiàn)
libvirt API 的實現(xiàn)是在各個 Hypervisor driver 和 Storage dirver 內(nèi)屡谐。Hypervisor 驅(qū)動包括:
LXC - Linux Containers
OpenVZ
QEMU
Test - Used for testing
UML - User Mode Linux
VirtualBox
VMware ESX
VMware Workstation/Player
Xen
Microsoft Hyper-V
IBM PowerVM (phyp)
Parallels
Bhyve - The BSD Hypervisor
1.4 Libvirt 的 Python 綁定
python-libvirt 包含 Libvirt 的 Python 語言綁定述么。安裝 libvirt 時,默認會安裝 python-libvirt 愕掏。 來源: https://libvirt.org/python.html https://pypi.python.org/pypi/libvirt-python
Python API 和 C API 之間幾乎是一對一的映射關(guān)系度秘,比如:
因此,libvirt 官網(wǎng)并沒有提供詳細的 python API 描述饵撑。
2. QEMU/KVM libvirt 驅(qū)動
2.1 架構(gòu)
?Libvirtd 是一個 daemon 進程剑梳,可以被本地的virsh調(diào)用,也可以被遠程的virsh調(diào)用
?Libvirtd 調(diào)用 qemu-kvm 操作KVM 虛擬機
這里有一個 virsh 命令滑潘、Libvirt C API垢乙、 QEMU driver 方法 和 QEMU Monitor 命令的對照表(部分):
2.2 安裝
有三種方式來安裝 libvirt:
(1)下載 libvirt 的源代碼,然后編譯和安裝
(2)從各 Linux 的發(fā)行版中直接安裝语卤,比如 Ubuntu 上運行 apt-get install libvirt-bin
(3)從 git 上克隆 libvirt 的代碼追逮,然后編譯和安裝
2.3 libvirt log
這篇文章(https://libvirt.org/logging.html) 描述了 livbirt log。設(shè)置所有日志的方法是在 /etc/libvirt/libvirtd.conf 中添加下面的配置然后重啟 libvirt:
3 使用 libvirt 編程來管理 KVM 虛機的實例
這里只描述基本的過程粹舵。具體的過程钮孵,下一篇文章會具體分析 Nova 中 libvirt 的使用。
定義虛機的基本配置齐婴,包括 vCPU油猫、內(nèi)存稠茂、磁盤或者cdrom以及啟動順序柠偶,生成 xml 配置情妖,調(diào)用 virDomainCreateXML API 啟動一個虛機
使用 Domain 相關(guān)的 API 來管理虛機的生命周期。我的這篇文章(http://www.cnblogs.com/sammyliu/p/4486712.html)有虛機生命周期的詳細介紹诱担。
添加磁盤:定義一個 disk 的 xml 配置毡证,使用 virDomainAttachDevice API 將它掛載到虛機上。如果不是本地的源磁盤蔫仙,需要提前準備好料睛。
添加interface:使用 Network API 定義一個虛擬網(wǎng)絡(luò)(需要提前準備好物理網(wǎng)絡(luò)),然后定義一個 interface 的 XML 配置摇邦,使用 virDomainAttachDevice API 將它加到虛機恤煞。
按照需要,重復(fù)2施籍、3居扒、4步驟。
作者:劉世民(Sammyliu)
博客:http://www.cnblogs.com/sammyliu/