宿主机kvm留多少资源,KVM实例总结

阅读(100)发布于 2024-05-17

下面进一步KVM的内存气球balloon。③hypervisor使用ballooning让VM归还部分内存,从而可以缓解其内存压力。③目前没有比较方便的、自动化的机制来管理ballooning,一般都是采用在QEMUmonitor中执行balloon命令来实现ballooning的。没有对VM的有效监控,没有自动化的ballooning机制,这可能会让生产环境中实现大规模自动化部署并不很方便。

配图

玩转KVM:内存balloon的奇妙

上篇介绍了kvm的KSM内存合并技术,了解KSM的应用场景。下面进一步KVM的内存气球balloon。

balloon技术应用场景

下面总结了一下内存气球使用时候的情况:

Ballooning在节约内存和灵活分配内存方面有明显的优势,其好处有如下三点。

①因为能够控制和监控ballooning,所以ballooning能够潜在地节约大量的内存。它不同于内存页共享技术(KSM是内核自发完成的、不可控),VM系统的内存只有在通过命令行调整balloon时才会随之改变,所以能够监控系统内存并验证ballooning引起的变化。

②Ballooning对内存的调节很灵活,既可以精细的请求少量内存,又可以粗犷的请求大量的内存。

③hypervisor使用ballooning让VM归还部分内存,从而可以缓解其内存压力。而且从气球中回收的内存也不要求一定要被分配给另外某个进程(或另外的VM)。

从另一方面来说,KVM中ballooning的使用不方便、不完善的地方也是存在的,其缺点也有如下几个。

①Ballooning需要VM操作系统加载virtio_balloon驱动,然而并非每个VM系统都有该驱动(如windows需要自己安装该驱动)。

②如果有大量内存从VM系统中回收,Ballooning可能会降低VM操作系统运行的性能。一方面,内存的减少,可能会让VM中作为磁盘数据缓存的内存被放到气球中,从而VM中的磁盘I/O访问会增加;另一方面,如果处理机制不够好,也可能让VM中正在运行的进程由于内存不足而执行失败。

③目前没有比较方便的、自动化的机制来管理ballooning,一般都是采用在QEMUmonitor中执行balloon命令来实现ballooning的。没有对VM的有效监控,没有自动化的ballooning机制,这可能会让生产环境中实现大规模自动化部署并不很方便。

④内存的动态增加或减少,可能会使内存被过度碎片化,从而降低内存使用时的性能。另外,内存的变化会影响到VM内核对内存使用的优化,比如:内核起初根据目前状态对内存的分配采取了某个策略,而突然由于balloon的效果让可用内存减少了很多,这时起初的内存策略可能就不是太优化的了。

KVM中的Ballooning是通过宿主机和VM协同来实现的,在宿主机中应该使用2.6.27及以上版本的Linux内核(包括KVM模块),使用较新的qemu-kvm(如0.13版本以上),在VM中也使用2.6.27及以上内核且将“CONFIG_VIRTIO_BALLOON”配置为模块或编译到内核。在很多Linux发行版中都已经配置有“CONFIG_VIRTIO_BALLOON=m”,所以用较新的Linux作为VM系统,一般不需要额外配置virtio_balloon驱动,使用默认内核配置即可。

我在windows2008R2和centos7下面完成balloon的应用操作。

VM查看balloon状态:

在vm中,可以通过内核,模块加载,pci设备等查看balloon是否正常运行。

根据上面输出可知,VM中virtio_balloon模块已经加载,有一个叫做“RedHat,IncVirtiomemoryballoon”的PCI设备,它使用了virtio_pci驱动。如果是WindowsVM,则可以在“设备管理器”看到使用VirtIOBalloon设备,稍后可以检验一下。

在宿主机查看并设置balloon:

我通过virsh工具,

设置balloon

virsh#qemu-monitor-commandcentos7.0--hmp--cmdballoon2046

或者

virsh#setmemcentos7.02Gib#--size默认是Kib

如果没有使用Balloon设备,则monitor中用“infoballoon”命令查看会得到“Device'balloon'hasnotbeenactivated”的警告提示。而“balloon2046”命令将VM内存设置为2046MB。

(4)设置了VM内存为512MB后,再到VM中检查,如下所示。

[root@kvm-guest~]#free-m

如果是WindowsVM(如Win7),当balloon使其可用内存从2GB降低到512MB时,在其“任务管理器”中看到的内存总数依然是2GB,但是看到它的内存已使用量会增大1536MB(如从其原来使用量350MB,变为1886MB),这里占用的1536MB正是Balloon设备占用的,WindowsVM系统其他程序已不能使用这1636MB内存,这时宿主机系统就可以再次分配这里的1536MB内存用于其他用途。

另外,值得注意的是,当通过“balloon”命令让VM内存增加时,其最大值不能超过QEMU命令行启动时设置的内存,例如:命令行中内存设置为2048MB,如果在Monitor中执行“balloon4096”则设置的4096MB内存不会生效,其值将会被设置为启动命令行中的最大值(即2048MB)。

1、确保支持cpu虚拟化

cat/proc/cpuinfo|egrep'svm|vmx'

2、安装qemu-kvm、libvirt、virt-install包

yum-yinstallqemu-kvmlibvirtvirt-install

3、开启libvirtd服务病开机自启

systemctlstartlibvirtd&&systemctlenablelibvirtd

4、创建一个磁盘文件

qemu-imgcreate-fqcow2./centos7-kvm.qcow210G

5、创建虚拟机。类型为kvm,名称随意,内存1G,镜像文件指定位置,磁盘文件就是步骤4中的,网络默认,图形选择vnc

virt-install--virt-typekvm--namecentos7-2020--ram1024--cdrom=/home/kvm/CentOS-7-x86_64-Minimal-2003.iso--diskpath=/home/kvm/centos7-kvm.qcow2--networknetwork=default--graphicvnc,listen=0.0.0.0--noautoconsole

6、宿主机安装vncserver

yum-yinstalltigervnc-servertigervncvncvnc-server

systemctldaemon-reload

7、执行下述命令设置密码

vncserver

8、启动服务(我自己的环境这个服务没起来,但还是可以用的)

systemctlstartvncserver@gao:1

9、关闭防火墙和selinux

10、vnc客户端连接宿主机5901,然后正常安装虚拟机

导出虚拟机

——本实验是将qcow2格式导出为qcow2

1、一条命令即可

-从表示压缩,-O表示导出格式,111.qcow2位导出后的文件

qemu-imgconvert-c-Oqcow2centos7-kvm.qcow2111.qcow2

导入虚拟机

——使用virt-manager工具导入

1、安装virt-manager

yum-yinstallvirt-manager

2、打开

virt-manager

3、新建虚拟机,选择镜像导入

选择对应的111.qcow2文件

配置cpu、内存、网络等信息

完成新的虚拟机创建

ok

您好,很高兴为您解答。

KVM是Kernel-basedVirtualMachine的简称,是一个开源的系统虚拟化模块,自Linux2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM目前已成为学术界的主流VMM之一。

您也可以理解为在您的电脑上安装了一个虚拟机(一台电脑)。

简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的CPU、内存、IO硬件资源,但逻辑上虚拟机之间是相互隔离的。

物理机我们一般称为宿主机(Host),宿主机上面的虚拟机称为客户机(Guest)。

{%notesuccess%}poetry

?

往事越千年,魏武挥鞭,东临碣石有遗篇。萧瑟秋风今又是,换了人间。{%endnote%}

?

kvm创建虚拟机的根本在于这样一条命令,virshdefinevm-template.xml,这条命令的核心就是创建一个虚拟机,之后或者之前的内容都是围绕着这条命令和这个虚拟机的。

所以,virshdefinevm-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到文件的时候残缺不全、不换行、文件为空等。

后来采用磁盘共享的方式,在宿主机上创建一块磁盘,然后挂载到/tmp/share/这个目录,再将subvm_configuration.sh脚本和ipinfo配置文件复制到该目录,之后在子机的XML文件中添加一块disk(vdc),登录进子机后,挂载vdc,此时就可以看到母机上/tmp/share/下的内容了。直接执行脚本即可。

磁盘共享也有一个缺点,就是文件内容不能实时刷新,比如在母机上改了ipinfo,只有子机重启后,子机上的ipinfo才可以刷新,鉴于/tmp/share/这个目录每个子机一生只有一次用到,所以这个问题暂时不需要解决。

[2]

创建子机

1、if(vlanid!=0&&xenbrxnotinbrctlshow)会报错网卡未找到导致虚拟机启动失败

2、vm-template模板不正确,包括/usr/local/bin/qemu-system-x86_64路径不正确,会导致虚拟机无法启动

3、disk的slot卡槽相同会导致虚拟机无法启动

4、需要注意的是,virshdefinevm-template这条命令的执行路径是/usr/local/etc/libvirt/qemu/vm-template,最后会在/usr/local/etc/libvirt/qemu/下生成vm$ipfmt.xml的配置文件。

[3]

expect会有很多问题

1、命令不按顺序执行

2、传入的变量为空,且传入的变量下标是从0开始的;shell传入变量下标从1开始,0代表自身文件

3、settimeout$time设置的时间不一定准确,设置了300秒延时,但未到300s,程序还是退出了,可以考虑直接设置timeout为-1

4、expect有多种写法,有expect<

5、expect文件用的解释器是/usr/bin/expect,这里将login.sh使用cat写在了单独的文件中

[4]

1、subvm_configuration.sh配置了两张网卡,格式化vdb数据盘,配置ssh

2、eth0为连接外网的网卡,使用tunnel,eth1为内网网卡,使用vlan

xenbrX为隧道入口,母机收到从xenbr361口收到的报文,就发给另一端隧道,从而实现连接外网

tunnelnetwork----host(defaultrouter:subhost->netowrk,throughtinterface&shvlan.sh)----subhost

母机收到vlan的报文,就在指定vlan的广播域内进行路由(不一定是母机进行路由)

vlannetwork----host(broadcastrouter:subhost--->broadcast/vlanidthrought802.1Q)----subhost

expect合理用法

以上就是关于宿主机kvm留多少资源的解答,如果对你有帮助,不妨关注本站,本站将为你整理更多内容。