本文目录一览:
如何给运行的kvm虚拟机做快照
KVM-快照管理
1.kvm克隆
kvm
虚拟机有两部分组成:img镜像文件和xml配置文件(/etc/libvirt/qemu
克隆命令:virt-clone
-o
rhel6-
71
-n
xuegod63-kvm2
-f
/var/lib/libvirt/images/xuegod63-kvm2.img
virt-clone
-o
原虚拟机
-n
新虚拟机
-f
新img文件
对比配置文件,将两份xml文件做diff对比,里面只修改了name、img、Mac
3个位置信息
克隆完成后,需要修改新虚拟机的网卡配置,并删除/etc/udev/rule.d/70-*-net文件,
2.快照(snapshot)
kvm默认格式为raw格式,如需要修改镜像文件格式。需要配置xml文件
查看镜像文件格式qemu-ig
info
镜像文件
1)、转换格式(将raw格式转换为qcow2格式)
qemu-img
convert
-f
raw
-O
qrow2
/var/lib/libvert/images/xuegod63-kvm2.img
需要修改xml文件virsh
edit
虚拟机
2)、创建快照
qemu-img
snapshot-create
虚拟机(可以用snapshot-create-as指定快照名称)
3)、快照管理
qemu-img
snapshot-list
4)、恢复快照
查看虚拟机状态:virsh
domstate
xuegod63-kvm2
恢复快照:virsh
snapshot-revert
虚拟机
快照名
查看当前快照:
virsh
snapshot-current
xuegod63-kvm2
快照目录:/var/lib/libvert/qemu/snapshot/虚拟机
删除快照:
virsh
snapshot-delete
虚拟机
快照名
获取KVM虚拟机DHCP的ip地址
KVM虚拟机支持birdge网卡和nat模式网卡。本文只关注nat网卡。采用libvirt管理的虚拟机,会生成一个XML文件,文件内部保护具体的网卡配置,里面包含MAC地址。libvirt采用dnsmasq来提供dhcp服务,只需在dnsmasq里面找到mac和ip映射关系,即可找到虚拟机的ip.-kvm虚拟机xml文件详解
1 根据虚拟机命令获取虚拟机XML文件,并解析出MAC地址
virsh dumpxml vm-name | sed -n '/mac address/p'| awk -F "[']" '{print $2}'
2 根据mac查询ip
grep $mac -rn /var/lib/libvirt/dnsmasq | awk '{print $2,$3}'
3 一条命令搞定
for mac in `virsh dumpxml vm-name | sed -n '/mac address/p'| awk -F "[']" '{print $2}'`; do grep $mac -rn ./| awk '{print $2,$3}' ; done-kvm虚拟机xml文件详解
vm-name为虚拟机名字,自行修改。如果有多个nat网卡,可以获取到多个ip,要求虚拟机开机,且正确获取IP地址。
网络虚拟化技术
数据包从虚拟机到物理机过程:
半虚拟化技术使数据包跳过QEMU虚拟网卡,从虚拟机直接到虚拟化层,
虚拟网卡性能排序:
简化虚拟化环境中的交换网络,代替传统的Linux TAP设备加Bridge设备组合
MacVTap设备有3中不同的工作模式:
创建MacVTap端口过程
KVM虚拟机使用MacVTap网络
在xml文件配置如下
虚拟机开启后,宿主系统会自动创建一台MacVTap设备给虚拟机使用,这台MacVTap设备附属于母设备eth0,工作模式为Bridge
xml文件配置
1.物理网卡的中断与多队列
查看网卡是否支持RSS:
ls /sys/class/net/eth0/queues/
2.绑定中断
3.多队列Virtio网卡
查看是否支持:
grep IFF_MULTL_QUEUE /usr/include/Linux/if_tun.h
多队列Virtio网卡配置:
N 1-8最多支持8个队列,在虚拟机上执行以下命令开启多队列网卡:
ethtool -L eth0 combined M
M 1-N,M小于等于N
PCI Passthrough配置
1.查看网卡设备信息:
lspci 或者 virsh nodedev-list --tree
2.得到pci_0000_02_00_0的配置信息
virsh nodedev-dumpxml pci_0000_02_00_0
3.编辑虚拟机xml文件,加入PCI设备信息
SR-IOV 上有两个功能类型。
SR- IOV 标准允许高效共享PCI-E 设备, 有以下优点:
2.网卡S R-IO V 的配置
SR-IOV 的配置需要先配置宿主机 PF , 然后将子网卡通过网卡独占的方式供虚拟机使用。
(1) 加载SR-IOV 内核模块
通过modprobe 命令加载igb 模块。
modprobe igb
实际加载的时候,需要激活虚拟功能(VF)。
modprobe igb max_vfs=7
如果需要重新设置VF, 可以删除模块再重新加载。
modprobe -r igb
将配置永久写入配置文件。
echo "options igb max_vfs=7" /etc/modprobe.d/igb.c onf
通过 lspci 命令可以看多主网卡和子网卡。
(2) 子网卡的使用
虚拟机可以通过网卡独占的方式使用子网卡。
virsh nodedev-list |grep 0b
虚拟机网卡xml 配置文件如下:
虚拟机需要安装网卡驱动才能 使用子网卡,高版本的Linux系统可以自动识别子网卡,
Windows系统只能是2008 Sevrer 以上版本,并且要安装最新的 Intel网卡驱动。
kvm虚拟机可以识别宿主机上的硬件吗?
KMV虚拟机软件肯定要识别出来宿主机的:CPU、内存、硬盘、USB口、网卡、无线网卡这些硬件设备呀。它要控制这些硬件设备,重新进行虚拟化管理、或者映射。比如虚拟机的USB口,映射到宿主机的哪个USB口。-kvm虚拟机xml文件详解
KVM实例总结
{% note success %} poetry
center style="box-sizing: border-box; margin-top: 0px; margin-bottom: 0px;"往事越千年,魏武挥鞭,东临碣石有遗篇。萧瑟秋风今又是,换了人间。 {% endnote %}/center-kvm虚拟机xml文件详解
kvm创建虚拟机的根本在于这样一条命令, virsh define vm-template.xml ,这条命令的核心就是创建一个虚拟机,之后或者之前的内容都是围绕着这条命令和这个虚拟机的。
所以,virsh define vm-template.xml 其本质是在安全可靠的前提下,将母机的资源通过kvm虚拟化的形式分配给子机。
所以主要考虑方向有两个
1、保障母机和子机的安全可靠,包括系统安全和网络安全
2、进行资源分配,包括网络资源、存储资源、计算资源等
该脚本考虑了母机分配资源不会超过母机承受范围的资源安全,其他系统层面和网络层面的安全问题还需考虑
完成过程
[0]
刚开始考虑当母机资源超过一定比例则程序退出,比如磁盘使用超过2/3,后来觉得这样不够灵活,改用百分比,默认50%
在设置百分比的时候有几点小问题
1、浮点数运算保留小数
使用scale可以准确保留小数,echo "scale=2;62/3" | bc 结果 20.66
使用printf可以保留小数位,补零填充 printf %.2f 结果20.00
2、浮点数运算不保留小数
echo "123.123"|sed "s/.. //g"
代表0到多个,所以第一个命令中. 只能替换掉小数点变成空
..代表了小数点之后的1到多个
3、除法
echo "2 / 3" | bc 这个结果会显示为0
echo "scale=2 ;2 / 3" | bc 这个结果会显示为.66
printf "%.2f" echo "scale=2;2/3" | bc 这个结果会显示为0.66
[1]
刚开始的时候选择将subvm_configuration.sh这个脚本cat进内存,然后用expect登录到子机的时候echo到文件,然后执行。后来发现expect输出的时候会把subvm_configuration.sh脚本里的内容先执行一遍,而且还存在其他一些问题,比如说echo到文件的时候残缺不全、不换行、文件为空等。-kvm虚拟机xml文件详解
后来采用磁盘共享的方式,在宿主机上创建一块磁盘,然后挂载到/tmp/share/这个目录,再将subvm_configuration.sh脚本和ipinfo配置文件复制到该目录,之后在子机的XML文件中添加一块disk(vdc),登录进子机后,挂载vdc,此时就可以看到母机上/tmp/share/下的内容了。直接执行脚本即可。-kvm虚拟机xml文件详解
磁盘共享也有一个缺点,就是文件内容不能实时刷新,比如在母机上改了ipinfo,只有子机重启后,子机上的ipinfo才可以刷新,鉴于/tmp/share/这个目录每个子机一生只有一次用到,所以这个问题暂时不需要解决。-kvm虚拟机xml文件详解
[2]
创建子机
1、if ( vlanid != 0 xenbrx not in brctl show ) 会报错网卡未找到导致虚拟机启动失败
2、vm-template模板不正确,包括emulator/usr/local/bin/qemu-system-x86_64/emulator路径不正确,会导致虚拟机无法启动
3、disk的slot卡槽相同会导致虚拟机无法启动
4、需要注意的是,virsh define vm-template 这条命令的执行路径是/usr/local/etc/libvirt/qemu/vm-template,最后会在/usr/local/etc/libvirt/qemu/下生成vm$ipfmt.xml的配置文件。-kvm虚拟机xml文件详解
[3]
expect会有很多问题
1、命令不按顺序执行
2、传入的变量为空,且传入的变量下标是从0开始的;shell传入变量下标从1开始,0代表自身文件
3、set timeout $time 设置的时间不一定准确,设置了300秒延时,但未到300s,程序还是退出了,可以考虑直接设置 timeout 为-1
4、expect有多种写法,有expect EOF ; expect eof ; 最正常的是上面用的
5、expect文件用的解释器是/usr/bin/expect,这里将login.sh使用cat写在了单独的文件中
[4]
1、subvm_configuration.sh配置了两张网卡,格式化vdb数据盘,配置ssh
2、eth0为连接外网的网卡,使用tunnel,eth1为内网网卡,使用vlan
xenbrX为隧道入口,母机收到从xenbr361口收到的报文,就发给另一端隧道,从而实现连接外网
tunnel network ---- host(default router: subhost - netowrk , throught interface sh vlan.sh ) ---- subhost-kvm虚拟机xml文件详解
母机收到vlan的报文,就在指定vlan的广播域内进行路由(不一定是母机进行路由)
vlan network ---- host(broadcast router: subhost --- broadcast/vlanid throught 802.1Q ) ---- subhost-kvm虚拟机xml文件详解
expect合理用法
kvm虚拟机配置文件怎么注释配置
Java代码
domain type="kvm"
// domain 是一个所有虚拟机都需要的根元素,type定义使用哪个虚拟机管理程序,
name$vmUuid/name
// name定义了一个名字
uuid$vmUuid/uuid
// id唯一的标示一个运行的虚拟机
memory unit="KiB"$vmMemory/memory
// memory 定义客户端启动时可以分配到的最大内存
vcpu placement="static"$vmVcpu/vcpu
// vcpu的内容是为虚拟机最多分配几个cpu,值处于1~maxcpu之间 //placement参数指定一个domain的cpu的分配模式,static、auto
os
type arch="x86_64" machine="pc-i440fx-trusty"hvm/type
// type参数指定了虚拟机操作系统的类型 // arch指定虚拟机的CPU架构,machine指定机器的类型 // hvm表明需要全虚拟化
boot dev="hd" /
// boot:指定启动设备,hd表示从硬盘启动
/os
features
// Hypervisors所有的特性都在fearures元素中
acpi /
// 用于电源管理
apic /
// 是装置的扩充组合用来驱动 Interrupt 控制器
pae /
// 扩展物理地址模式,使32位的客户端支持大于4GB的内存
/features
clock offset="utc" /
// 客户端的时间初始化来自宿主机的时间 // 大多数操作系统期望硬件时钟保持UTC格式,UTC也是默认格式 // 当一个客户端的OS触发lifecycle时,它将采取新动作覆盖默认操作 // 具体状态参数如下: -kvm虚拟机xml文件详解
on_poweroffdestroy/on_poweroff
// 当客户端请求poweroff时执行特定的动作 // destroy:domain将会被完全终止,domain的所有资源会被释放
on_rebootrestart/on_reboot
// 当客户端请求reboot时执行特定的动作 // restart: domain会被终止,然后以相同的配置重新启动
on_crashrestart/on_crash
// 当客户端崩溃时执行的动作 // restart: domain会被终止,然后以相同的配置重新启动
devices
// 所有的设备都是一个名为devices元素的子设备
emulator/usr/bin/kvm-spice/emulator
// emulator元素指定模拟设备二进制文件的全路径
disk type="file" device="disk"
// 所有的设备看起来就像一个disk、floppy、cdrom等 // 他们通过一个disk元素指定。 // disk是一个描述disks的容器,这个disk的type是file
driver name="qemu" type="qcow2" /
// driver允许更进一步的指定hypervisor driver的 // 相关细节。如果hypervisor支持多个后端驱动程序, // name属性选择一个主要的后端驱动的名称, // type参数可以指定一个子类型,qcow2 写时拷贝2 -kvm虚拟机xml文件详解
source file="$imagePath" /
// source元素:在disk的type是file时,file属性 // 指定一个合格的全路径文件映像作为客户端的磁盘
target dev="sda" bus="virtio" /
// 将磁盘暴露给客户机时的总线类型和设备名称。 // target元素:控制总线设备在某个磁盘被选为客户 // 端的OS时,dev属性表明本地磁盘在客户端上的实际 // 名称,因为实际设备的名称指定并不能保证映射到 // 客户端OS上的设备。 // bus属性指定了哪种类型的磁盘被模拟 // virtio 半虚拟化 -kvm虚拟机xml文件详解
/disk
#foreach($!disk in $!diskList) // 循环创建虚拟硬盘
disk type="file" device="disk"
driver name="qemu" type="$!disk.diskDTO.diskFormat.value" /
source file="$!disk.diskDTO.diskPath" /
target dev="$!disk.devName" bus="usb" /
/disk
#end // 控制器=====
controller type="usb" index="0" model="ich9-ehci1"
address type="pci" domain="0x0000" bus="0x00" slot="0x07" function="0x7" /
/controller
controller type="usb" index="0" model="ich9-uhci1"
master startport="0" /
address type="pci" domain="0x0000" bus="0x00" slot="0x07" function="0x0" multifunction="on" /
/controller
controller type="pci" index="0" model="pci-root" /
controller type="ide" index="0"