背景
KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案。KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度。
kvm基于内核空间,相当于内核空间的一个模块,但由于是存在于内核空间的,所以用户无法调用它,所以需要qemu作为用户空间工具。
CPU 对虚拟化的支持以及性能
kvm基于X86的硬件,最基本的一个需求就是需要cpu 支持vmx,目前市面上的vmware 也好,xen 也好,都是通过不同的程序调用内核空间的kvm 模块,所以均需要cpu 对虚拟化的支持,查看cpu是否支持虚拟化可以用以下方法:
grep -E -o 'vmx|svm' /proc/cpuinfo #有些时候是机器没打开cpu虚拟化的开关导致的,可以在bios里改
虚拟化以及内存
内存对于kvm 来说主要还是要看cpu的架构是numa还是smp,cpu 架构可以参考之后的以及记录。
kvm本身其实就已经对内存进行过优化以及支持,虚拟机上的内存地址其实是物理地址经过映射后的地址空间,如何映射就是通过cpu 上的ept 进行的,可以看下cpu是否支持ept这项技术:
cat /proc/cpuinfo | grep ept
虚拟硬盘
kvm 一般最大的瓶颈就在磁盘IO 上了。
目前常见的虚拟硬盘格式主要是qcow2 以及raw ,当然也有虚拟化厂家自己定义的一些文件格式,比如vmware的vmdk 这种。这里主要记录的还是qcow2 和raw 吧。毕竟用的多。
raw:
raw的优势(能找到的相关资料太少,不知道是不是理解有误):
1.简单,并能够导出为其他虚拟机的虚拟硬盘格式
2.根据实际使用量来占用空间使用量,而非原先设定的最大值(比如设定最高20G,而实际只使用3G)。——需要宿主分区支持hole(比如ext2 ext3 ntfs等)#所以经常ll出来的比du-sh实际的要大
3.以后能够改变空间最大值(把最高值20G提高到200G,qcow2也可以,不过要转为raw) ps: raw经常作为中间格式,其他虚拟化文件转格式可以通过先转到raw后再进行转换。
4.能够直接被宿主机挂载,不用开虚拟机即可在宿主和虚拟机间进行数据传输(注意,此时虚拟机不要开)qcow2:
qcow2的优势:
1.更小的虚拟硬盘空间(尤其是宿主分区不支持hole的情况下)
2.支持快照机制。
性能上其实raw 是超过qcow2的,但是因为快照这个优势,导致了实际生产环境中,raw 很少使用。
虚拟化以及网络
网络对于kvm的支持也比较全面,基本上linux 都自带virtio半虚拟化驱动,所以性能上不会有啥差别。windows的话接触比较少,遇到的都是需要自己去装virtio驱动的。不然网络会很卡。
创建kvm
yum install qemu-kvm qemu-img #至少要有这2个包
yum install virt-manager libvirt libvirt-python python-virtinst libvirt-client bridge-utils #其他一些管理包,比如libvirt 之类的,以及网桥包
##debian或者ubuntu 下
apt-get install kvm qemu
apt-get install virtinst python-libvirt virt-viewer virt-manager
apt-get install bridge-utils
- 创建vdisk
qemu-img create -f qcow2 vdisk 5G #创建5G且格式为qcow2的硬盘
root:~# qemu-img info vdisk #查看vdisk 信息
image: vdisk
file format: qcow2
virtual size: 5.0G (5368709120 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
- 创建kvm
1.通过qemu创建:
qemu-system-x86_64 -m 2048 -enable-kvm fvdisk -cdrom ./Fedora-Live-Desktop-x86_64-20-1.iso #最简单的创建方式,比较适合用于制作镜像
2.libvirt创建
libvirt 可以通过xml 配置文件的方式进行创建,包括openstack 等比较出名的虚拟化解决方案也比较喜欢用这种方式创建虚拟机,关键在于好管理。
<domain type="kvm">
<name>centos</name> <!--虚拟机名称-->
<memory unit="MiB">1024</memory> <!--最大内存,单位k-->
<currentMemory unit="MiB">1024</currentMemory> <!--可用内存,单位k-->
<vcpu>2</vcpu> <!--//虚拟cpu个数-->
<os>
<type arch="x86_64" machine="pc">hvm</type>
<boot dev="hd" /> <!-- 硬盘启动 -->
<boot dev="cdrom" /> <!--//光盘启动-->
</os>
<features>
<acpi />
<apic />
<pae />
</features>
<clock offset="localtime" />
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/kvm</emulator>
<disk type="file" device="disk">
<driver name="qemu" type="qcow2" cache="none" /> <!--cache中的none表示直接从硬盘写到disk镜像文件,性能差但是不会丢数据,write-back 模式正好相反-->
<source file="/var/lib/libvirt/images/test.qcow2" /> <!--目的镜像路径-->
<target dev="hda" bus="virtio" />
</disk>
<disk type="file" device="cdrom">
<source file="/var/lib/libvirt/images/ubuntu.iso" /> <!--光盘镜像路径 -->
<target dev="hdb" bus="virtio" />
</disk>
<interface type="bridge"> <!--虚拟机网络连接方式-->
<source bridge="br0" /> <!--当前主机网桥的名称-->
</interface>
<input type="mouse" bus="ps2" />
<!--vnc方式登录,端口号自动分配,自动加1,可以通过virsh vncdisplay来查询-->
<graphics type="vnc" port="-1" autoport="yes" listen="0.0.0.0" keymap="en-us" />
</devices>
</domain>
写好配置文件后,使用以下命令创建:
virsh define instance_01.xml #根据配置文件创建虚拟机
virsh list --all #查看所有kvm ,无论是否关机
virsh start instance_01 #开机
网桥相关配置:
kvm在很多时候都需要使用网桥这种方式配置,在接口多的情况下对接口做个bonding 是个不错的选择:
auto br100
iface br100 inet static
address 10.1.1.215
netmask 255.255.255.0
gateway 10.1.1.254
dns-nameservers 10.1.1.2
bridge_ports bond0
bridge_hello 2
bridge_maxage 12
bridge_fd 0
bridge_stp off
######
auto bond0
iface bond0 inet static
address 10.1.1.215
netmask 255.255.255.0
gateway 10.1.1.254
post-up ifenslave bond0 eth0 eth1
pre-down ifenslave -d bond0 eth0 eth1
通过brctl show 可以看到网桥相关信息:
root# brctl show
bridge name bridge id STP enabled interfaces
br100 8000.00221999a513 no bond0
vnet0
vnet1
vnet2
vnet3
vnet4
virbr0 8000.000000000000 yes
先后顺序就是bonding--》在接口上做bridage--》在bridge做vnet
基本上按照上述可以起好对应的kvm 虚拟机,之后会再对管理方面做一些备忘录。