×

kvm虚拟机xml文件详解

kvm虚拟机xml文件详解(kvm 虚拟机配置文件)

admin admin 发表于2023-03-26 21:35:10 浏览53 评论0

抢沙发发表评论

本文目录一览:

如何给运行的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"