Kvm

Kvm

kvm虚拟机启动报错Unable to find security driver for model selinux

运维 OS小编 发表了文章 0 个评论 1779 次浏览 2022-05-17 15:46 来自相关话题

好久没用kvm虚拟话了,之前有台物理机配置比较高,就借助kvm虚拟化技术虚拟了几台虚拟机做实验完,但是今天启动报如下错误: [root@kvm-labs kvm]# virsh start centos7-lab ...查看全部

好久没用kvm虚拟话了,之前有台物理机配置比较高,就借助kvm虚拟化技术虚拟了几台虚拟机做实验完,但是今天启动报如下错误:


[root@kvm-labs kvm]# virsh start centos7-lab-node1
error: Failed to start domain centos7-lab-node1
error: unsupported configuration: Unable to find security driver for model selinux

根据错误提示,怀疑是系统selinux的问题,但是发现selinux是disabled,难道要强制用selinux,不合理啊。重新梳理逻辑,kvm虚拟机是可被定义的,是不是定义的配置文件中有selinux相关定义,那是不是可以去掉,经过实验还真ok,解决步骤如下。


1. 进入虚拟机配置文件目录

cd /etc/libvirt/qemu/
# 如果你构建环境修改过默认路径,根据实际情况进入

2. 编辑虚拟机配置文件

vim  centos7-lab-node1.xml

.....................
<input type='tablet' bus='usb'>
<address type='usb' bus='0' port='1'/>
</input>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>
<listen type='address' address='0.0.0.0'/>
</graphics>
<video>
<model type='cirrus' vram='16384' heads='1' primary='yes'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</memballoon>
<rng model='virtio'>
<backend model='random'>/dev/urandom</backend>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</rng>
</devices>
<seclabel type='dynamic' model='selinux' relabel='yes'/>
</domain>

如上,删除<seclabel type='dynamic' model='selinux' relabel='yes'/> , 然后保存退出。


3. 重新定义配置文件

virsh define ./centos7-lab-node1.xml

然后重新执行virsh start centos7-lab-node1 就可以了。


如果想迁移虚拟机的存储路径也可以关机,修改配置文件下的存储路径,并将.qcow2文件移动到相应的目录下即可.


<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/data/kvmdata/centos7-lab-node1.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</disk>

修改完成后,然后重新定义配置文件,重启虚拟机即可。

KVM里面如何是指NAT端口转发

DevOps koyo 回复了问题 2 人关注 1 个回复 2058 次浏览 2021-10-22 17:44 来自相关话题

商业级开源虚拟化管理平台OVM

开源项目 空心菜 发表了文章 2 个评论 8511 次浏览 2016-04-26 20:44 来自相关话题

开源的虚拟化管理平台也有很多,比如OpenStack、Cloudstack OpenNebula、oVirt/RHEV、ZStack等,为什么还要自行研发开发呢,因为这些都不够简单和易用,功能不够全面。而OVM得出发点就是简单、易玩! ...查看全部
开源的虚拟化管理平台也有很多,比如OpenStack、Cloudstack OpenNebula、oVirt/RHEV、ZStack等,为什么还要自行研发开发呢,因为这些都不够简单和易用,功能不够全面。而OVM得出发点就是简单、易玩!

经历了一年来一个虚拟化的开源管理平台OVM-(Open Virtual Manager )终于诞生了。OVM作为开源虚拟化管理平台以做最好用的虚拟化管理平台为目标。面向中小型虚拟化环境,打造简单易用的虚拟化和管理平台。 让零基础的用户在几个小时内可以部署、使用自己的虚拟化系统。主要特性就是简单、易部署。
 
具体的安装下载参考:http://www.openvirtmanager.org/install.html​ 
 
下面就让我们来体验初恋般的感觉,OVM具有魅力,我们可以怎么使用?!!!
 
一、使用Web客户端登录OVM
OVM安装配置完成后,您可以使用FireFox浏览器或Google浏览器访问OVM用户界面。
前提条件:
          您必须具有在系统配置期间创建的系统管理员用户名和密码(系统默认用户名为admin、默认密码为password。
步骤:
    []打开Web 浏览器,并导航到http://管理平台ip[/][]输入系统管理员用户名和密码(系统默认为admin、password),并单击登录。[/]

image001.png

OVM将带您进入到虚拟化与云的世界。
 
二、新建数据中心
    []OVM数据中心支持管理私有的数据中心和公有云资源。[/][]OVM通过远程服务模块管理数据中心和公有云。[/]

image005.png

新建数据中心步骤:
1、选择添加内部虚拟中心,弹出对话框,由于各个组件使用all-in-one安装,所以输入管理平台IP,重复IP,免除重复操作。
image006.png

2、检查所有IP,如果安装没有问题,检查会顺利通过。
image007.png

3、点击保存,内部数据中心建立完毕。
imag8.png

 
三、新建服务器资源池
服务器池是物理主机的主要容器,通常要把主机(即物理服务器)添加到服务器池。

数据中心可包含多个服务器池,一般全国性的集团公司或跨国公司会使用多个服务器池来表示企业内的组织结构。

服务器池的对象可以交互,但不同服务器池的交互则会受到限制。例如:您可以使用OVM迁移技术在一个服务器池内的主机之间迁移虚拟机,但不可以将虚拟机迁移到另一个服务器池的主机上。
新建服务器资源池步骤:
1、选择数据中心—主机,建立资源池:
image009.png

 2、输入资源池名称,描述点击保存,资源池建立完毕。
image010.png


四、为服务器资源池设置分配策略
点击数据中心—资源分配,可以为虚拟资源进行配置负载均衡策略,合理调度虚拟资源,提高虚拟机性能。
image011.png

 
五、添加主机1、请确保你已经安装了OVM节点主机;
2、选择建立好的资源池,添加主机
image012.png

3、选择相应的Hypervisor,添加计算节点的IP,点击保存。
image013.png

image014.png

4、在新的弹框中在数据存储选择共享NFS存储,网络接口进行选择,之后保存,主机添加成功。
image015.png

image016.png

image017.png

 
六、主机管理
选择编辑主机,可对主机资源进行管理或修改,如主机环境有问题,可以进行操作此项。
image018.png

 
七、创建虚拟数据中心
 1、 选择主菜单栏虚拟数据中心—虚拟数据中心,点击+号添加
image019.png

2、填写名称,选择相应数据中心和Hypervisor。
image020.png

3、点击保存,虚拟数据中心添加成功。
image021.png

 
八、创建vApp
1、选择主菜单栏虚拟数据中心—vApp,点击+号,填写名称。
image022.png

2、点击保存,vApp添加成功
image023.png

 
九、通过ISO新建VM
 1、选择主菜单栏应用商店,上传ISO。
image024.png

2、上传ISO后 ,进入虚拟数据中心的vApp,在ISO选项中创建虚拟机,创建过程中可以进行资源配置建立。
image025.png

image026.png

image027.png

更多详情和项目进度可以关注官网:http://www.openvirtmanager.org/  和官网社区!

KVM虚拟机CPU绑定性能调优

大数据 Geek小A 发表了文章 0 个评论 6612 次浏览 2016-01-29 21:32 来自相关话题

关于linux 进程的处理器亲和性的vCPU 隔离和绑定之前已经做过测试,查考 ubuntu中测试进程的处理器亲和性和vCPU的绑定。查看链接:Setting KVM processor affinities 那么KVM 虚拟化下如何直接为虚拟机 ...查看全部
关于linux 进程的处理器亲和性的vCPU 隔离和绑定之前已经做过测试,查考 ubuntu中测试进程的处理器亲和性和vCPU的绑定。查看链接:Setting KVM processor affinities
那么KVM 虚拟化下如何直接为虚拟机绑定CPU 呢,KVM 提供了很方便的方法
查看所有虚拟机:
root@network:~# virsh list --all  
Id Name State
----------------------------------------------------
2 instance-000000ef running
4 instance-000000f3 running
7 instance-00000120 running
10 instance-00000146 running
11 instance-00000147 running
12 instance-00000148 running
26 instance-00000157 running
35 instance-0000015c running
38 instance-00000158 running
39 instance-0000015b running
- instance-00000122 shut off
查看虚拟机信息
root@network:~# virsh dumpxml instance-00000146  

instance-00000146
45d77d2b-723f-40c8-a953-13f886a317f8
4194304
4194304
4

/machine



OpenStack Foundation
OpenStack Nova
2014.1.3
202b2f9b-3fb8-dc11-8e76-e03f490e5d2c
45d77d2b-723f-40c8-a953-13f886a317f8


查看cvpu
root@network:~# ps -ef|grep instance-00000146  
root 21561 13180 0 14:31 pts/12 00:00:00 grep --color=auto instance-00000146
libvirt+ 31858 1 5 Jan08 ? 17:09:02 /usr/bin/qemu-system-x86_64 -name instance-00000146 -S -machine pc-i440fx-trusty,accel=kvm,usb=off -cpu Opteron_G5,+bmi1,+perfctr_nb,+perfctr_core,+topoext,+nodeid_msr,+tce,+lwp,+wdt,+skinit,+ibs,+osvw,+cr8legacy,+extapic,+cmp_legacy,+fxsr_opt,+mmxext,+osxsave,+monitor,+ht,+vme -m 4096 -realtime mlock=off -smp 4,sockets=4,cores=1,threads=1 -uuid 45d77d2b-723f-40c8-a953-13f886a317f8 -smbios type=1,manufacturer=OpenStack Foundation,product=OpenStack Nova,version=2014.1.3,serial=202b2f9b-3fb8-dc11-8e76-e03f490e5d2c,uuid=45d77d2b-723f-40c8-a953-13f886a317f8 -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/instance-00000146.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=discard -no-hpet -no-shutdown -boot strict=on -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 -drive file=/var/lib/nova/instances/45d77d2b-723f-40c8-a953-13f886a317f8/disk,if=none,id=drive-virtio-disk0,format=qcow2,cache=none -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -drive file=/var/lib/nova/instances/45d77d2b-723f-40c8-a953-13f886a317f8/disk.swap,if=none,id=drive-virtio-disk1,format=qcow2,cache=none -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=drive-virtio-disk1,id=virtio-disk1 -netdev tap,fd=25,id=hostnet0,vhost=on,vhostfd=34 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=fa:16:3e:83:8e:cf,bus=pci.0,addr=0x3 -chardev file,id=charserial0,path=/var/lib/nova/instances/45d77d2b-723f-40c8-a953-13f886a317f8/console.log -device isa-serial,chardev=charserial0,id=serial0 -chardev pty,id=charserial1 -device isa-serial,chardev=charserial1,id=serial1 -device usb-tablet,id=input0 -vnc 0.0.0.0:8 -k en-us -device cirrus-vga,id=video0,bus=pci.0,addr=0x2 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x6
root@network:~# ps -eLo ruser,pid,ppid,lwp,psr|grep 31858
libvirt+ 31858 1 31858 0
libvirt+ 31858 1 31867 6
libvirt+ 31858 1 31869 4
libvirt+ 31858 1 31871 7
libvirt+ 31858 1 31873 0
libvirt+ 31858 1 31882 7
libvirt+ 31858 1 19834 6
libvirt+ 31858 1 20272 6
libvirt+ 31858 1 20679 6
libvirt+ 31858 1 20925 6
libvirt+ 31858 1 20926 6
libvirt+ 31858 1 20927 6
libvirt+ 31858 1 20928 7
libvirt+ 31858 1 20930 6
最后一列是cpu 的编号,重复执行 ps -eLo ruser,pid,ppid,lwp,psr|grep 31858  可以看到 线程是不停在不通cpu 上漂移的,绑定这么多线程是很麻烦的
利用 virsh vcpuinfo instance-00000146  查看每个vCPU 对应物理核心(也是浮动的)
root@network:~# virsh vcpuinfo instance-00000146  
VCPU: 0
CPU: 4
State: running
CPU time: 16025.9s
CPU Affinity: yyyyyyyy 这里看到是宿主机所有物理CPU 核心,Y代表有可以使用,基于CPU时间片来回切换


VCPU: 1
CPU: 6
State: running
CPU time: 20221.3s
CPU Affinity: yyyyyyyy

VCPU: 2
CPU: 6
State: running
CPU time: 12179.5s
CPU Affinity: yyyyyyyy

VCPU: 3
CPU: 5
State: running
CPU time: 12411.4s
CPU Affinity: yyyyyyyy
绑定instance-00000146 的vcpu0 到物理cpu3
root@network:~# virsh vcpupin instance-00000146 0 3  

root@network:~# virsh vcpuinfo instance-00000146
VCPU: 0
CPU: 3
State: running
CPU time: 16033.7s
CPU Affinity: ---y---- 这里看到只有第三个cpu 为Y

VCPU: 1
CPU: 1
State: running
CPU time: 20234.7s
CPU Affinity: yyyyyyyy

VCPU: 2
CPU: 0
State: running
CPU time: 12188.5s
CPU Affinity: yyyyyyyy

VCPU: 3
CPU: 0
State: running
CPU time: 12420.2s
CPU Affinity: yyyyyyyy
依次绑定
root@network:~# virsh vcpupin instance-00000146 1 4  

root@network:~# virsh vcpupin instance-00000146 2 5

root@network:~# virsh vcpupin instance-00000146 3 6

root@network:~# virsh vcpuinfo instance-00000146
VCPU: 0
CPU: 3
State: running
CPU time: 16050.3s
CPU Affinity: ---y----

VCPU: 1
CPU: 4
State: running
CPU time: 20255.6s
CPU Affinity: ----y---

VCPU: 2
CPU: 5
State: running
CPU time: 12203.2s
CPU Affinity: -----y--

VCPU: 3
CPU: 6
State: running
CPU time: 12438.0s
CPU Affinity: ------y-

KVM之初体验-手动及自动化安装

大数据 Geek小A 发表了文章 0 个评论 3866 次浏览 2016-01-29 21:25 来自相关话题

一,什么是KVM KVM包括很多部件:首先,它是一个Linux内核模块(现在包括在主线中)用于转换处理器到一种新的用户 (guset) 模式。用户模式有自己的ring状态集合,但是特权ring0的指令会陷入到管理器(hyperviso ...查看全部


一,什么是KVM


KVM包括很多部件:首先,它是一个Linux内核模块(现在包括在主线中)用于转换处理器到一种新的用户 (guset) 模式。用户模式有自己的ring状态集合,但是特权ring0的指令会陷入到管理器(hypervisor)的代码。由于这是一个新的处理器执行模型,代 码不需要任何的改动。   除了处理器状态转换,这个内核模块同样处理很小一部分低层次的模拟,比如MMU注册(用于管理VM)和一部分PCI模拟的硬件。 在可预见的未来,Qemu团队专注于硬件模拟和可移植性,同时KVM团队专注于内核模块(如果某些部分确实有性能提升的话,KVM会将一小部分模拟代码移 进来)和与剩下的用户空间代码的交互。 kvm-qemu可执行程序像普通Qemu一样:分配RAM,加载代码,不同于重新编译或者调用calling KQemu,它创建了一个线程(这个很重要);这个线程调用KVM内核模块去切换到用户模式,并且去执行VM代码。当遇到一个特权指令,它从新切换会 KVM内核模块,该内核模块在需要的时候,像Qemu线程发信号去处理大部分的硬件仿真。 这个体系结构一个比较巧妙的一个地方就是客户代码被模拟在一个posix线程,这允许你使用通常Linux工具管理。如果你需要一个有2或者4核的虚拟 机,kvm-qemu创建2或者4个线程,每个线程调用KVM内核模块并开始执行。并发性(若果你有足够多的真实核)或者调度(如果你不管)是被通用的 Linux调度器,这个使得KVM代码量十分的小 当一起工作的时候,KVM管理CPU和MEM的访问,QEMU仿真硬件资源(硬盘,声卡,USB,等等)当QEMU单独运行时,QEMU同时模拟CPU和 硬件。


二、KVM架构


kvm基本结构有2个部分构成:
    [] kvm 驱动,现在已经是linux kernel的一个模块了。其主要负责虚拟机的创建,虚拟内存的分配,VCPU寄存器的读写以及VCPU的运行。[/][]另个组成是Qemu,用于模拟虚拟机的用户空间组件,提供I/O设备模型,访问外设的途径。[/]

kvm.jpg


三、KVM 工作原理


kvm基本工作原理概述:
用户模式的qemu利用libkvm通过ioctl进入内核模式,kvm模块未虚拟机创建虚拟内存,虚拟CPU后执行VMLAUCH指令进入客户模 式。加载Guest OS并执行。如果Guest OS 发生外部中断或者影子页表缺页之类的情况,会暂停Guest OS的执行,退出客户模式出行异常处理,之后重新进入客户模式,执行客户代码。如果发生I/O事件或者信号队列中有信号到达,就会进入用户模式处理。
如下图所示:
kvmlc.png


四、手动安装配置KVM


1.安装前的准备
1.CPU支持虚拟化(Inter-VT、AMD-V)
[root@localhost ~]# grep --color 'svm|vmx|lm' /proc/cpuinfo

相关CPU功能标志包括:
svm=安全虚拟机(AMD-V)
vmx=虚拟机x86(Inter-VT)
lm=长模式(64位支持)

2. BIOS开启CPU虚拟化支持
1)重启
2)按delete键
3) 进入BIOS开启  
2.安装虚拟化(yum配置完毕)
# yum -y install kvm python-virtinst libvirt bridge-utils
virt-manager qemu-kvm-tools virt-viewer virt-v2v qemu-kvm tunctl
[root@localhost ~]#vim /etc/sysconfig/selinux //关闭selinux
SELINUX=disabled

3.启动libvirtd
[root@localhost ~]# /etc/init.d/libvirtd start //启动
[root@localhost ~]# ps -e|grep libvirtd //查看是否启动
[root@localhost ~]#chkconfig libvirtd on
注释:永久开启!不然系统重启后不会自动启动这个服务的哟~
# virsh iface-bridge eth0 br0
注释:创建网络桥!
验证:
ifconfig br0
注释:观察IP地址是否跑到了br0网卡上! 
4.配置网络桥接
root@localhost network-script]# vi ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
BRIDGE=br0

[root@localhost network-scripts]# vi ifcfg-br0
DEVICE=br0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.0.100
GATEWAY=192.168.0.1
NETMASK=255.255.255.0
DNS1=192.168.0.1
DELAY=0

5.重启网络
[root@localhost]# service NetworkManager stop //这个关闭掉就行
停止 NetworkManager 守护进程: [确定]
注释:为什么关闭它呢~因为它和KVM桥接网卡冲突!
#chkconfig NetworkManager off
注释:永久关闭该服务!!!不然系统重启后还会自己再把这个服务开启的哟~
[root@localhost rules.d]# service network restart


6.用virt-install生成.img文件(参数含义在上一篇KVM初体验已有注释)
# virt-install --name=ubuntu1
--ram 1024 --vcpus=1
--disk path=/root/ubuntu1.img,size=10
--accelerate --cdrom /root/redhat6.4.iso
--graphics vnc,port=5920 --network bridge=br0
[root@localhost ~]# vi /etc/libvirt/qemu.conf
vnc_listen = "0.0.0.0"
user = "root" //去掉注释
group = "root" //去掉注释
dynamic_ownership = 0 //去掉注释,把1改为0

7.启动虚拟机
虚拟机使用方法:
virsh destroy 虚拟机名 #关闭虚拟机
virsh undefine 虚拟机名 #删除虚拟机
virsh start 虚拟机名 #开启虚拟机
virsh list --all 显示所有虚拟机
virsh console 虚拟机名 #连接虚拟机
手动安装完毕,现在就可以在命令行里秀操作了。


五、自动化脚本安装KVM


#!/bin/bash
echo "[1] 配置YUM"
echo "[2] 安装KVM工具"
echo "[3] 设置桥接"
echo "[4] 手动安装虚拟机"
echo "[5] 查看虚拟机"
echo "[6] 开启虚拟机"
echo "[7] 关闭虚拟机"
echo "[8] 连接虚拟机"
echo "[9] 自动安装虚拟机"
echo "[0] 退出"
read -p "type:" NUM
if [ $NUM = 0 ];then
exit;
elif [ $NUM = 1 ];then
#配置YUM
rm -rf /etc/yum.repos.d/*;
cat > /etc/yum.repos.d/yum.repo << EOF
[yum]
name=yum
enabled=1
gpgcheck=0
baseurl=ftp://192.168.0.200/rhel6.4
EOF
elif [ $NUM = 2 ];then
#安装KVM工具
LANG=en yum groupinstall "Virtualization*" -y;
elif [ $NUM = 3 ];then
#设置桥接
chkconfig NetworkManager off;
chkconfig network on;
service NetworkManager stop;
service network start;
yum install "bridge-utils" -y;
service libvirtd restart;
chkconfig libvirtd on;
virsh iface-bridge eth0 br0;
elif [ $NUM = 4 ];then
#安装虚拟机
read -p "输入虚拟机的名字:" NAME
read -p "输入虚拟及硬盘大小(G): " SIZE
read -p "输入虚拟机内存大小(M): " MEM
ping -c 1 192.168.0.200 > /dev/null
if [ $? -ne 0 ];then
echo "无法接连192.168.0.200,请检查网络!";
exit;
fi
virt-install --nographics -n $NAME --os-type=linux --os-variant=rhel6 -r $MEM --arch=x86_64 --vcpus=1 --disk path=/var/lib/libvirt/images/$NAME,size=$SIZE,format=qcow2 -w bridge=br0 -l ftp://172.16.8.100/rhel6.4 -x " console=ttyS0";
elif [ $NUM = 5 ];then
#查看虚拟机
virsh list --all
elif [ $NUM = 6 ];then
#开机
read -p "虚拟机名称: " XNAME
virsh start $XNAME;
elif [ $NUM = 7 ];then
#关闭
read -p "虚拟机名称: " XNAME &> /dev/null
virsh destroy $XNAME;
elif [ $NUM = 8 ];then
#连接虚拟机
read -p "虚拟机名称: " XNAME
virsh console $XNAME;
elif [ $NUM = 9 ];then
#自动安装虚拟机
read -p "输入虚拟机的名字:" NAME
read -p "输入虚拟及硬盘大小(G): " SIZE
read -p "输入虚拟机内存大小(M): " MEM
ping -c 1 192.168.0.200 > /dev/null
if [ $? -ne 0 ];then
echo "无法接连192.168.0.200,请检查网络!";
exit;
fi
virt-install --nographics -n $NAME --os-type=linux --os-variant=rhel6 -r $MEM --arch=x86_64 --vcpus=1 --disk path=/var/lib/libvirt/images/$NAME,size=$SIZE,format=qcow2 -w bridge=br0 -l ftp://192.168.0.200/rhel6.4 -x "ks=ftp://192.168.0.200/rhel6.4.ks console=ttyS0";


else
echo "请输入:0~4数字!";
fi
注:此脚本已基本实现KVM自动化安装的基本功能。


总结


其实KVM的安装和使用都很方便简单的,大家要理解KVM各个参数的含义。最关键的就是KVM的网络桥接的设置,但是现在KVM在某些方面还是有一定的缺陷(比如创建光驱要关机等),希望会在后续版本中有所改进,在这里大家要多看官方软件自身的文档,会有很大的帮助。


分享原文地址:http://5323197.blog.51cto.com/5313197/1738805


基于Openstack的KVM调优实战

大数据 push 发表了文章 0 个评论 8557 次浏览 2015-11-18 21:58 来自相关话题

调优背景 2015年11月上旬,CRMAPP系统所使用的KVM虚拟机的CPU使用率过高异常,达到70%以上,相同业务压力下同性能配置的Vmware虚拟机的负载却非常低,只在10%以内波动,并且发现KVM宿主机的CPU使用率也异常高。 ...查看全部


调优背景


2015年11月上旬,CRMAPP系统所使用的KVM虚拟机的CPU使用率过高异常,达到70%以上,相同业务压力下同性能配置的Vmware虚拟机的负载却非常低,只在10%以内波动,并且发现KVM宿主机的CPU使用率也异常高。
openstack_kvm.png


分析与解决


分别从以下几个方面逐一分析排查问题原因:
1、KVM的CPU虚拟模式
首先查看KVM虚拟机CPU信息如下:
openstack_kvm2.png

与Vmware虚拟机CPU相比较如下:
openstack_kvm3.png

通过比较Vmware与KVM的虚拟机CPU信息发现KVM虚拟机CPU模式存在如下几个问题:
    []缺少L3 Cache:初步分析是虚拟机CPU虚拟化模式选择不合理所导致。[/][]CPU不是NUMA架构并且CPU Topology不合理:KVM宿主机物理CPU属于NUMA多node的结构,虚拟机的CPU只有一个NUMA node,所有CPU Core都在这一个node中,且虚拟机CPU的Topology是多Socket单Core的形式。[/]
 处理措施>>>> 缺少L3 Cache
针对该问题,检查了Openstack的nova.conf配置文件libvirt部分的cpu_mode的参数配置是host-model,该参数含义是根据物理CPU的特性,选择一个最靠近的标准CPU型号进行虚拟化模拟。 除了host-model外还可以有host-passthrough模式,该模式直接将物理CPU暴露给虚拟机使用,在虚拟机上完全可以看到的就是物理CPU的型号。因Openstack 仍承载业务,选择小范围的修改cpu_mode的参数,通过将Openstack的代码文件 driver.py中cpu_mode的取值修改为host-passthrough并重启宿主机上Nova-computer服务与KVM虚拟机,将自动重新生成虚拟机的 libvirt.xml文件。
>>>> CPU不是NUMA架构并且CPU Topology不合理
经过梳理Openstack虚拟机的创建流程,并查阅Openstack官方文档与代码,发现在JUNO版的Openstack中,KVM的CPU的拓扑可以通过image或者flavor进行元数据传递来定义,如果没有特别的定义此类元数据,则模拟的CPU将是多Socket单Core单NUMA节点的CPU,这样的CPU与物理CPU完全不同。通过nova命令对flavor增加了hw:numa_cpu、hw:numa_nodes、hw:cpu_sockets等属性。
处理结果经过上面两个方面的修改后,新建KVM虚拟机的CPU的信息发生如下改变,CPU的使用率有了明显下降,在10%到20%之间波动。
    []从单个NUMA节点变成4个NUMA节点[/][]具备了L3 cache[/][]CPU的Topology从32个Socket每个Socket 1个 core,变成了4个Socket每个Socket 8个Core[/]
openstack_kvm4.png
 2、KVM宿主机与NUMA运行状况
在NUMA的CPU内存架构下,无论是物理主机还是虚拟机,如果NUMA的配置不合理对应用程序的性能都有较大的影响,并且不同类型的应用都有不同的配置需求。Vmware ESX 5.0及之后的版本支持一种叫做vNUMA的特性,它将Host的NUMA特征暴露给了GuestOS,从而使得Guest OS可以根据NUMA特征进行更高性能的调度。SUSE与Redhat作为原生的操作系统在NUMA调度上需要人为的根据应用程序的类型的做特殊配置,对云平台来说,这部分的工作是难以做到的。在优化之前,CRM APP的KVM虚拟机的NUMA调度状态非常不理想,表现为所有NUMA 节点的numa_miss统计数值大于numa_hit,这意味着CPU访问内存的路径不是优化的,存在大量CPU访问remote memory的情况。因为宿主机Ubuntu 12.02自身带有Automatic NUMA balancing,所以物理主机NUMA调度运行状态良好。
处理措施
升级KVM虚拟机的操作系统 到SUSE 12 ,因为新版本的SUSE支持Automatic NUMA balancing,并且操作系统检测到硬件属于NUMA架构时将自动开启。
处理结果
在新建的KVM虚拟机的 dmesg日志中可以看到如下信息:Enablingautomatic NUMA balancing. Configure with numa_balancing= or sysctl经过24小时的运行之后,CRMAPP的KVM虚拟机运行状态良好,CPU用率可以稳定在10%左右。
openstack_kvm5.png
同时NUMA调度也有了较大程度的改善
openstack_kvm6.png

总结

[list=1][]通过各环节的优化,目前KVM虚拟机的CPU利用率过高问题不再发生,整体运行达到Vmware虚拟机水平。[/][]不同类型的应用程序对于NUMA适应性不同,需要进行针对性优化。JAVA在NUMA方面也可尝试进行优化。参考Oracle官方文档,JAVA7针对并行扫描垃圾回收站(Parallel Scavenger garbage collector)加入了对NUMA体系结构的支持,实现了NUMA感知的内存分配器,由它为Java应用提供自动的内存分配优化。[/][]目前RedHat7与SUSE 12都加入了NUMA自动负载均衡的特性,可以尽量采用较新版本的操作系统,无论是物理机还是虚拟机,对于NUMA调度的优化不仅与KVM虚拟机有关,其实物理主机也应该关注NUMA调度是否是最优的。[/]

kvm错误整理

大数据 koyo 发表了文章 0 个评论 14291 次浏览 2015-10-21 01:26 来自相关话题

一、启动虚拟机​Connection reset by peer # virsh start vmhost1 error: Failed to start domain vmhost1 error: Unabl ...查看全部


一、启动虚拟机​Connection reset by peer


# virsh start vmhost1
error: Failed to start domain vmhost1
error: Unable to read from monitor: Connection reset by peer
在虚拟机运行过程中关闭宿主服务器就有可能导致这种情况出现,由于宿主服务器中的kvm虚拟机控制器与安装在kvm中的虚拟机会话被异常重置,所以我们可以如下解决:
# virsh managedsave-remove vmhost1
# virsh start vmhost1
如果启动查看/var/log/libvirt/qemu/vmhost1.log下log还报如下错误:
Cannot set up guest memory 'pc.ram': Cannot allocate memory
这个问题可能是分配给vmhost1分配的内存过大(甚至超过的物理主机的内存大小),或者可能是宿主机没有足够的内存分配给此虚拟机,导致无法启动!


二、重Define虚拟机时无/usr/bin/kvm


error: Failed to define domain from hostname.xml
error: Cannot find QEMU binary /usr/bin/kvm: No such file or directory
解决方法:
# ln -s /usr/libexec/qemu-kvm /usr/bin/kvm


三、error: internal error process exited while connecting to monitor


# virsh start vmhost1  
error: Failed to start domain vmhost1
error: internal error process exited while connecting to monitor: kvm: -drive file=/dev/sp1368155439693/v1368544020461,if=none,id=drive-virtio-disk0,format=qcow2: could not open disk image /dev/sp1368155439693/v1368544020461: Invalid argument
分析:镜像格式错误,用qemu-img info 检查镜像和xml配置文件中指定的type是否一致!


四、Unable to load library 'virt': libvirt.so


Unable to load library 'virt': libvirt.so: cannot open shared object file: No such file or directory

Linux下解决:
ln -s /usr/lib/libvirt.so.0 /usr/lib/libvirt.so

windows下解决:
将libvirt-0.dll改名为virt.dll


五、error: Refusing to undefine while domain managed save image exists


# virsh undefine vmhost1
error: Refusing to undefine while domain managed save image exists
http://www.redhat.com/archives/libvir-list/2011-July/msg01219.html
解决方法:virsh undefine $domain  --managed-save


六、启动libvirtd进程出错


# /usr/local/sbin/libvirtd -d -l --config /usr/local/etc/libvirt/libvirtd.conf (编译安装的启动方式)
error:/usr/local/sbin/libvirtd: initialization failed
try to install libpcap-devel RPM and rebuild libvirt http://comments.gmane.org/gmane.comp.emulators.libvirt/58218

apt-get install libpcap-dev
上面的方法好像都没有效果,但是尝试了http://wiki.libvirt.org/page/The_daemon_cannot_be_started说的,把配置文件里的
listen_tls = 0注释取消(更奇怪的问题,在我的客户端链接不对)


七、启动虚拟机报错


# virsh start vmhost1
error: Failed to start domain vmhost1
error: internal error process exited while connecting to monitor: Could not access KVM kernel module: No such file or directory
failed to initialize KVM: No such file or directory
No accelerator found!
上面的提示信息就是因为QEMU在初始化阶段因为无法找到kvm内核模块。
# modprobe kvm   #载入指定的模块
重启电脑,进入bios界面,设置advance选项里面的virtualization标签为Enabled
通过命令 lsmod | grep kvm    #显示已载入的模块


八、虚拟机迁移


# virsh migrate --live 1 qemu+tcp://192.168.0.121 --p2p --tunnelled --unsafe 
error: operation failed: Failed to connect to remote libvirt URI qemu+tcp://192.168.0.121(在URI后面加上/system,‘system’相当于root用户的访问权限)

#virsh migrate --live 2 qemu+tcp://192.168.0.121/system --p2p --tunnelled
error: Unsafe migration: Migration may lead to data corruption if disks use cache != none(加上--unsafe参数)

#virsh migrate --live 2 qemu+tcp://192.168.0.121/system --p2p --tunnelled --unsafe
error: Timed out during operation: cannot acquire state change lock (启动虚拟机有时也会遇此错误),需要重启libvirtd进程


九、virsh


error: Failed to connect socket to '/var/run/libvirt/libvirt-sock': Connection refused(libvirtd 进程没有启动,libvirtd是一个监听客户端请求的进程)

# virsh -c qemu:///system list
error: Failed to connect socket to '/var/run/libvirt/libvirt-sock': Permission denied
error: failed to connect to the hypervisor
(当前用户没有权限,修改/etc/libvirt/libvirtd.conf,unix_sock_rw_perms = 0777,使所有用户都有权限读写)

kvm虚拟机克隆过程详解

大数据 koyo 发表了文章 2 个评论 5949 次浏览 2015-10-17 18:44 来自相关话题

在使用ucloud云主机的时候,发现他们制作镜像只能克隆系统盘数据制作,这是为什么,为什么不能连数据盘一起克隆呢,然后就问了一下他们的技术人员,他们底层用的是kvm技术,因为kvm镜像制作会按照你主机空间大小块来克隆,意思就是说,比如我/ 分区大小为20G,数 ...查看全部
在使用ucloud云主机的时候,发现他们制作镜像只能克隆系统盘数据制作,这是为什么,为什么不能连数据盘一起克隆呢,然后就问了一下他们的技术人员,他们底层用的是kvm技术,因为kvm镜像制作会按照你主机空间大小块来克隆,意思就是说,比如我/ 分区大小为20G,数据盘/data分区大小为200G,然后你连着数据盘一起制作镜像的话,存在两个问题:
    []克隆镜像使用时间较长[/][]克隆出来的镜像大小较大,如上面所说的主机,那克隆出来的镜像大小为220G[/]

所以基于这种情况,ucloud的上面的云主机默认创建的主机系统磁盘大小为20G,创建镜像的时候只会克隆系统盘!所以你要做基准镜像,就需要先创建一个基准系统,安装好服务,然后做镜像,最后挂载数据盘!
 
同样我们公司内网也使用了一些kvm虚拟机作为内网的测试环境和一些服务。下面简单的记录自己的笔记,总结还是看自己的笔记比较有思路,回头看思路比较清晰!
 
查阅资料和书籍,kvm虚拟机克隆有如下两种方式:
    []KVM本机虚拟机直接克隆[/][]通过复制xml文件与磁盘文件复制克隆 (适用于异机的静态迁移和状态保存便于以后使用)。[/]
下面逐一介绍:

一、本机直接克隆

1、查看虚拟机配置文件获取磁盘文件路径
[root@kvmsuzhu2 ~]# cat /etc/libvirt/qemu/hysen_6101_101.xml |grep 'source file'|grep img      [root@kvmsuzhu2 ~]# cat /etc/libvirt/qemu/hysen_6101_101.xml |grep '^.*/name>$'  hysen_6101_101[root@kvmsuzhu2 ~]# 
克隆前确认主机已经关闭:
[root@kvmsuzhu ~]# virsh list --all Id    名称                         状态---------------------------------------------------- 3     dev_5974_74                    running 14    dev_5954_54                    running -     hysen_6101_101                 关闭 -     openstack_5978_78              关闭
不关闭则克隆会报ERROR    Domain with devices to clone must be paused or shutoff.
2、开始克隆
[root@kvmsuzhu2 ~]# virt-clone -o hysen_6101_101 -n hysen_6103_103 -f /data1/vmdisk/hysen_6103_103.img 正在克隆 hysen_6101_101.img                                                                        |  30 GB     13:55     Clone 'hysen_6103_103' created successfully.克隆已经完成30G的大小!
3、修改vnc端口号,启动主机
[root@kvmsuzhu2 ~]# cat /etc/libvirt/qemu/hysen_6103_103.xml |grep 'vnc'    [root@kvmsuzhu2 ~]# virsh edit hysen_6103_103    //这里你必须用virsh edit命令编辑配置文件,用vim编辑是不会生效的!编辑了域 hysen_6103_103 XML 配置。[root@kvmsuzhu2 ~]# cat /etc/libvirt/qemu/hysen_6103_103.xml |grep 'vnc'    [root@kvmsuzhu2 ~]# virsh start hysen_6103_103.xml域 hysen_6103_103 已开始[root@kvmsuzhu2 ~]# netstat -anltp |grep 6103tcp        0      0 0.0.0.0:6103                0.0.0.0:*                   LISTEN      13740/qemu-kvm [root@kvmsuzhu2 ~]#  
4、修改主机名、ip地址
修改主机名[root@hysen_6101_101 ~]# vi /etc/sysconfig/networkNETWORKING=yes    NETWORKING_IPV6=no     HOSTNAME=hysen_6103_103 GATEWAY=10.0.1.1[root@hysen_6101_101 ~]# hostname hysen_6103_103修改IP地址[root@hysen_6103_103 ~]# vi /etc/sysconfig/network-script/ifcfg-eth0# Virtio Network Device    DEVICE=eth0     BOOTPROTO=static     ONBOOT=yes     HWADDR=52:54:00:ae:1d:7b     IPADDR=10.0.1.117     NETMASK=255.255.255.0注意修改mac地址,有uuid的配置修改uuid配置[root@hysen_6103_103 ~]# service network start重启报错:device eth0 does not seem to be present, delaying initialization如下操作解决:[root@hysen_6103_103 ~]# rm -rf /etc/udev/rules.d/70-persistent-net.rules 有说修改文件把eth0和eth1互换的也可以![root@hysen_6103_103 ~]# reboot重启网卡服务[root@hysen_6103_103 ~]# service network start    Bringing up loopback interface:  [  OK  ]     Bringing up interface eth0:  [  OK  ]     [root@hysen_6103_103 ~]# 

二、通过复制xml文件与磁盘文件复制克隆

我们这里还是拿hysen_6101_101虚拟机作为模板机器克隆。同样这种方法也需要模板机器已经关机!1、复制xml配置文件
[root@kvmsuzhu2 ~]# virsh dumpxml hysen_6101_101 > /etc/libvirt/qemu/hysen_6105_105.xml[root@kvmsuzhu2 ~]# ls -l /etc/libvirt/qemu/hysen_6105_105.xml-rw-r--r-- 1 root root 2748 10月 17 17:50 /etc/libvirt/qemu/hysen_6105_105.xml[root@kvmsuzhu2 ~]#
2、复制hysen_6101_101虚拟机磁盘文件
[root@kvmsuzhu2 ~]# cp  /data1/vmdisk/hysen_6101_101.img  /data1/vmdisk/hysen_6105_105.img[root@kvmsuzhu2 ~]# ls /data1/vmdisk/hysen_6105_105.img/data1/vmdisk/hysen_6105_105.img[root@kvmsuzhu2 ~]# 
3、修改拷贝的配置文件
    []修改虚拟机的名称:hysen_6105_105[/][]修改uuid编号:13178d42-1055-8b94-1411-3c2bdd0e6e7a<[/][]修改mac地址:[/][]修改disk位置:[/][]修改vnc端口:[/]

此时还是将该配置文件注册进来,无法通过virsh edit进行编辑。
[root@kvmsuzhu2 ~]# vim /etc/libvirt/qemu/hysen_6105_105.xml
hysen_6101_101
13178d42-1055-8b94-1411-3c2bdd0e6e7a

4、定义新虚拟机配置文件
[root@kvmsuzhu2 ~]# virsh define /etc/libvirt/qemu/hysen_6105_105.xml 
定义域 hysen_6105_105(从 /etc/libvirt/qemu/hysen_6105_105.xml)

[root@kvmsuzhu2 ~]#
5、启动虚拟机并设置开机自启
[root@kvmsuzhu2 ~]# virsh start hysen_6105_105
域 hysen_6105_105 已开始

[root@kvmsuzhu2 ~]# virsh autostart hysen_6105_105
域 hysen_6105_105标记为自动开始

[root@kvmsuzhu2 ~]# virsh list --all |grep hysen_6105_105
237 hysen_6105_105 running
[root@kvmsuzhu2 ~]#
6、vnc连接修改主机名、ip地址
4、修改主机名、ip地址
修改主机名
[root@hysen_6101_101 ~]# vi /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=hysen_6105_105
GATEWAY=10.0.1.1
[root@hysen_6101_101 ~]# hostname hysen_6105_105

修改IP地址
[root@hysen_6105_105 ~]# vi /etc/sysconfig/network-script/ifcfg-eth0
# Virtio Network Device
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
HWADDR=54:52:01:11:12:1f
IPADDR=10.0.1.118
NETMASK=255.255.255.0

重启网卡服务
[root@hysen_6105_105 ~]# service network start
重启报错:device eth0 does not seem to be present, delaying initialization

如下操作解决:
[root@hysen_6105_105 ~]# rm -rf /etc/udev/rules.d/70-persistent-net.rules 有说修改文件把eth0和eth1互换的也可以!
[root@hysen_6105_105 ~]# reboot

重启之后再次登陆重启动网卡:
[root@hysen_6105_105 ~]# service network start
Bringing up loopback interface: [ OK ]
Bringing up interface eth0: [ OK ]
两种不同的方式有各有特点,你可以针对特点选择性使用!

kvm虚拟机怎么解决mac地址冲突

大数据 空心菜 回复了问题 3 人关注 2 个回复 7188 次浏览 2015-10-16 15:43 来自相关话题

KVM性能测试报告

大数据 Ansible 发表了文章 0 个评论 7050 次浏览 2015-09-01 11:11 来自相关话题

本测试试图找出以下问题的答案:            1. 虚拟机相对于物理机性能损失有多严重(CPU/MEM/NET/DISK)             2. 对于多个虚拟机,KVM 对资源的分配是否公正         ...查看全部
kvmlogo.gif

本测试试图找出以下问题的答案:
           1. 虚拟机相对于物理机性能损失有多严重(CPU/MEM/NET/DISK) 
           2. 对于多个虚拟机,KVM 对资源的分配是否公正
           3. 找出性能最好的物理机磁盘类型和虚拟机磁盘类型及参数 
               A) 物理机使用 ext4 的最优化设置 
                     ➔  使用 raw 磁盘的最优性能设置 
                           ➢  cache类型 
                                 • none 
                                 • writeback 
                                 • writethrough 
                           ➢  驱动类型              
                                 • ide 
                                 • virtio 
                     ➔  使用 qcow2 磁盘的最优性能设置 
                           ➢  cache类型
                                 • none        
                                 • writeback 
                                 • writethrough 
                           ➢  驱动类型 
                                 • ide 
                                 • virtio 
                           ➢  是否preallocation  
                      ➔  比较得出使用 ext4 的虚拟机磁盘类型最优化设置 
 
              B) 物理机使用xfs磁盘的最优化设置 
                      ➔  使用 raw 磁盘的最优性能设置
                            ➢  cache类型 
                                 1. none
                                 2. writeback
                                 3. writethrough
                            ➢  驱动类型 
                                  1. ide
                                  2. virtio
                      ➔  使用 qcow2 磁盘的最优性能设置
                            ➢  cache类型 
                                  1. none
                                  2. writeback
                                  3. writethrough
                            ➢  驱动类型 
                                  1. ide
                                  2. virtio
                            ➢ 是否preallocation
                      ➔ 比较得出使用 ext4 的虚拟机磁盘类型最优化设置 
  
              C) 比较得出ext4和xfs那个更优秀 


物理机配置


服务器型号:DELL R410
CPU型号:CPU:Intel(R) Xeon(R) CPU E5620 2.4G*2
内存大小:8GB
硬盘大小:300*2
网卡:Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet * 2


虚拟机配置


在测试一个参数的时候为了防止其它因素的影响,不同的测试虚拟机配置会不同


CPU 的测试


虚拟机与物理机之间的性能对比 
主要测试相对于物理机,虚拟机的性能损失有多少


虚拟机配置


1个VCPU    2G 内存    20G 硬盘
用一个寻找质数的 C 程序,分别测试找出一百万,一千万,1 亿以内的质数所用的时间 
kc1.png

kc2.png

从上面的图可以看到,KVM 虚拟机相对于物理机的 CPU 性能损失非常小(不到 1%) 
 
由于物理机是 8 核的 CPU,我们猜想是不是他们运行在各自的 CPU,所以我们分别测试了同时在 2 个,4 个,6 个,8 个和 10 个虚拟机中运行测试程序所使用的时间,得到的结果是他们使用的时间相差不大,这里是同时在 10 个虚拟机中运行测试程序找出 1 亿中的质数所使用的时间对比图,我们在最后加上了在物理机中的运行时间 
kc3.png

我们猜想当同时运行的程序数(10)多于 CPU 数(8)时会有资源争抢或资源分配不均的情况出现,从上图可以看 到 KVM 于这些处理的很好,资源利用率很高,物理机和最慢的相差不到 20 秒(6%),资源分配也比较公正 


内存 


对于内存的测试多们使用了一个程序 memtester(注意不是 memtest),它能取给定大小的内存进行读写等一系 列的测试操作 
kc4.png

从这个图可以看出,相对于物理机,虚拟机的性能损失非常小 
kc5.png

上图是两个虚拟机同时运行测试所用的时间和物理机之间的对比,可以看出 KVM 对内存资源的分配很公平 


网络


我们在连接在相同交换机的另一台服务器上搭建 Web 服务器,让测试机和虚拟机同时下载 5G 的文件 
kc6.png

从这个图可以看到,公认的性能比较好的 virtio 驱动将虚拟机的网络性能发挥到极致,和物理机不相上下 
kc7.png

这个图再一次反映了 KVM 对资源分配的公平性 
 
我们还测试了同一台物理机上的虚拟机之间的传输速度可以稳定在 122MB/s 


硬盘 


磁盘的测试花了一些时间,因为有很多因素会影响磁盘性能,这个测试也没有覆盖所有可能的因素 先上数据 
kc8.png

对表的说明: 
      • 这个表记录了不同的参数对安装一个 CentOS 到虚拟机中所用的时间的影响
      • 安装使用相同的 kickstart
      • 使用 time 命令记录安装过程所使用的时间
      • 最后一列是将前一列的时间转化为秒数
      • 第一列的 xfs 和 ext4 指宿主机的存放虚拟磁盘镜像文件的分区类型,挂载参数都使用 default
      • Raw 和 Qcow2 指虚拟机的磁盘类型
      • ide 和 virtio 指虚拟机磁盘的驱动类型
      • pre 和 nopre 只是针对 qcow2 磁盘类型,创建磁盘文件时加上参数 preallocation=metadata 既为 pre
      • none,wt,wb,分别指缓存类型为 none, writethrough, writeback
      • 虚拟机都使用 1vcpu,2G 内存,40G 磁盘
 
下面从总体上看下他们的性能如何
kc9.png

从这个图不太容易看出哪个配置使用的时间最短,但非常容易看出最耗时的一个: 
 
宿主机使用 xfs,虚拟机使用 qcow2 磁盘,ide 驱动和 writethrough 缓存类型 
 
下面我们以由小到大的顺序,找出每个区域的最高性能,然后他们之间做对比 


首先看一下不同的缓存类型对性能的影响 


kc10.png

kc11.png

从两幅图可以得到的结论是:使用 writethrough 性能最差,none 和 writeback 相差不大 
 
这里插点缓存的知识
KVM 缓存模式概览 通常,虚拟机使用宿主机上的一个文件保存它的数据,这个文件代表一个虚拟机作为正常的物理磁盘使用的虚 拟磁盘,然而,从宿主机的角度来看这个虚拟磁盘只是一个正常的数据文件并且可以对它缓存

在这种情况下,缓存是隐藏一些磁盘数据在内存中.当我们只在内存中存储上次读的数据,我们称之为读缓存,或 者 write-through 缓存.当我们还存储一些要写到硬盘的数据在内存中,在以后的某个时间再写到磁盘,我们称 之为读写缓存,或者 write-back 缓存,write-back 缓存通过将写磁盘请求缓存到高速内存中,有更高的性能,然 而它也比 write-through 更有可能丢失数据,因为后者只缓存写请求,写请求立即写到磁盘里 
 
因为磁盘 I/O 是非常重要的因素,Linux 和 Windows 系统通常使用 write-back 策略周期性的写到磁盘里,然 而,当然后虚拟化管理程序虚拟一个机器时,你可以有效的缓存一些数据两次(一次在宿主机的内在中,一次在虚 拟机的内存中),所以你可以取消宿主机对磁盘文件的缓存,让虚拟机自己管理它的缓存.些外,宿主机端的 write- back 策略很大程序上增加了数据丢失的可能性,然而,你很快会发现,新特性”barrier passing”的加入,你不用 再担心这个 


我们可以用一个图来更好的理解


kc12.png

假设传统的(没有 barrier-passing)程序:当虚拟机里的程序要写一些数据,通常数据保存到虚拟机的页缓存中. 页缓存会周期性的冲数据到虚拟磁盘设备也就是宿主机上的磁盘文件,另一方面,如果应用程序有一些非常重 要的数据要写,它可以绕过页缓存并且使用同步写方式,只有当写操作成功才返回,确保了所有的数据写到了虚 拟机的永久存储系统 
 
然而,在这一点上(写到虚拟机磁盘上)有三种可能:
         • 如果缓存策略是'writeback',数据会缓存到宿主机的页缓存中(红箭头) 
         • 如果缓存策略是'none',数据立即写到物理磁盘(灰箭头)
         • 如果缓存策略是'writethrough',数据将立即写到物理磁盘(蓝箭头) 
更多详情


下面我们看看 qcow2 磁盘使用和不使用 preallocation 的性能差异有多大 


kc13.png

从上图可以看出,不管宿主机使用 ext4 还是 xfs,虚拟机使用 ide 还是 virtio 驱动,使用 preallocation 都有性能 的提升,
这里有一个不问题:如果宿主机使用 xfs,创建 qcow2 磁盘镜像使用 preallocation 会很慢(40G 需要 8 分钟) 


下面我们来看看 ide 和 virtio 他们的性能对比 


kc14.png

很明显使用 virtio 是更明智的选择 


下面我们再看看 raw 和 qcow2 之间的对比


这里插一点 Raw 和 qcow2 的知识:
raw 的优势(能找到的相关资料太少,不知道是不是理解有误):
• 简单,并能够导出为其他虚拟机的虚拟硬盘格式
• 根据实际使用量来占用空间使用量,而非原先设定的最大值(比如设定最高 20G,而实际只使用
3G)。——需要宿主分区支持 hole(比如 ext2 ext3 ntfs 等)
• 以后能够改变空间最大值(把最高值 20G 提高到 200G,qcow2 也可以,不过要转为 raw)
• 能够直接被宿主机挂载,不用开虚拟机即可在宿主和虚拟机间进行数据传输(注意,此时虚拟机不要开)
而qcow2 的优势:
• 更小的虚拟硬盘空间(尤其是宿主分区不支持 hole 的情况下)
• optional AES encryption, zlib based compression and support of multiple VM snapshots.
原文在这里:http://www.linuxsir.org/bbs/thread368695.html 
kc15.png

从图表中可以看出,如果 qcow2 使用 preallocation, raw 的性能优势已经不是很明显 


下面看看 ext4 和 xfs 之间 的对比 


kc16.png

可以看到 ext4 性能要比 xfs 高,这可能是默认的挂载参数不能充分发挥 xfs 的性能 


最后,我们把时间最短的放到一起看到底那个最快 


kc17.png


总结 


CPU,内存都不是问题,对于硬盘,通过前面一系列的测试,我推荐使用以下配置:
• 使用 Ext4 做为宿主机磁盘格式
• 虚拟机用 qcow2+preallocation,
• 缓存使用 writeback
• 虚拟机网卡驱动使用 virtio
文章来源于网络,如果有问题联系社区相关人员!
 
 
条新动态, 点击查看
Ansible

Ansible 回答了问题 • 2015-09-24 15:38 • 2 个回复 不感兴趣

kvm虚拟机怎么解决mac地址冲突

赞同来自:

虚拟机网卡 mac 冲突的解决办法:  a.连接上虚拟机。 b.关掉冲突主机。# ifdown eth0c.修改 eth0 的 mac #sbin/ifconfig eth0 hw ether 00:AA:BB:CC:11:22 -->分一个尽量不易出现 的 ... 显示全部 »
虚拟机网卡 mac 冲突的解决办法:  a.连接上虚拟机。 b.关掉冲突主机。# ifdown eth0c.修改 eth0 的 mac #sbin/ifconfig eth0 hw ether 00:AA:BB:CC:11:22 -->分一个尽量不易出现 的 macd.修改 eth0 配置文件中的 mac vi /etc/sysconfig/network-scripts/ifcfg-eth0 Hwaddr: 00:AA:BB:CC:11:22e.重启网卡 service network restartf.我们用命令行更改的 mac 在当前生效,重启后失效,所以需要加入到开机启动。  echo “ifdown eth0”>>/etc/rc.local echo “sbin/ifconfig eth0 hw ether 00:AA:BB:CC:11:22” echo “ifup eth0”

KVM里面如何是指NAT端口转发

回复

DevOps koyo 回复了问题 2 人关注 1 个回复 2058 次浏览 2021-10-22 17:44 来自相关话题

kvm虚拟机怎么解决mac地址冲突

回复

大数据 空心菜 回复了问题 3 人关注 2 个回复 7188 次浏览 2015-10-16 15:43 来自相关话题

关于GlusterFS的可用空间

回复

大数据 OpenSkill 发起了问题 1 人关注 0 个回复 4753 次浏览 2015-07-19 11:35 来自相关话题

kvm网络桥接,宿主机网络变化,怎么动态修改宿主机里面的ip地址?

回复

大数据 OpenSkill 回复了问题 1 人关注 2 个回复 4655 次浏览 2015-07-09 14:34 来自相关话题

Bringing up interface eth0: Device eth0 does not seem to be present, delaying initialization.

回复

运维 Ansible 回复了问题 2 人关注 1 个回复 4011 次浏览 2021-03-21 22:33 来自相关话题

kvm虚拟机启动报错Unable to find security driver for model selinux

运维 OS小编 发表了文章 0 个评论 1779 次浏览 2022-05-17 15:46 来自相关话题

好久没用kvm虚拟话了,之前有台物理机配置比较高,就借助kvm虚拟化技术虚拟了几台虚拟机做实验完,但是今天启动报如下错误: [root@kvm-labs kvm]# virsh start centos7-lab ...查看全部

好久没用kvm虚拟话了,之前有台物理机配置比较高,就借助kvm虚拟化技术虚拟了几台虚拟机做实验完,但是今天启动报如下错误:


[root@kvm-labs kvm]# virsh start centos7-lab-node1
error: Failed to start domain centos7-lab-node1
error: unsupported configuration: Unable to find security driver for model selinux

根据错误提示,怀疑是系统selinux的问题,但是发现selinux是disabled,难道要强制用selinux,不合理啊。重新梳理逻辑,kvm虚拟机是可被定义的,是不是定义的配置文件中有selinux相关定义,那是不是可以去掉,经过实验还真ok,解决步骤如下。


1. 进入虚拟机配置文件目录

cd /etc/libvirt/qemu/
# 如果你构建环境修改过默认路径,根据实际情况进入

2. 编辑虚拟机配置文件

vim  centos7-lab-node1.xml

.....................
<input type='tablet' bus='usb'>
<address type='usb' bus='0' port='1'/>
</input>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>
<listen type='address' address='0.0.0.0'/>
</graphics>
<video>
<model type='cirrus' vram='16384' heads='1' primary='yes'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</memballoon>
<rng model='virtio'>
<backend model='random'>/dev/urandom</backend>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</rng>
</devices>
<seclabel type='dynamic' model='selinux' relabel='yes'/>
</domain>

如上,删除<seclabel type='dynamic' model='selinux' relabel='yes'/> , 然后保存退出。


3. 重新定义配置文件

virsh define ./centos7-lab-node1.xml

然后重新执行virsh start centos7-lab-node1 就可以了。


如果想迁移虚拟机的存储路径也可以关机,修改配置文件下的存储路径,并将.qcow2文件移动到相应的目录下即可.


<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/data/kvmdata/centos7-lab-node1.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</disk>

修改完成后,然后重新定义配置文件,重启虚拟机即可。

商业级开源虚拟化管理平台OVM

开源项目 空心菜 发表了文章 2 个评论 8511 次浏览 2016-04-26 20:44 来自相关话题

开源的虚拟化管理平台也有很多,比如OpenStack、Cloudstack OpenNebula、oVirt/RHEV、ZStack等,为什么还要自行研发开发呢,因为这些都不够简单和易用,功能不够全面。而OVM得出发点就是简单、易玩! ...查看全部
开源的虚拟化管理平台也有很多,比如OpenStack、Cloudstack OpenNebula、oVirt/RHEV、ZStack等,为什么还要自行研发开发呢,因为这些都不够简单和易用,功能不够全面。而OVM得出发点就是简单、易玩!

经历了一年来一个虚拟化的开源管理平台OVM-(Open Virtual Manager )终于诞生了。OVM作为开源虚拟化管理平台以做最好用的虚拟化管理平台为目标。面向中小型虚拟化环境,打造简单易用的虚拟化和管理平台。 让零基础的用户在几个小时内可以部署、使用自己的虚拟化系统。主要特性就是简单、易部署。
 
具体的安装下载参考:http://www.openvirtmanager.org/install.html​ 
 
下面就让我们来体验初恋般的感觉,OVM具有魅力,我们可以怎么使用?!!!
 
一、使用Web客户端登录OVM
OVM安装配置完成后,您可以使用FireFox浏览器或Google浏览器访问OVM用户界面。
前提条件:
          您必须具有在系统配置期间创建的系统管理员用户名和密码(系统默认用户名为admin、默认密码为password。
步骤:
    []打开Web 浏览器,并导航到http://管理平台ip[/][]输入系统管理员用户名和密码(系统默认为admin、password),并单击登录。[/]

image001.png

OVM将带您进入到虚拟化与云的世界。
 
二、新建数据中心
    []OVM数据中心支持管理私有的数据中心和公有云资源。[/][]OVM通过远程服务模块管理数据中心和公有云。[/]

image005.png

新建数据中心步骤:
1、选择添加内部虚拟中心,弹出对话框,由于各个组件使用all-in-one安装,所以输入管理平台IP,重复IP,免除重复操作。
image006.png

2、检查所有IP,如果安装没有问题,检查会顺利通过。
image007.png

3、点击保存,内部数据中心建立完毕。
imag8.png

 
三、新建服务器资源池
服务器池是物理主机的主要容器,通常要把主机(即物理服务器)添加到服务器池。

数据中心可包含多个服务器池,一般全国性的集团公司或跨国公司会使用多个服务器池来表示企业内的组织结构。

服务器池的对象可以交互,但不同服务器池的交互则会受到限制。例如:您可以使用OVM迁移技术在一个服务器池内的主机之间迁移虚拟机,但不可以将虚拟机迁移到另一个服务器池的主机上。
新建服务器资源池步骤:
1、选择数据中心—主机,建立资源池:
image009.png

 2、输入资源池名称,描述点击保存,资源池建立完毕。
image010.png


四、为服务器资源池设置分配策略
点击数据中心—资源分配,可以为虚拟资源进行配置负载均衡策略,合理调度虚拟资源,提高虚拟机性能。
image011.png

 
五、添加主机1、请确保你已经安装了OVM节点主机;
2、选择建立好的资源池,添加主机
image012.png

3、选择相应的Hypervisor,添加计算节点的IP,点击保存。
image013.png

image014.png

4、在新的弹框中在数据存储选择共享NFS存储,网络接口进行选择,之后保存,主机添加成功。
image015.png

image016.png

image017.png

 
六、主机管理
选择编辑主机,可对主机资源进行管理或修改,如主机环境有问题,可以进行操作此项。
image018.png

 
七、创建虚拟数据中心
 1、 选择主菜单栏虚拟数据中心—虚拟数据中心,点击+号添加
image019.png

2、填写名称,选择相应数据中心和Hypervisor。
image020.png

3、点击保存,虚拟数据中心添加成功。
image021.png

 
八、创建vApp
1、选择主菜单栏虚拟数据中心—vApp,点击+号,填写名称。
image022.png

2、点击保存,vApp添加成功
image023.png

 
九、通过ISO新建VM
 1、选择主菜单栏应用商店,上传ISO。
image024.png

2、上传ISO后 ,进入虚拟数据中心的vApp,在ISO选项中创建虚拟机,创建过程中可以进行资源配置建立。
image025.png

image026.png

image027.png

更多详情和项目进度可以关注官网:http://www.openvirtmanager.org/  和官网社区!

KVM虚拟机CPU绑定性能调优

大数据 Geek小A 发表了文章 0 个评论 6612 次浏览 2016-01-29 21:32 来自相关话题

关于linux 进程的处理器亲和性的vCPU 隔离和绑定之前已经做过测试,查考 ubuntu中测试进程的处理器亲和性和vCPU的绑定。查看链接:Setting KVM processor affinities 那么KVM 虚拟化下如何直接为虚拟机 ...查看全部
关于linux 进程的处理器亲和性的vCPU 隔离和绑定之前已经做过测试,查考 ubuntu中测试进程的处理器亲和性和vCPU的绑定。查看链接:Setting KVM processor affinities
那么KVM 虚拟化下如何直接为虚拟机绑定CPU 呢,KVM 提供了很方便的方法
查看所有虚拟机:
root@network:~# virsh list --all  
Id Name State
----------------------------------------------------
2 instance-000000ef running
4 instance-000000f3 running
7 instance-00000120 running
10 instance-00000146 running
11 instance-00000147 running
12 instance-00000148 running
26 instance-00000157 running
35 instance-0000015c running
38 instance-00000158 running
39 instance-0000015b running
- instance-00000122 shut off
查看虚拟机信息
root@network:~# virsh dumpxml instance-00000146  

instance-00000146
45d77d2b-723f-40c8-a953-13f886a317f8
4194304
4194304
4

/machine



OpenStack Foundation
OpenStack Nova
2014.1.3
202b2f9b-3fb8-dc11-8e76-e03f490e5d2c
45d77d2b-723f-40c8-a953-13f886a317f8


查看cvpu
root@network:~# ps -ef|grep instance-00000146  
root 21561 13180 0 14:31 pts/12 00:00:00 grep --color=auto instance-00000146
libvirt+ 31858 1 5 Jan08 ? 17:09:02 /usr/bin/qemu-system-x86_64 -name instance-00000146 -S -machine pc-i440fx-trusty,accel=kvm,usb=off -cpu Opteron_G5,+bmi1,+perfctr_nb,+perfctr_core,+topoext,+nodeid_msr,+tce,+lwp,+wdt,+skinit,+ibs,+osvw,+cr8legacy,+extapic,+cmp_legacy,+fxsr_opt,+mmxext,+osxsave,+monitor,+ht,+vme -m 4096 -realtime mlock=off -smp 4,sockets=4,cores=1,threads=1 -uuid 45d77d2b-723f-40c8-a953-13f886a317f8 -smbios type=1,manufacturer=OpenStack Foundation,product=OpenStack Nova,version=2014.1.3,serial=202b2f9b-3fb8-dc11-8e76-e03f490e5d2c,uuid=45d77d2b-723f-40c8-a953-13f886a317f8 -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/instance-00000146.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=discard -no-hpet -no-shutdown -boot strict=on -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 -drive file=/var/lib/nova/instances/45d77d2b-723f-40c8-a953-13f886a317f8/disk,if=none,id=drive-virtio-disk0,format=qcow2,cache=none -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -drive file=/var/lib/nova/instances/45d77d2b-723f-40c8-a953-13f886a317f8/disk.swap,if=none,id=drive-virtio-disk1,format=qcow2,cache=none -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x5,drive=drive-virtio-disk1,id=virtio-disk1 -netdev tap,fd=25,id=hostnet0,vhost=on,vhostfd=34 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=fa:16:3e:83:8e:cf,bus=pci.0,addr=0x3 -chardev file,id=charserial0,path=/var/lib/nova/instances/45d77d2b-723f-40c8-a953-13f886a317f8/console.log -device isa-serial,chardev=charserial0,id=serial0 -chardev pty,id=charserial1 -device isa-serial,chardev=charserial1,id=serial1 -device usb-tablet,id=input0 -vnc 0.0.0.0:8 -k en-us -device cirrus-vga,id=video0,bus=pci.0,addr=0x2 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x6
root@network:~# ps -eLo ruser,pid,ppid,lwp,psr|grep 31858
libvirt+ 31858 1 31858 0
libvirt+ 31858 1 31867 6
libvirt+ 31858 1 31869 4
libvirt+ 31858 1 31871 7
libvirt+ 31858 1 31873 0
libvirt+ 31858 1 31882 7
libvirt+ 31858 1 19834 6
libvirt+ 31858 1 20272 6
libvirt+ 31858 1 20679 6
libvirt+ 31858 1 20925 6
libvirt+ 31858 1 20926 6
libvirt+ 31858 1 20927 6
libvirt+ 31858 1 20928 7
libvirt+ 31858 1 20930 6
最后一列是cpu 的编号,重复执行 ps -eLo ruser,pid,ppid,lwp,psr|grep 31858  可以看到 线程是不停在不通cpu 上漂移的,绑定这么多线程是很麻烦的
利用 virsh vcpuinfo instance-00000146  查看每个vCPU 对应物理核心(也是浮动的)
root@network:~# virsh vcpuinfo instance-00000146  
VCPU: 0
CPU: 4
State: running
CPU time: 16025.9s
CPU Affinity: yyyyyyyy 这里看到是宿主机所有物理CPU 核心,Y代表有可以使用,基于CPU时间片来回切换


VCPU: 1
CPU: 6
State: running
CPU time: 20221.3s
CPU Affinity: yyyyyyyy

VCPU: 2
CPU: 6
State: running
CPU time: 12179.5s
CPU Affinity: yyyyyyyy

VCPU: 3
CPU: 5
State: running
CPU time: 12411.4s
CPU Affinity: yyyyyyyy
绑定instance-00000146 的vcpu0 到物理cpu3
root@network:~# virsh vcpupin instance-00000146 0 3  

root@network:~# virsh vcpuinfo instance-00000146
VCPU: 0
CPU: 3
State: running
CPU time: 16033.7s
CPU Affinity: ---y---- 这里看到只有第三个cpu 为Y

VCPU: 1
CPU: 1
State: running
CPU time: 20234.7s
CPU Affinity: yyyyyyyy

VCPU: 2
CPU: 0
State: running
CPU time: 12188.5s
CPU Affinity: yyyyyyyy

VCPU: 3
CPU: 0
State: running
CPU time: 12420.2s
CPU Affinity: yyyyyyyy
依次绑定
root@network:~# virsh vcpupin instance-00000146 1 4  

root@network:~# virsh vcpupin instance-00000146 2 5

root@network:~# virsh vcpupin instance-00000146 3 6

root@network:~# virsh vcpuinfo instance-00000146
VCPU: 0
CPU: 3
State: running
CPU time: 16050.3s
CPU Affinity: ---y----

VCPU: 1
CPU: 4
State: running
CPU time: 20255.6s
CPU Affinity: ----y---

VCPU: 2
CPU: 5
State: running
CPU time: 12203.2s
CPU Affinity: -----y--

VCPU: 3
CPU: 6
State: running
CPU time: 12438.0s
CPU Affinity: ------y-

KVM之初体验-手动及自动化安装

大数据 Geek小A 发表了文章 0 个评论 3866 次浏览 2016-01-29 21:25 来自相关话题

一,什么是KVM KVM包括很多部件:首先,它是一个Linux内核模块(现在包括在主线中)用于转换处理器到一种新的用户 (guset) 模式。用户模式有自己的ring状态集合,但是特权ring0的指令会陷入到管理器(hyperviso ...查看全部


一,什么是KVM


KVM包括很多部件:首先,它是一个Linux内核模块(现在包括在主线中)用于转换处理器到一种新的用户 (guset) 模式。用户模式有自己的ring状态集合,但是特权ring0的指令会陷入到管理器(hypervisor)的代码。由于这是一个新的处理器执行模型,代 码不需要任何的改动。   除了处理器状态转换,这个内核模块同样处理很小一部分低层次的模拟,比如MMU注册(用于管理VM)和一部分PCI模拟的硬件。 在可预见的未来,Qemu团队专注于硬件模拟和可移植性,同时KVM团队专注于内核模块(如果某些部分确实有性能提升的话,KVM会将一小部分模拟代码移 进来)和与剩下的用户空间代码的交互。 kvm-qemu可执行程序像普通Qemu一样:分配RAM,加载代码,不同于重新编译或者调用calling KQemu,它创建了一个线程(这个很重要);这个线程调用KVM内核模块去切换到用户模式,并且去执行VM代码。当遇到一个特权指令,它从新切换会 KVM内核模块,该内核模块在需要的时候,像Qemu线程发信号去处理大部分的硬件仿真。 这个体系结构一个比较巧妙的一个地方就是客户代码被模拟在一个posix线程,这允许你使用通常Linux工具管理。如果你需要一个有2或者4核的虚拟 机,kvm-qemu创建2或者4个线程,每个线程调用KVM内核模块并开始执行。并发性(若果你有足够多的真实核)或者调度(如果你不管)是被通用的 Linux调度器,这个使得KVM代码量十分的小 当一起工作的时候,KVM管理CPU和MEM的访问,QEMU仿真硬件资源(硬盘,声卡,USB,等等)当QEMU单独运行时,QEMU同时模拟CPU和 硬件。


二、KVM架构


kvm基本结构有2个部分构成:
    [] kvm 驱动,现在已经是linux kernel的一个模块了。其主要负责虚拟机的创建,虚拟内存的分配,VCPU寄存器的读写以及VCPU的运行。[/][]另个组成是Qemu,用于模拟虚拟机的用户空间组件,提供I/O设备模型,访问外设的途径。[/]

kvm.jpg


三、KVM 工作原理


kvm基本工作原理概述:
用户模式的qemu利用libkvm通过ioctl进入内核模式,kvm模块未虚拟机创建虚拟内存,虚拟CPU后执行VMLAUCH指令进入客户模 式。加载Guest OS并执行。如果Guest OS 发生外部中断或者影子页表缺页之类的情况,会暂停Guest OS的执行,退出客户模式出行异常处理,之后重新进入客户模式,执行客户代码。如果发生I/O事件或者信号队列中有信号到达,就会进入用户模式处理。
如下图所示:
kvmlc.png


四、手动安装配置KVM


1.安装前的准备
1.CPU支持虚拟化(Inter-VT、AMD-V)
[root@localhost ~]# grep --color 'svm|vmx|lm' /proc/cpuinfo

相关CPU功能标志包括:
svm=安全虚拟机(AMD-V)
vmx=虚拟机x86(Inter-VT)
lm=长模式(64位支持)

2. BIOS开启CPU虚拟化支持
1)重启
2)按delete键
3) 进入BIOS开启  
2.安装虚拟化(yum配置完毕)
# yum -y install kvm python-virtinst libvirt bridge-utils
virt-manager qemu-kvm-tools virt-viewer virt-v2v qemu-kvm tunctl
[root@localhost ~]#vim /etc/sysconfig/selinux //关闭selinux
SELINUX=disabled

3.启动libvirtd
[root@localhost ~]# /etc/init.d/libvirtd start //启动
[root@localhost ~]# ps -e|grep libvirtd //查看是否启动
[root@localhost ~]#chkconfig libvirtd on
注释:永久开启!不然系统重启后不会自动启动这个服务的哟~
# virsh iface-bridge eth0 br0
注释:创建网络桥!
验证:
ifconfig br0
注释:观察IP地址是否跑到了br0网卡上! 
4.配置网络桥接
root@localhost network-script]# vi ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
BRIDGE=br0

[root@localhost network-scripts]# vi ifcfg-br0
DEVICE=br0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.0.100
GATEWAY=192.168.0.1
NETMASK=255.255.255.0
DNS1=192.168.0.1
DELAY=0

5.重启网络
[root@localhost]# service NetworkManager stop //这个关闭掉就行
停止 NetworkManager 守护进程: [确定]
注释:为什么关闭它呢~因为它和KVM桥接网卡冲突!
#chkconfig NetworkManager off
注释:永久关闭该服务!!!不然系统重启后还会自己再把这个服务开启的哟~
[root@localhost rules.d]# service network restart


6.用virt-install生成.img文件(参数含义在上一篇KVM初体验已有注释)
# virt-install --name=ubuntu1
--ram 1024 --vcpus=1
--disk path=/root/ubuntu1.img,size=10
--accelerate --cdrom /root/redhat6.4.iso
--graphics vnc,port=5920 --network bridge=br0
[root@localhost ~]# vi /etc/libvirt/qemu.conf
vnc_listen = "0.0.0.0"
user = "root" //去掉注释
group = "root" //去掉注释
dynamic_ownership = 0 //去掉注释,把1改为0

7.启动虚拟机
虚拟机使用方法:
virsh destroy 虚拟机名 #关闭虚拟机
virsh undefine 虚拟机名 #删除虚拟机
virsh start 虚拟机名 #开启虚拟机
virsh list --all 显示所有虚拟机
virsh console 虚拟机名 #连接虚拟机
手动安装完毕,现在就可以在命令行里秀操作了。


五、自动化脚本安装KVM


#!/bin/bash
echo "[1] 配置YUM"
echo "[2] 安装KVM工具"
echo "[3] 设置桥接"
echo "[4] 手动安装虚拟机"
echo "[5] 查看虚拟机"
echo "[6] 开启虚拟机"
echo "[7] 关闭虚拟机"
echo "[8] 连接虚拟机"
echo "[9] 自动安装虚拟机"
echo "[0] 退出"
read -p "type:" NUM
if [ $NUM = 0 ];then
exit;
elif [ $NUM = 1 ];then
#配置YUM
rm -rf /etc/yum.repos.d/*;
cat > /etc/yum.repos.d/yum.repo << EOF
[yum]
name=yum
enabled=1
gpgcheck=0
baseurl=ftp://192.168.0.200/rhel6.4
EOF
elif [ $NUM = 2 ];then
#安装KVM工具
LANG=en yum groupinstall "Virtualization*" -y;
elif [ $NUM = 3 ];then
#设置桥接
chkconfig NetworkManager off;
chkconfig network on;
service NetworkManager stop;
service network start;
yum install "bridge-utils" -y;
service libvirtd restart;
chkconfig libvirtd on;
virsh iface-bridge eth0 br0;
elif [ $NUM = 4 ];then
#安装虚拟机
read -p "输入虚拟机的名字:" NAME
read -p "输入虚拟及硬盘大小(G): " SIZE
read -p "输入虚拟机内存大小(M): " MEM
ping -c 1 192.168.0.200 > /dev/null
if [ $? -ne 0 ];then
echo "无法接连192.168.0.200,请检查网络!";
exit;
fi
virt-install --nographics -n $NAME --os-type=linux --os-variant=rhel6 -r $MEM --arch=x86_64 --vcpus=1 --disk path=/var/lib/libvirt/images/$NAME,size=$SIZE,format=qcow2 -w bridge=br0 -l ftp://172.16.8.100/rhel6.4 -x " console=ttyS0";
elif [ $NUM = 5 ];then
#查看虚拟机
virsh list --all
elif [ $NUM = 6 ];then
#开机
read -p "虚拟机名称: " XNAME
virsh start $XNAME;
elif [ $NUM = 7 ];then
#关闭
read -p "虚拟机名称: " XNAME &> /dev/null
virsh destroy $XNAME;
elif [ $NUM = 8 ];then
#连接虚拟机
read -p "虚拟机名称: " XNAME
virsh console $XNAME;
elif [ $NUM = 9 ];then
#自动安装虚拟机
read -p "输入虚拟机的名字:" NAME
read -p "输入虚拟及硬盘大小(G): " SIZE
read -p "输入虚拟机内存大小(M): " MEM
ping -c 1 192.168.0.200 > /dev/null
if [ $? -ne 0 ];then
echo "无法接连192.168.0.200,请检查网络!";
exit;
fi
virt-install --nographics -n $NAME --os-type=linux --os-variant=rhel6 -r $MEM --arch=x86_64 --vcpus=1 --disk path=/var/lib/libvirt/images/$NAME,size=$SIZE,format=qcow2 -w bridge=br0 -l ftp://192.168.0.200/rhel6.4 -x "ks=ftp://192.168.0.200/rhel6.4.ks console=ttyS0";


else
echo "请输入:0~4数字!";
fi
注:此脚本已基本实现KVM自动化安装的基本功能。


总结


其实KVM的安装和使用都很方便简单的,大家要理解KVM各个参数的含义。最关键的就是KVM的网络桥接的设置,但是现在KVM在某些方面还是有一定的缺陷(比如创建光驱要关机等),希望会在后续版本中有所改进,在这里大家要多看官方软件自身的文档,会有很大的帮助。


分享原文地址:http://5323197.blog.51cto.com/5313197/1738805


基于Openstack的KVM调优实战

大数据 push 发表了文章 0 个评论 8557 次浏览 2015-11-18 21:58 来自相关话题

调优背景 2015年11月上旬,CRMAPP系统所使用的KVM虚拟机的CPU使用率过高异常,达到70%以上,相同业务压力下同性能配置的Vmware虚拟机的负载却非常低,只在10%以内波动,并且发现KVM宿主机的CPU使用率也异常高。 ...查看全部


调优背景


2015年11月上旬,CRMAPP系统所使用的KVM虚拟机的CPU使用率过高异常,达到70%以上,相同业务压力下同性能配置的Vmware虚拟机的负载却非常低,只在10%以内波动,并且发现KVM宿主机的CPU使用率也异常高。
openstack_kvm.png


分析与解决


分别从以下几个方面逐一分析排查问题原因:
1、KVM的CPU虚拟模式
首先查看KVM虚拟机CPU信息如下:
openstack_kvm2.png

与Vmware虚拟机CPU相比较如下:
openstack_kvm3.png

通过比较Vmware与KVM的虚拟机CPU信息发现KVM虚拟机CPU模式存在如下几个问题:
    []缺少L3 Cache:初步分析是虚拟机CPU虚拟化模式选择不合理所导致。[/][]CPU不是NUMA架构并且CPU Topology不合理:KVM宿主机物理CPU属于NUMA多node的结构,虚拟机的CPU只有一个NUMA node,所有CPU Core都在这一个node中,且虚拟机CPU的Topology是多Socket单Core的形式。[/]
 处理措施>>>> 缺少L3 Cache
针对该问题,检查了Openstack的nova.conf配置文件libvirt部分的cpu_mode的参数配置是host-model,该参数含义是根据物理CPU的特性,选择一个最靠近的标准CPU型号进行虚拟化模拟。 除了host-model外还可以有host-passthrough模式,该模式直接将物理CPU暴露给虚拟机使用,在虚拟机上完全可以看到的就是物理CPU的型号。因Openstack 仍承载业务,选择小范围的修改cpu_mode的参数,通过将Openstack的代码文件 driver.py中cpu_mode的取值修改为host-passthrough并重启宿主机上Nova-computer服务与KVM虚拟机,将自动重新生成虚拟机的 libvirt.xml文件。
>>>> CPU不是NUMA架构并且CPU Topology不合理
经过梳理Openstack虚拟机的创建流程,并查阅Openstack官方文档与代码,发现在JUNO版的Openstack中,KVM的CPU的拓扑可以通过image或者flavor进行元数据传递来定义,如果没有特别的定义此类元数据,则模拟的CPU将是多Socket单Core单NUMA节点的CPU,这样的CPU与物理CPU完全不同。通过nova命令对flavor增加了hw:numa_cpu、hw:numa_nodes、hw:cpu_sockets等属性。
处理结果经过上面两个方面的修改后,新建KVM虚拟机的CPU的信息发生如下改变,CPU的使用率有了明显下降,在10%到20%之间波动。
    []从单个NUMA节点变成4个NUMA节点[/][]具备了L3 cache[/][]CPU的Topology从32个Socket每个Socket 1个 core,变成了4个Socket每个Socket 8个Core[/]
openstack_kvm4.png
 2、KVM宿主机与NUMA运行状况
在NUMA的CPU内存架构下,无论是物理主机还是虚拟机,如果NUMA的配置不合理对应用程序的性能都有较大的影响,并且不同类型的应用都有不同的配置需求。Vmware ESX 5.0及之后的版本支持一种叫做vNUMA的特性,它将Host的NUMA特征暴露给了GuestOS,从而使得Guest OS可以根据NUMA特征进行更高性能的调度。SUSE与Redhat作为原生的操作系统在NUMA调度上需要人为的根据应用程序的类型的做特殊配置,对云平台来说,这部分的工作是难以做到的。在优化之前,CRM APP的KVM虚拟机的NUMA调度状态非常不理想,表现为所有NUMA 节点的numa_miss统计数值大于numa_hit,这意味着CPU访问内存的路径不是优化的,存在大量CPU访问remote memory的情况。因为宿主机Ubuntu 12.02自身带有Automatic NUMA balancing,所以物理主机NUMA调度运行状态良好。
处理措施
升级KVM虚拟机的操作系统 到SUSE 12 ,因为新版本的SUSE支持Automatic NUMA balancing,并且操作系统检测到硬件属于NUMA架构时将自动开启。
处理结果
在新建的KVM虚拟机的 dmesg日志中可以看到如下信息:Enablingautomatic NUMA balancing. Configure with numa_balancing= or sysctl经过24小时的运行之后,CRMAPP的KVM虚拟机运行状态良好,CPU用率可以稳定在10%左右。
openstack_kvm5.png
同时NUMA调度也有了较大程度的改善
openstack_kvm6.png

总结

[list=1][]通过各环节的优化,目前KVM虚拟机的CPU利用率过高问题不再发生,整体运行达到Vmware虚拟机水平。[/][]不同类型的应用程序对于NUMA适应性不同,需要进行针对性优化。JAVA在NUMA方面也可尝试进行优化。参考Oracle官方文档,JAVA7针对并行扫描垃圾回收站(Parallel Scavenger garbage collector)加入了对NUMA体系结构的支持,实现了NUMA感知的内存分配器,由它为Java应用提供自动的内存分配优化。[/][]目前RedHat7与SUSE 12都加入了NUMA自动负载均衡的特性,可以尽量采用较新版本的操作系统,无论是物理机还是虚拟机,对于NUMA调度的优化不仅与KVM虚拟机有关,其实物理主机也应该关注NUMA调度是否是最优的。[/]

kvm错误整理

大数据 koyo 发表了文章 0 个评论 14291 次浏览 2015-10-21 01:26 来自相关话题

一、启动虚拟机​Connection reset by peer # virsh start vmhost1 error: Failed to start domain vmhost1 error: Unabl ...查看全部


一、启动虚拟机​Connection reset by peer


# virsh start vmhost1
error: Failed to start domain vmhost1
error: Unable to read from monitor: Connection reset by peer
在虚拟机运行过程中关闭宿主服务器就有可能导致这种情况出现,由于宿主服务器中的kvm虚拟机控制器与安装在kvm中的虚拟机会话被异常重置,所以我们可以如下解决:
# virsh managedsave-remove vmhost1
# virsh start vmhost1
如果启动查看/var/log/libvirt/qemu/vmhost1.log下log还报如下错误:
Cannot set up guest memory 'pc.ram': Cannot allocate memory
这个问题可能是分配给vmhost1分配的内存过大(甚至超过的物理主机的内存大小),或者可能是宿主机没有足够的内存分配给此虚拟机,导致无法启动!


二、重Define虚拟机时无/usr/bin/kvm


error: Failed to define domain from hostname.xml
error: Cannot find QEMU binary /usr/bin/kvm: No such file or directory
解决方法:
# ln -s /usr/libexec/qemu-kvm /usr/bin/kvm


三、error: internal error process exited while connecting to monitor


# virsh start vmhost1  
error: Failed to start domain vmhost1
error: internal error process exited while connecting to monitor: kvm: -drive file=/dev/sp1368155439693/v1368544020461,if=none,id=drive-virtio-disk0,format=qcow2: could not open disk image /dev/sp1368155439693/v1368544020461: Invalid argument
分析:镜像格式错误,用qemu-img info 检查镜像和xml配置文件中指定的type是否一致!


四、Unable to load library 'virt': libvirt.so


Unable to load library 'virt': libvirt.so: cannot open shared object file: No such file or directory

Linux下解决:
ln -s /usr/lib/libvirt.so.0 /usr/lib/libvirt.so

windows下解决:
将libvirt-0.dll改名为virt.dll


五、error: Refusing to undefine while domain managed save image exists


# virsh undefine vmhost1
error: Refusing to undefine while domain managed save image exists
http://www.redhat.com/archives/libvir-list/2011-July/msg01219.html
解决方法:virsh undefine $domain  --managed-save


六、启动libvirtd进程出错


# /usr/local/sbin/libvirtd -d -l --config /usr/local/etc/libvirt/libvirtd.conf (编译安装的启动方式)
error:/usr/local/sbin/libvirtd: initialization failed
try to install libpcap-devel RPM and rebuild libvirt http://comments.gmane.org/gmane.comp.emulators.libvirt/58218

apt-get install libpcap-dev
上面的方法好像都没有效果,但是尝试了http://wiki.libvirt.org/page/The_daemon_cannot_be_started说的,把配置文件里的
listen_tls = 0注释取消(更奇怪的问题,在我的客户端链接不对)


七、启动虚拟机报错


# virsh start vmhost1
error: Failed to start domain vmhost1
error: internal error process exited while connecting to monitor: Could not access KVM kernel module: No such file or directory
failed to initialize KVM: No such file or directory
No accelerator found!
上面的提示信息就是因为QEMU在初始化阶段因为无法找到kvm内核模块。
# modprobe kvm   #载入指定的模块
重启电脑,进入bios界面,设置advance选项里面的virtualization标签为Enabled
通过命令 lsmod | grep kvm    #显示已载入的模块


八、虚拟机迁移


# virsh migrate --live 1 qemu+tcp://192.168.0.121 --p2p --tunnelled --unsafe 
error: operation failed: Failed to connect to remote libvirt URI qemu+tcp://192.168.0.121(在URI后面加上/system,‘system’相当于root用户的访问权限)

#virsh migrate --live 2 qemu+tcp://192.168.0.121/system --p2p --tunnelled
error: Unsafe migration: Migration may lead to data corruption if disks use cache != none(加上--unsafe参数)

#virsh migrate --live 2 qemu+tcp://192.168.0.121/system --p2p --tunnelled --unsafe
error: Timed out during operation: cannot acquire state change lock (启动虚拟机有时也会遇此错误),需要重启libvirtd进程


九、virsh


error: Failed to connect socket to '/var/run/libvirt/libvirt-sock': Connection refused(libvirtd 进程没有启动,libvirtd是一个监听客户端请求的进程)

# virsh -c qemu:///system list
error: Failed to connect socket to '/var/run/libvirt/libvirt-sock': Permission denied
error: failed to connect to the hypervisor
(当前用户没有权限,修改/etc/libvirt/libvirtd.conf,unix_sock_rw_perms = 0777,使所有用户都有权限读写)

kvm虚拟机克隆过程详解

大数据 koyo 发表了文章 2 个评论 5949 次浏览 2015-10-17 18:44 来自相关话题

在使用ucloud云主机的时候,发现他们制作镜像只能克隆系统盘数据制作,这是为什么,为什么不能连数据盘一起克隆呢,然后就问了一下他们的技术人员,他们底层用的是kvm技术,因为kvm镜像制作会按照你主机空间大小块来克隆,意思就是说,比如我/ 分区大小为20G,数 ...查看全部
在使用ucloud云主机的时候,发现他们制作镜像只能克隆系统盘数据制作,这是为什么,为什么不能连数据盘一起克隆呢,然后就问了一下他们的技术人员,他们底层用的是kvm技术,因为kvm镜像制作会按照你主机空间大小块来克隆,意思就是说,比如我/ 分区大小为20G,数据盘/data分区大小为200G,然后你连着数据盘一起制作镜像的话,存在两个问题:
    []克隆镜像使用时间较长[/][]克隆出来的镜像大小较大,如上面所说的主机,那克隆出来的镜像大小为220G[/]

所以基于这种情况,ucloud的上面的云主机默认创建的主机系统磁盘大小为20G,创建镜像的时候只会克隆系统盘!所以你要做基准镜像,就需要先创建一个基准系统,安装好服务,然后做镜像,最后挂载数据盘!
 
同样我们公司内网也使用了一些kvm虚拟机作为内网的测试环境和一些服务。下面简单的记录自己的笔记,总结还是看自己的笔记比较有思路,回头看思路比较清晰!
 
查阅资料和书籍,kvm虚拟机克隆有如下两种方式:
    []KVM本机虚拟机直接克隆[/][]通过复制xml文件与磁盘文件复制克隆 (适用于异机的静态迁移和状态保存便于以后使用)。[/]
下面逐一介绍:

一、本机直接克隆

1、查看虚拟机配置文件获取磁盘文件路径
[root@kvmsuzhu2 ~]# cat /etc/libvirt/qemu/hysen_6101_101.xml |grep 'source file'|grep img      [root@kvmsuzhu2 ~]# cat /etc/libvirt/qemu/hysen_6101_101.xml |grep '^.*/name>$'  hysen_6101_101[root@kvmsuzhu2 ~]# 
克隆前确认主机已经关闭:
[root@kvmsuzhu ~]# virsh list --all Id    名称                         状态---------------------------------------------------- 3     dev_5974_74                    running 14    dev_5954_54                    running -     hysen_6101_101                 关闭 -     openstack_5978_78              关闭
不关闭则克隆会报ERROR    Domain with devices to clone must be paused or shutoff.
2、开始克隆
[root@kvmsuzhu2 ~]# virt-clone -o hysen_6101_101 -n hysen_6103_103 -f /data1/vmdisk/hysen_6103_103.img 正在克隆 hysen_6101_101.img                                                                        |  30 GB     13:55     Clone 'hysen_6103_103' created successfully.克隆已经完成30G的大小!
3、修改vnc端口号,启动主机
[root@kvmsuzhu2 ~]# cat /etc/libvirt/qemu/hysen_6103_103.xml |grep 'vnc'    [root@kvmsuzhu2 ~]# virsh edit hysen_6103_103    //这里你必须用virsh edit命令编辑配置文件,用vim编辑是不会生效的!编辑了域 hysen_6103_103 XML 配置。[root@kvmsuzhu2 ~]# cat /etc/libvirt/qemu/hysen_6103_103.xml |grep 'vnc'    [root@kvmsuzhu2 ~]# virsh start hysen_6103_103.xml域 hysen_6103_103 已开始[root@kvmsuzhu2 ~]# netstat -anltp |grep 6103tcp        0      0 0.0.0.0:6103                0.0.0.0:*                   LISTEN      13740/qemu-kvm [root@kvmsuzhu2 ~]#  
4、修改主机名、ip地址
修改主机名[root@hysen_6101_101 ~]# vi /etc/sysconfig/networkNETWORKING=yes    NETWORKING_IPV6=no     HOSTNAME=hysen_6103_103 GATEWAY=10.0.1.1[root@hysen_6101_101 ~]# hostname hysen_6103_103修改IP地址[root@hysen_6103_103 ~]# vi /etc/sysconfig/network-script/ifcfg-eth0# Virtio Network Device    DEVICE=eth0     BOOTPROTO=static     ONBOOT=yes     HWADDR=52:54:00:ae:1d:7b     IPADDR=10.0.1.117     NETMASK=255.255.255.0注意修改mac地址,有uuid的配置修改uuid配置[root@hysen_6103_103 ~]# service network start重启报错:device eth0 does not seem to be present, delaying initialization如下操作解决:[root@hysen_6103_103 ~]# rm -rf /etc/udev/rules.d/70-persistent-net.rules 有说修改文件把eth0和eth1互换的也可以![root@hysen_6103_103 ~]# reboot重启网卡服务[root@hysen_6103_103 ~]# service network start    Bringing up loopback interface:  [  OK  ]     Bringing up interface eth0:  [  OK  ]     [root@hysen_6103_103 ~]# 

二、通过复制xml文件与磁盘文件复制克隆

我们这里还是拿hysen_6101_101虚拟机作为模板机器克隆。同样这种方法也需要模板机器已经关机!1、复制xml配置文件
[root@kvmsuzhu2 ~]# virsh dumpxml hysen_6101_101 > /etc/libvirt/qemu/hysen_6105_105.xml[root@kvmsuzhu2 ~]# ls -l /etc/libvirt/qemu/hysen_6105_105.xml-rw-r--r-- 1 root root 2748 10月 17 17:50 /etc/libvirt/qemu/hysen_6105_105.xml[root@kvmsuzhu2 ~]#
2、复制hysen_6101_101虚拟机磁盘文件
[root@kvmsuzhu2 ~]# cp  /data1/vmdisk/hysen_6101_101.img  /data1/vmdisk/hysen_6105_105.img[root@kvmsuzhu2 ~]# ls /data1/vmdisk/hysen_6105_105.img/data1/vmdisk/hysen_6105_105.img[root@kvmsuzhu2 ~]# 
3、修改拷贝的配置文件
    []修改虚拟机的名称:hysen_6105_105[/][]修改uuid编号:13178d42-1055-8b94-1411-3c2bdd0e6e7a<[/][]修改mac地址:[/][]修改disk位置:[/][]修改vnc端口:[/]

此时还是将该配置文件注册进来,无法通过virsh edit进行编辑。
[root@kvmsuzhu2 ~]# vim /etc/libvirt/qemu/hysen_6105_105.xml
hysen_6101_101
13178d42-1055-8b94-1411-3c2bdd0e6e7a

4、定义新虚拟机配置文件
[root@kvmsuzhu2 ~]# virsh define /etc/libvirt/qemu/hysen_6105_105.xml 
定义域 hysen_6105_105(从 /etc/libvirt/qemu/hysen_6105_105.xml)

[root@kvmsuzhu2 ~]#
5、启动虚拟机并设置开机自启
[root@kvmsuzhu2 ~]# virsh start hysen_6105_105
域 hysen_6105_105 已开始

[root@kvmsuzhu2 ~]# virsh autostart hysen_6105_105
域 hysen_6105_105标记为自动开始

[root@kvmsuzhu2 ~]# virsh list --all |grep hysen_6105_105
237 hysen_6105_105 running
[root@kvmsuzhu2 ~]#
6、vnc连接修改主机名、ip地址
4、修改主机名、ip地址
修改主机名
[root@hysen_6101_101 ~]# vi /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=hysen_6105_105
GATEWAY=10.0.1.1
[root@hysen_6101_101 ~]# hostname hysen_6105_105

修改IP地址
[root@hysen_6105_105 ~]# vi /etc/sysconfig/network-script/ifcfg-eth0
# Virtio Network Device
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
HWADDR=54:52:01:11:12:1f
IPADDR=10.0.1.118
NETMASK=255.255.255.0

重启网卡服务
[root@hysen_6105_105 ~]# service network start
重启报错:device eth0 does not seem to be present, delaying initialization

如下操作解决:
[root@hysen_6105_105 ~]# rm -rf /etc/udev/rules.d/70-persistent-net.rules 有说修改文件把eth0和eth1互换的也可以!
[root@hysen_6105_105 ~]# reboot

重启之后再次登陆重启动网卡:
[root@hysen_6105_105 ~]# service network start
Bringing up loopback interface: [ OK ]
Bringing up interface eth0: [ OK ]
两种不同的方式有各有特点,你可以针对特点选择性使用!

KVM性能测试报告

大数据 Ansible 发表了文章 0 个评论 7050 次浏览 2015-09-01 11:11 来自相关话题

本测试试图找出以下问题的答案:            1. 虚拟机相对于物理机性能损失有多严重(CPU/MEM/NET/DISK)             2. 对于多个虚拟机,KVM 对资源的分配是否公正         ...查看全部
kvmlogo.gif

本测试试图找出以下问题的答案:
           1. 虚拟机相对于物理机性能损失有多严重(CPU/MEM/NET/DISK) 
           2. 对于多个虚拟机,KVM 对资源的分配是否公正
           3. 找出性能最好的物理机磁盘类型和虚拟机磁盘类型及参数 
               A) 物理机使用 ext4 的最优化设置 
                     ➔  使用 raw 磁盘的最优性能设置 
                           ➢  cache类型 
                                 • none 
                                 • writeback 
                                 • writethrough 
                           ➢  驱动类型              
                                 • ide 
                                 • virtio 
                     ➔  使用 qcow2 磁盘的最优性能设置 
                           ➢  cache类型
                                 • none        
                                 • writeback 
                                 • writethrough 
                           ➢  驱动类型 
                                 • ide 
                                 • virtio 
                           ➢  是否preallocation  
                      ➔  比较得出使用 ext4 的虚拟机磁盘类型最优化设置 
 
              B) 物理机使用xfs磁盘的最优化设置 
                      ➔  使用 raw 磁盘的最优性能设置
                            ➢  cache类型 
                                 1. none
                                 2. writeback
                                 3. writethrough
                            ➢  驱动类型 
                                  1. ide
                                  2. virtio
                      ➔  使用 qcow2 磁盘的最优性能设置
                            ➢  cache类型 
                                  1. none
                                  2. writeback
                                  3. writethrough
                            ➢  驱动类型 
                                  1. ide
                                  2. virtio
                            ➢ 是否preallocation
                      ➔ 比较得出使用 ext4 的虚拟机磁盘类型最优化设置 
  
              C) 比较得出ext4和xfs那个更优秀 


物理机配置


服务器型号:DELL R410
CPU型号:CPU:Intel(R) Xeon(R) CPU E5620 2.4G*2
内存大小:8GB
硬盘大小:300*2
网卡:Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet * 2


虚拟机配置


在测试一个参数的时候为了防止其它因素的影响,不同的测试虚拟机配置会不同


CPU 的测试


虚拟机与物理机之间的性能对比 
主要测试相对于物理机,虚拟机的性能损失有多少


虚拟机配置


1个VCPU    2G 内存    20G 硬盘
用一个寻找质数的 C 程序,分别测试找出一百万,一千万,1 亿以内的质数所用的时间 
kc1.png

kc2.png

从上面的图可以看到,KVM 虚拟机相对于物理机的 CPU 性能损失非常小(不到 1%) 
 
由于物理机是 8 核的 CPU,我们猜想是不是他们运行在各自的 CPU,所以我们分别测试了同时在 2 个,4 个,6 个,8 个和 10 个虚拟机中运行测试程序所使用的时间,得到的结果是他们使用的时间相差不大,这里是同时在 10 个虚拟机中运行测试程序找出 1 亿中的质数所使用的时间对比图,我们在最后加上了在物理机中的运行时间 
kc3.png

我们猜想当同时运行的程序数(10)多于 CPU 数(8)时会有资源争抢或资源分配不均的情况出现,从上图可以看 到 KVM 于这些处理的很好,资源利用率很高,物理机和最慢的相差不到 20 秒(6%),资源分配也比较公正 


内存 


对于内存的测试多们使用了一个程序 memtester(注意不是 memtest),它能取给定大小的内存进行读写等一系 列的测试操作 
kc4.png

从这个图可以看出,相对于物理机,虚拟机的性能损失非常小 
kc5.png

上图是两个虚拟机同时运行测试所用的时间和物理机之间的对比,可以看出 KVM 对内存资源的分配很公平 


网络


我们在连接在相同交换机的另一台服务器上搭建 Web 服务器,让测试机和虚拟机同时下载 5G 的文件 
kc6.png

从这个图可以看到,公认的性能比较好的 virtio 驱动将虚拟机的网络性能发挥到极致,和物理机不相上下 
kc7.png

这个图再一次反映了 KVM 对资源分配的公平性 
 
我们还测试了同一台物理机上的虚拟机之间的传输速度可以稳定在 122MB/s 


硬盘 


磁盘的测试花了一些时间,因为有很多因素会影响磁盘性能,这个测试也没有覆盖所有可能的因素 先上数据 
kc8.png

对表的说明: 
      • 这个表记录了不同的参数对安装一个 CentOS 到虚拟机中所用的时间的影响
      • 安装使用相同的 kickstart
      • 使用 time 命令记录安装过程所使用的时间
      • 最后一列是将前一列的时间转化为秒数
      • 第一列的 xfs 和 ext4 指宿主机的存放虚拟磁盘镜像文件的分区类型,挂载参数都使用 default
      • Raw 和 Qcow2 指虚拟机的磁盘类型
      • ide 和 virtio 指虚拟机磁盘的驱动类型
      • pre 和 nopre 只是针对 qcow2 磁盘类型,创建磁盘文件时加上参数 preallocation=metadata 既为 pre
      • none,wt,wb,分别指缓存类型为 none, writethrough, writeback
      • 虚拟机都使用 1vcpu,2G 内存,40G 磁盘
 
下面从总体上看下他们的性能如何
kc9.png

从这个图不太容易看出哪个配置使用的时间最短,但非常容易看出最耗时的一个: 
 
宿主机使用 xfs,虚拟机使用 qcow2 磁盘,ide 驱动和 writethrough 缓存类型 
 
下面我们以由小到大的顺序,找出每个区域的最高性能,然后他们之间做对比 


首先看一下不同的缓存类型对性能的影响 


kc10.png

kc11.png

从两幅图可以得到的结论是:使用 writethrough 性能最差,none 和 writeback 相差不大 
 
这里插点缓存的知识
KVM 缓存模式概览 通常,虚拟机使用宿主机上的一个文件保存它的数据,这个文件代表一个虚拟机作为正常的物理磁盘使用的虚 拟磁盘,然而,从宿主机的角度来看这个虚拟磁盘只是一个正常的数据文件并且可以对它缓存

在这种情况下,缓存是隐藏一些磁盘数据在内存中.当我们只在内存中存储上次读的数据,我们称之为读缓存,或 者 write-through 缓存.当我们还存储一些要写到硬盘的数据在内存中,在以后的某个时间再写到磁盘,我们称 之为读写缓存,或者 write-back 缓存,write-back 缓存通过将写磁盘请求缓存到高速内存中,有更高的性能,然 而它也比 write-through 更有可能丢失数据,因为后者只缓存写请求,写请求立即写到磁盘里 
 
因为磁盘 I/O 是非常重要的因素,Linux 和 Windows 系统通常使用 write-back 策略周期性的写到磁盘里,然 而,当然后虚拟化管理程序虚拟一个机器时,你可以有效的缓存一些数据两次(一次在宿主机的内在中,一次在虚 拟机的内存中),所以你可以取消宿主机对磁盘文件的缓存,让虚拟机自己管理它的缓存.些外,宿主机端的 write- back 策略很大程序上增加了数据丢失的可能性,然而,你很快会发现,新特性”barrier passing”的加入,你不用 再担心这个 


我们可以用一个图来更好的理解


kc12.png

假设传统的(没有 barrier-passing)程序:当虚拟机里的程序要写一些数据,通常数据保存到虚拟机的页缓存中. 页缓存会周期性的冲数据到虚拟磁盘设备也就是宿主机上的磁盘文件,另一方面,如果应用程序有一些非常重 要的数据要写,它可以绕过页缓存并且使用同步写方式,只有当写操作成功才返回,确保了所有的数据写到了虚 拟机的永久存储系统 
 
然而,在这一点上(写到虚拟机磁盘上)有三种可能:
         • 如果缓存策略是'writeback',数据会缓存到宿主机的页缓存中(红箭头) 
         • 如果缓存策略是'none',数据立即写到物理磁盘(灰箭头)
         • 如果缓存策略是'writethrough',数据将立即写到物理磁盘(蓝箭头) 
更多详情


下面我们看看 qcow2 磁盘使用和不使用 preallocation 的性能差异有多大 


kc13.png

从上图可以看出,不管宿主机使用 ext4 还是 xfs,虚拟机使用 ide 还是 virtio 驱动,使用 preallocation 都有性能 的提升,
这里有一个不问题:如果宿主机使用 xfs,创建 qcow2 磁盘镜像使用 preallocation 会很慢(40G 需要 8 分钟) 


下面我们来看看 ide 和 virtio 他们的性能对比 


kc14.png

很明显使用 virtio 是更明智的选择 


下面我们再看看 raw 和 qcow2 之间的对比


这里插一点 Raw 和 qcow2 的知识:
raw 的优势(能找到的相关资料太少,不知道是不是理解有误):
• 简单,并能够导出为其他虚拟机的虚拟硬盘格式
• 根据实际使用量来占用空间使用量,而非原先设定的最大值(比如设定最高 20G,而实际只使用
3G)。——需要宿主分区支持 hole(比如 ext2 ext3 ntfs 等)
• 以后能够改变空间最大值(把最高值 20G 提高到 200G,qcow2 也可以,不过要转为 raw)
• 能够直接被宿主机挂载,不用开虚拟机即可在宿主和虚拟机间进行数据传输(注意,此时虚拟机不要开)
而qcow2 的优势:
• 更小的虚拟硬盘空间(尤其是宿主分区不支持 hole 的情况下)
• optional AES encryption, zlib based compression and support of multiple VM snapshots.
原文在这里:http://www.linuxsir.org/bbs/thread368695.html 
kc15.png

从图表中可以看出,如果 qcow2 使用 preallocation, raw 的性能优势已经不是很明显 


下面看看 ext4 和 xfs 之间 的对比 


kc16.png

可以看到 ext4 性能要比 xfs 高,这可能是默认的挂载参数不能充分发挥 xfs 的性能 


最后,我们把时间最短的放到一起看到底那个最快 


kc17.png


总结 


CPU,内存都不是问题,对于硬盘,通过前面一系列的测试,我推荐使用以下配置:
• 使用 Ext4 做为宿主机磁盘格式
• 虚拟机用 qcow2+preallocation,
• 缓存使用 writeback
• 虚拟机网卡驱动使用 virtio
文章来源于网络,如果有问题联系社区相关人员!
 
 

SELinux防护KVM安全

大数据 OpenSkill 发表了文章 0 个评论 3891 次浏览 2015-08-23 01:40 来自相关话题

      SELinux最初是由美国安全局NSA发起的项目,是基于强制访问控制(MAC)策略的,为每一个主体和客户都提供了个虚拟的安全“沙箱”,只允许进程操作安全策略中明确允许的文件。当Linux开启了SELinux安全策略,所有的主体对客户的访问必须同时满 ...查看全部
se1.jpg

      SELinux最初是由美国安全局NSA发起的项目,是基于强制访问控制(MAC)策略的,为每一个主体和客户都提供了个虚拟的安全“沙箱”,只允许进程操作安全策略中明确允许的文件。当Linux开启了SELinux安全策略,所有的主体对客户的访问必须同时满足传统的自主访问控制(DAC)和SELinux提供的强制访问控制(MAC)策略。
 
      在虚拟化环境下,通常是多个VM运行在同一个宿主机(物理机)上,通常由同一个用户启动多个VM管理进程(如:qemu-kvm或者vmx等),而这些VM可能为不同的租户服务,如果其中一个VM由于某些脆弱性被恶意控制了,而hypervisor层有缺陷,攻击者就有机会利用被控制的VM发起对同宿主机或其它VM进行恶意攻击。如下图:宿主机中的SELinux安全策略阻止了VM的Attack行为。
se2.png


SELinux与KVM


      sVirt 项目集成SELinux强制访问控制 (MAC) 安全和基于 Linux 的KVM虚拟化。
确认SELinux策略正常开启
se3.png

创建img文件
     通过dd命令创建两个大小为20GB的img文件,作为虚拟机的磁盘:
dd if=/dev/zero of=/opt/vm/vm01.img bs=1M count=20480
dd if=/dev/zero of=/opt/vm/vm02.img bs=1M count=20480
      查看img文件安全上下文
se4.png

     从上图可知两个img文件的安全上下文,其中用户域为unconfined_u,表示不限制用户;角色域为object_r通常表示普通文件或目录;类型域为usr_t;MCS为s0;
qemu-kvm命令配合VNC​
/usr/libexec/qemu-kvm -cpu qemu64 \
-drive file=/opt/vm/vm01.img \
-m 2048 \
-cdrom \
/opt/CentOS-6.5-x86_64-bin-DVD1.iso \
-vnc :1

/usr/libexec/qemu-kvm \
-cpu qemu64 \
-drive file=/opt/vm/vm02.img \
-m 2048 \
-cdrom \
/opt/CentOS-6.5-x86_64-bin-DVD1.iso \
-vnc :2
     给两个img文件安装上CentOS-6.5-x86_64操作系统并处于运行状态,此时的两个img文件的安全上下文还是与之前的保持不变。(注:实际在部署KVM虚拟机里以上步骤不是必须,这里是为了演示SELinux安全上下文的变化而考虑的)
virt-manager启动KVM虚拟机
     结束qemu-kvm进程,用专用的virsh或virt-manager工具(这里以图形工具virt-manager为例)启动两个虚拟机,先ssh –X连接到宿主机,再执行virt-manager命令:
se5.png

     在弹出的窗口里“新建”一个虚拟机,输入名称,单选“Import existing disk image”根据向导创建并启动虚拟机:
se6.png

     当两个虚拟机都通过virt-manager启动之后管理窗口如下:
se7.png

确认安全上下文变化
     此时再看一下两个img文件的安全上下文,除了角色域object_r没有变化之外,用户域、类型域、MCS都发生了变化
se8.png

     再确认一下对应进程的安全上下文:
se9.png

     可以看出img文件的MCS与进程的MCS是严格对应的,且对虚拟机进行重启操作时会自动给进程和img文件重新分配MCS。这种安全机制可以严格控制威胁的范围,提高云平台的安全性。


SELinux阻止非法访问


     介绍一下MCS不同时阻止相互访问,将/bin/bash拷贝一个为/opt/test_sh,并查看一下当前的安全上下文
se10.png

     由于在SELinux的默认安全策略里,使用svirt_t类型的入口程序必须类型为qemu_exec_t,这里修改一下test_sh的类型:
se11.png

MCS为s0:c0,c1的操作
     以特定的SELinux安全策略来运行,这里切换一下类型为svirt_t和MCS为s0:c0,c1,并查看当前用户的安全上下文以确认,之后通过echo命令向/tmp/test文件(由于SELinux安全策略限制,此时只能向/tmp目录下写新建文件)里随便写内容,写成功后再查看一下/tmp/test的安全上下文。MCS都是一致的
se12.png

MCS为s0:c0,c2的操作
      再以特定的SELinux安全策略来运行,这里切换一下类型为svirt_t和MCS为s0:c0,c2,并查看当前用户的安全上下文以确认,之后通过echo命令向/tmp/test文件(这个文件是前一步创建的)里随便写内容,由于安全策略的限制会写入失败,提示:Permission denied(下图红线部分)。确认文件MCS与当前环境的MCS是不一致的。
se13.png


来点感动自己的鸡汤


      所有被SELinux安全策略阻止的操作都会有相应的日志记录,当系统auditd服务启动时会记录在audit.log日志,否则记录在message日志里。
se14.png

XEN 、 VMware ESXi、Hyper-V 以及 KVM 特点比较

大数据 OpenSkill 发表了文章 0 个评论 13020 次浏览 2015-08-22 16:55 来自相关话题

XEN 与 VMware ESXi,Hyper-V 以及 KVM 特点比较       XEN 有简化虚拟模式,不需要设备驱动,能够保证每个虚拟用户系统相互独立,依赖于 service domains 来完成一些功能; Vmware ...查看全部
xnh.png


XEN 与 VMware ESXi,Hyper-V 以及 KVM 特点比较


      XEN 有简化虚拟模式,不需要设备驱动,能够保证每个虚拟用户系统相互独立,依赖于 service domains 来完成一些功能; Vmware ESXI 与 XEN 比较类似,包含设备驱动以及管理栈等基本要素,硬件支持依赖于 VMware 创建的驱动; Hyper-V 是基于 XEN 管理栈的修改; KVM 与 XEN 方式不同,KVM 是以 Linux 内核作为管理工具。
虚拟机的体系结构


XEN 体系结构


XEN 体系结构图如下:
xk1.png

      Xen是一个开放源代码虚拟机监视器,由剑桥大学开发。Xen的缺点是操作系统必须进行显式地修改(“移植”)以在Xen上运行(但是提供对用户应用的兼容性),所以比较麻烦。使得Xen无需特殊硬件支持,就能达到高性能的虚拟化。Linux的官方内核在较早之前已经去掉了对Xen的支持。

      一个 XEN 虚拟机环境主要由以下几部分组成:
XEN Hypervisor; Domain 0 —— Domain Management and Control(XEN DM&C); Domain U Guest(Dom U) PV Guest HVM Guest
       Xen 三部分组成之间关系图
xk2.png

XEN Hypervisor :
XENHypervisor 是介于操作系统和硬件之间的一个软件描述层。它负责在各个虚拟机之间进行 CPU 调度和内存分配。XEN Hypervisor 不仅抽象出虚拟机的硬件,同时还控制着各个虚拟机的执行。XEN Hypervisor 不会处理网络、存储设备、视频以及其他 I/O.
Domain 0:
Domain 0 是一个修改过的 Linux kernel,是唯一运行在 Xen Hypervisor 之上的虚拟机,它拥有访问物理 I/O 资源的权限,同时和系统上运行的其他虚拟机进行交互。Domain 0 需要在其它 Domain 启动之前启动。
Domain U:
运行在 Xen Hypervisor 上的所有半虚拟化(paravirtualized)虚拟机被称为“Domain U PV Guests”,其上运行着被修改过内核的操作系统,如 Linux、Solaris、FreeBSD 等其它 UNIX 操作系统。所有的全虚拟化虚拟机被称为“Domain U HVM Guests”,其上运行着不用修改内核的操作系统,如 Windows 等。


Hyper-V 体系结构


Hyper-V 体系结构图如下:
xk3.png

      Hyper-V 是微软提出的一种系统管理程序虚拟化技术,采用微内核的架构,兼顾了安全性和性能的要求。Hyper-V 底层的 Hypervisor 运行在最高的特权级别下,微软将其称为 ring -1(而 Intel 则将其称为 root mode),而虚机的 OS 内核和驱动运行在 ring 0,应用程序运行在 ring 3 下,这种架构就不需要采用复杂的 BT(二进制特权指令翻译)技术,可以进一步提高安全性。从架构上讲 Hyper-V 只有“硬件-Hyper-V-虚拟机”三层,本身非常小巧,代码简单,且不包含任何第三方驱动,所以安全可靠、执行效率高,能充分利用硬件资源,使虚拟机系统性能更接近真实系统性能。

      Hyper-V 支持分区层面的隔离。分区是逻辑隔离单位,受虚拟机监控程序支持,并且操作系统在其中执行。Microsoft 虚拟机监控程序必须至少有一个父 / 根分区,用于运行 64 位版本的 Windows Server 2008 操作系统。虚拟化堆栈在父分区中运行,并且可以直接访问硬件设备。随后,根分区会创建子分区用于承载来宾操作系统。根分区使用虚拟化调用应用程序编程接口 (API) 来创建子分区。

     分区对物理处理器没有访问权限,也不能处理处理器中断。相反,它们具有处理器的虚拟视图,并运行于每个来宾分区专用的虚拟内存地址区域。虚拟机监控程序负责处理处理器中断,并将其重定向到相应的分区。Hyper-V 还可以通过输入输出内存管理单元 (IOMMU) 利用硬件加速来加快各个来宾虚拟地址空间相互之间的地址转换。IOMMU 独立于 CPU 使用的内存管理硬件运行,并用于将物理内存地址重新映射到子分区使用的地址。从系统的结构图,我们可以看出来 Hyper-V 与 Xen 的架构很相似。


Vmware ESXI 体系结构


Vmware ESXI 体系结构图如下:
xk4.png

      VMWare (Virtual Machine ware)是一个“虚拟PC”软件公司。它的产品可以使你在一台机器上同时运行二个或更多Windows、DOS、LINUX系统。与“多启动”系统相比,VMWare采用了完全不同的概念。多启动系统在一个时刻只能运行一个系统,在系统切换时需要重新启动机器。VMWare是真正“同时”运行,多个操作系统在主系统的平台上,就象标准Windows应用程序那样切换。而且每个操作系统你都可以进行虚拟的分区、配置而不影响真实硬盘的数据,你甚至可以通过网卡将几台虚拟机用网卡连接为一个局域网,极其方便。安装在VMware操作系统性能上比直接安装在硬盘上的系统低不少,因此,比较适合学习和测试。

      由上图我们可以看出来管理工具也是直接嵌入到了 ESXi vmKernel 中,没有再分化出单独的管理工具,这一点与 Xen 是相区别的。


KVM 体系结构


KVM 体系结构图如下:
xk5.png

      KVM 是一个独特的管理程序,通过将 KVM 作为一个内核模块实现,在虚拟环境下 Linux 内核集成管理程序将其作为一个可加载的模块可以简化管理和提升性能。在这种模式下,每个虚拟机都是一个常规的 Linux 进程,通过 Linux 调度程序进行调度。
    
      KVM是指基于Linux内核(Kernel-based)的虚拟机(Virtual Machine)。KVM最大的好处就在于它是与Linux内核集成的,所以速度很快。KVM的宿主操作系统必须是Linux,支持的客户机操作系统包括Linux、Windows、Solaris和BSD,运行在支持虚拟化扩展的x86和x86_64硬件架构上,这意味着KVM不能运行在老式CPU上,新CPU如果不支持虚拟化扩展也不能运行(如英特尔的Atom处理器)。


KVM、Xen、VMWare的对比


xk6.png

通过以上四种虚拟机的体系结构图,我们可以看出他们在整个系统中的位置,以及相互之间的区别。
本文基于互联网整理转载分享  参考原文1  参考原文2
Kernel Virtual Machine (KVM) 虚拟化在很大程度上已取代 Xen,成为在大多数 Linux 系统上创建和支持虚拟机 (VM) 的默认开源方案。