🌟Overview
应使用 libvirt 进行操作、管理. libvirt 使用 XML 来定义各种对象, 最好使用 virt-manager 创建虚拟机然后在配置文件里进行修改, 也可使用 virt-install 创建.
XML 格式官方说明
🌟模拟网卡设置
1 2 3 4 5 6 7 8 9 10 11
| # qemu/kvm 命令行操作
# 指定网卡为 Intel e1000
kvm ... -net nic,model=e1000,macaddr=mac,addr=addr
# 指定使用 virtio 类型 (准虚拟化的I/O驱动) 的网卡设备
kvm ... -net nic,model=virtio
|
🌟vhost-net
virtio 在 Host 端的后端处理程序 (backend) 一般是由用户空间的 QEMU 提供的. vhost-net 是一个驱动模块, 是内核级别的后端处理程序, 将 virtio-net 的后端处理任务放到内核空间执行, 减少内核态与用户态之间的 context 切换, 从而提高效率.
1 2 3 4 5 6 7 8 9 10 11 12 13
|
<interface type="network">
<model type="e1000" />
<driver name="vhost" />
</interface>
|
🌟virtio-balloon
Host: 检查virtio-balloon 设备
Guest: 如果时 Linux 则检查 CONFIG_VIRTIO_BALLOON=m 及驱动, 如果是 Windows 检查驱动 virtio_ballon.
实例: kvm -smp 2 -m 2048 -drive file=xxx.qcow2,if=ide,media=disk,format=qcow2 -boot c -name Centos6 -net nic,model=e1000 -balloon virtio
动态调整 VM 内存: 在 Host 中进入 QEMU Monitor Console,
🌟多队列 Virtio-net
可处理大流量网络, 一个队列独占一个虚拟 CPU (会增加 CPU 的负担), 启用多队列 Virtio-net, 需要在虚拟机的 XML 配置文件中增加如下配置:
1 2 3 4 5 6 7 8 9 10 11 12 13
| <interface type='network'>
<source network='default' />
<module type='virtio' />
<driver name='vhost' queues='N' />
</interface>
|
🌟libvirt 虚机 XML 配置之磁盘定义
任何磁盘设备, 包括软盘、硬光驱或者半虚拟化驱动都使用 <disk> 标签来定义.
volume 类型的 disk
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
<disk type='volume' device='disk'>
<driver name='qemu' type='raw' />
<source pool='blk-pool0' volume='blk-pool0-vol0' />
<target dev='hdk' bus='ide' />
</disk>
<disk type='file' snapshot='external'>
<driver name='tap' type='aio' cache='default' />
<source file='/var/lib/xen/images/fv0' startupPolicy='optional' />
<target dev='hda' bus='ide' />
</disk>
<disk type='block' device='cdrom'>
<driver name='qemu' type='raw' />
<target dev='hdd' bus='ide' tray='open' />
<readonly/>
</disk>
<disk type='network' device='cdrom'>
<driver name='qemu' type='raw' io="threads" ioeventfd="on" event_idx="off"/>
<source protocol='http' name='url_path'>
<host name='hostname' port="80" />
</source>
<target dev='hdd' bus='ide' />
<boot order='1'/>
</disk>
|
🌟libvirt 虚机 XML 配置之网卡定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
<devices>
<interface type="network">
<source network='default' />
</interface>
...
<interface type='network'>
<source network='hostntw' portgroup='engineering' />
<target dev='vnet7' />
<mac address="00:11:22:33:44:55" />
<virtualport>
<parameters instanceid09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f />
</virtualport>
</interface>
</devices>
<interface type='bridge'>
<source bridge='br0' />
</interface>
<interface type='bridge'>
<source bridge='br1' />
<target dev='vnet7' />
<mac address="00:11:22:33:44:55" />
</interface>
<interface type='ethernet'>
<target dev='vnet7' />
<script path='/etc/sysconfig/network-script/ifcfg-vnet7' />
</interface>
|
🌟libvirt 虚机 XML 配置之网络定义
定义一个用于构造该虚拟网络的网桥:
1 2 3
| <bridge name='virbr0' stp='on' delay='5' macTableManager='libvirt' />
|
定义 DHCP server 的 DNS domain:
1 2 3 4 5
| <domain name="example.com" localOnly='no' .>
</domain>
|
定义虚拟网络直接联到物理 LAN 的方式. mode 指的是转发模式 [nat/route/bridge]:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| <network>
<name>default</name>
<bridge name='virbr0' />
<forward mode='nat'/>
<forward mode='nat'>
<nat>
<address start='1.2.3.4' end='1.2.3.10'/>
</nat>
</forward>
<forward mode='nat'>
<nat>
<port start='500' end='10000'/>
</nat>
</forward>
<ip address="192.168.122.1" netmask="255.255.255.0">
<dhcp>
<range start="192.168.122.2" end="192.168.122.254" />
</dhcp>
</ip>
<ip family="ipv6" address="2001:db8:ca2:2::1" prefix="64" />
</network>
<network>
<name>host-bridge</name>
<forward mode='bridge' />
<bridge name='br0' />
</network>
<network>
<name>hostntw</name>
<bridge name='virbr1' stp='on' delay='0' />
<ip address='192.168.15.250' netmask='255.255.255.0' />
</network>
|
🌟libvirt 虚机 XML 配置之 CPU 定义
参考文档
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
<cpu mode='host-passthrough' >
<feature name='vmx' policy='disabled' />
...
</cpu>
<cpu mode='host-model' >
<feature name='vmx' policy='disabled' />
...
</cpu>
<cpu mode='custom' >
<model>Westmere</model>
<feature name='pcid' policy='require' />
...
</cpu>
|
🌟使用 libvirt API 管理 KVM 虚机
基本过程:
定义虚机的基本配置,包括 vCPU、内存、磁盘或者 ccdrom 以及启动顺序, 生成 xml 配置文件; 调用 virDomainCreateXML 接口来启动虚机.
使用 Domain 相关的 API 来管理虚拟机的生命周期. 参考
添加磁盘 (virsh define domain.xml): 定义一个 disk 的 xml 配置, 使用 virDomainAttachDevice API将其关联到虚机上.
添加 NIC (virsh net-define nic.xml): 使用 Network API 定义一个虚拟网络, 然后定义一个 interface 的 XML 配置, 使用 virDomainAttachDevice API 将其关联到虚拟机.
创建快照: virsh snapshot-create-as DomainName SnapName
恢复快照: virsh snapshot-revert DomainName SnapName
删除快照: virsh snapshot-delete DomainName SnapName
删除 Domain (需要先删除快照): virsh undefine DomainName, 然后清除磁盘文件
🌟virt-install 实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| # 使用已装好系统的虚拟磁盘, 创建新的虚拟机定义, 创建好之后就可以使用 libvirt 进行管理了
#
#
#
qemu-img create -f qcow2 500G
virt-install --name DomainName --vcpus=2 --cpu host-passthrough --memory 2048 --disk path=/data/images/dom.qcow2,bus=virtio(ide),cache=writeback,size=0(不分配初始大小,自增长, 前面创建已限制最大值) --disk path=/data/images/config.iso,device=cdrom --graphics vnc,listen=0.0.0.0,password=foobar,port=5901 --network network=hostntw(bridge=virtbr1),model=e1000(virtio) --noautoconsole --os-type=windows --boot=hd -v(全虚拟化) --virt-type kvm --os-variant win7 --check path_in_use=off
#
# 使用镜像安装系统
#
qemu-img create -f qcow2 500G
#
qemu-img convert -O qcow2 -c in.vmdk out.qcow2
#
virt-install ...
#
firewall-cmd --add-port=5901/tcp --zone=public --permanent
firewall-cmd --reload
#
virsh edit DomainName
|