#libvirt使用小报告# by luodan [email protected] 2014.12 ##1.了解libvirt的结构## libvirt是以一组API的形式存在,用于管理的应用程序。通过一种特定于虚拟机监控程序的机制与每个有效的虚拟机监控程序进行通信,以完成API请求。
在libvirt中,将物理主机称为节点(node),将客户机操作系统称为域(domain),libvirt及其应用程序在宿主操作系统中进行。支持各种虚拟机监控程序,包括Xen,KVM,以及QEMU和用于其他操作系统的许多虚拟产品。
libvirt的在线网站:libvirt API
###不使用libvirt和使用libvirt管理虚拟机的方式###
其中libvirtd为可用于远程控制虚拟机所用的特殊守护进程
##2.理解libvirt的domain的XML格式## XML节点树结构如下
General metadata
Operating system booting
BIOS bootloader
Host bootloader
Direct kernel boot
Container boot
SMBIOS System Information
CPU Allocation
IOThreads Allocation
CPU Tuning
Memory Allocation
Memory Backing
Memory Tuning
NUMA Node Tuning
Block I/O Tuning
Resource partitioning
CPU model and topology
Events configuration
Power Management
Hypervisor features
Time keeping
Devices
Hard drives, floppy disks, CDROMs
Filesystems
Device Addresses
Controllers
Device leases
Host device assignment
USB / PCI / SCSI devices
Block / character devices
Redirected devices
Smartcard devices
Network interfaces
Virtual network
Bridge to LAN
Userspace SLIRP stack
Generic ethernet connection
Direct attachment to physical interface
PCI Passthrough
Multicast tunnel
TCP tunnel
Setting the NIC model
Setting NIC driver-specific options
Setting network backend-specific options
Overriding the target element
Specifying boot order
Interface ROM BIOS configuration
Quality of service
Setting VLAN tag (on supported network types only)
Modifying virtual link state
vhost-user interface
Input devices
Hub devices
Graphical framebuffers
Video devices
Consoles, serial, parallel & channel devices
Guest interface
Parallel port
Serial port
Console
Channel
Host interface
Domain logfile
Device logfile
Virtual console
Null device
Pseudo TTY
Host device proxy
Named pipe
TCP client/server
UDP network console
UNIX domain socket client/server
Spice channel
Nmdm device
Sound devices
Watchdog device
Memory balloon device
Random number generator device
TPM device
NVRAM device
panic device
Shared memory device
###2.1通用元数据XML格式###
<domain type='xen' id='3'>
<name>fv0</name>
<uuid>4dea22b31d52d8f32516782e98ab3fa0</uuid>
<title>A short description - title - of the domain</title>
<description>Some human readable description</description>
<metadata>
<app1:foo xmlns:app1="http://app1.org/app1/">..</app1:foo>
<app2:bar xmlns:app2="http://app1.org/app2/">..</app2:bar>
</metadata>
<domain>节点
所有虚拟机的根节点称为域(domain),根节点有两个属性:第一个属性是类型(type),用于指定运行域所用的Hypervisor,其值应该为特定的驱动程序,但也可以为“Xen”,“KVM”,“QEMU”,"LXC","KQEMU",第二个属性是id,它是用于标识客户机的唯一的整数标识符,无效的机器没有id值。
<name>节点
为虚拟机的简称,智能由数字,字母组成,并且需要在一台主机中具有唯一性,主要时在存储永久性配置文件时用于生成文件名。
<uuuid>节点
为虚拟机全局唯一标识符,其格式需要符合RFC4122的标准。如果在定义或者创建虚拟机时忘记设置uuid值,系统会随机生成一个uuuid。
<title>节点
可选节点,提供对域的简短描述,该元素的内容中不能包含任何换行字符
<description>节点
该元素为虚拟机提供一个可读的描述,此数据不会被libvirt使用,可以由用户自定义。
<metada>节点
用户数据。用户可以在xml中存储自己的数据。应用程序使用该节点存储的XML格式的用户元数据。应用程序在XML节点中使用自定义的命名空间,且此命名空间中只有一个顶层元素(如果应用程序需要具有结构,则它们的命名空间元素需要有子元素)
###2.2操作系统启动数据### 有多种方法启动虚拟机,各有优劣
####2.2.1bios的启动载入方法#### 通过BIOS启动的方法可以用于支持全虚拟化的hypervisors。dev属性的值可以是:fd、hd、cdrom、network,在这种情况下,BIOS具有启动优先权(软驱,硬盘,光驱,网络)来决定了到何处去获得一个启动镜像
<os><!--虚拟机启动参数设置-->
<type>hvm</type><!--hvm表示全虚拟化-->
<loader readonly='yes' type='rom'>/usr/lib/xen/boot/hvmloader</loader>
<nvram template='/usr/share/OVMF/OVMF_VARS.fd'>/var/lib/libvirt/nvram/guest_VARS.fd</nvram>
<boot dev='hd'/><!--启动顺序。dev内容:"fd", "hd", "cdrom" or "network"-->
<boot dev='cdrom'/>
<bootmenu enable='yes' timeout='3000'/><!--启动时是否显示用户交互界面-->
<smbios mode='sysinfo'/>
<bios useserial='yes' rebootTimeout='0'/>
</os>
节点 包括虚拟机中将要启动的操作系统的类型,huv以为这操作系统是设计用于裸机部署的,所以需要全虚拟化,linux(真是个烂名字啊)意味着该操作系统支持Xen 3 Hypervisor来宾ABI,该节点还有两个可选属性,arch制定CPU的虚拟架构,machine表示机器类型,在capabilities XML中对此两属性有详细叙述。
<loader>节点
该节点为可选节点,表示用于协助域创建进程的固件对象。由Xen用来全虚拟化域,同样也可以由QEMU/KVM来用于设置QEMU的BIOS文件路径。该节点有两个可选属性:readonly(值为yes 或者 no),来用于表征镜像是否是可写的或者只读的。type(值为rom或者pflash),用于告诉hypervisor,文件需要被映射到来宾内存何处。例如,如果loader path指向的时UEFI镜像,type就应该值为pflash。 //太长了。。放弃全文翻译官方文档,改为熟悉网上已有的xml文档
###2.3 SMBIOS System Information ### 暂时空
###2.4 CPU分配 ### vcpu节点的内容是为虚拟机最多分配几个cpu,值处于1~maxcpu之间,可选属性: cpuset属性:指定虚拟cpu可以映射到那些物理cpu上,物理cpu用逗号分开,单个数字的标示单个cpu,也可以用range符号标示多个cpu,数字前面的脱字符标示排除这个cpu current属性:指定虚拟机最少 placement属性:指定一个domain的cpu的分配模式,值可以是static、auto。 ... 2 ...
###2.5 IO线程分配### 暂时空
###2.6 CPU调谐### 暂时空
###2.7 内存分配###
<domain>
...
<memory unit='KiB'>524288</memory>
<currentMemory unit='KiB'>524288</currentMemory>
...
</domain>
。 节点 启动时分配的内存最大值,定义客户端启动时可以分配到的最大内存,内存单位由unit定义,单位可以是:K、KiB、M、MiB、G、GiB、T、TiB。默认是KiB。 节点 实际分配的内存,可以小于最大值。如果没有定义,值和memory一致。
###2.8 页定义memory backing### ... ...
可选节点,影响虚拟内存的页置换策略。
###2.9 内存调谐### 有待补充
###2.10 NUMA节点调谐### 有待补充
###2.11 阻塞IO调谐### 有待补充
###2.12 资源划分### 有待补充
###2.13 CPU model and topology### 有待补充
###2.14 Events configuration 事件配置### ... <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>restart</on_crash> <on_lockfailure>poweroff</on_lockfailure> ... 当一个客户端的OS触发lifecycle时,它将采取新动作覆盖默认操作,具体状态参数如下:
on_poweroff:当客户端请求poweroff时执行特定的动作
on_reboot:当客户端请求reboot时执行特定的动作
on_crash:当客户端崩溃时执行的动作
每种状态下可以允许指定如下四种行为: destory:domain将会被完全终止,domain的所有资源会被释放
restart:domain会被终止,然后以相同的配置重新启动
preserver:domain会被终止,它的资源会被保留用来分析
rename-restart:domain会被终止,然后以一个新名字被重新启动
QEMU/KVM支持使用destroy和restart动作行为来进行 on_poweroff on_reboot事件处理,on_reboot事件的preserve动作被作为destroy来处理,on_poweroff的rename-restart动作被当作restart事件处理。
###2.15 电源管理### 有待补充
###2.16 Hyperisor 特性### ...
... Hypervisors允许特定的CPU/机器特性打开或关闭,所有的特性都在fearures元素中,在全虚拟化中常用的标记有: pae:扩展物理地址模式,使32位的客户端支持大于4GB的内存 acpi:用于电源管理###2.17时间维持###
... ... 客户端的时间初始化来自宿主机的时间,大多数操作系统期望硬件时钟保持UTC格式,UTC也是默认格式,然而Windows机器却期望它是'localtime' clock的offset属性支持四种格式的时间:UTC localtime timezone variable
###2.18设备###
/usr/bin/kvm