前言
KVM即Kernel Virtual Machine,最初是由以色列公司Qumranet开发。2007年2月被导入Linux 2.6.20核心中,成为内核源代码的一部分。2008年9月4日,Redhat收购了Qumranet,至此Redhat拥有了自己的虚拟化解决方案,之后便舍弃Xen开始全面扶持KVM,从RHEL6开始KVM便被默认内置于内核中。本文介绍KVM虚拟化平台部署及管理。
KVM特点
KVM必须在具备Intel VT或AMD-V功能的x86平台上运行。KVM包含一个为处理器提供底层虚拟化,可加载的核心模块kvm.ko(kvm-intel.ko或kvm-AMD.ko)。使用一个经过修改的QEMU(qemu-kvm),作为虚拟机上层控制和界面。
由于KVM仅是一个简单的虚拟化模块,所以它的内存管理没有自我实现,需借助于Linux内核实现内存管理。KVM能够使用Linux所支持的任何存储,在驱动程序的实现上,直接借助于Linux内核来驱动任何硬件。在性能上KVM继承了Linux很好的性能和伸缩性,在虚拟化性能方面,已经达到非虚拟化原生环境95%左右的性能(官方数据)。KVM拓展性也非常好,客户机和宿主机都可以支持非常多的CPU数量和非常大的内存,可以过载使用CPU和内存,还可借助KSM技术实现对内存的过量使用,且保证性能依旧非常不错。
xen的工作方式:首先在操作系统上安装xen;(rpm包);装好之后重启宿主机的操作系统,起来之后xen就成为了操作系统,直接运行在物理硬件之上了,将原来宿主机的操作系统,挤下去成为第一个虚拟机(dom0)。将刚挤下去的成为第一个虚拟机(dom0)的当为它的管理接口(管理接口:创建,删除,新建虚拟机)后面创建的虚拟机为dom1;dom2……
KVM的工作方式:KVM是内核模块,一旦装上KVM的内核模块,原来的内核,就变为虚拟化管理平台:Hypervisor ,不用重启就直接可以在虚拟化管理平台上创建虚拟机了。
KVM架构
KVM的架构非常简单,就是内核的一个模块,用户空间通过qemu模拟硬件提供给虚拟机使用,一个虚拟机就是一个普通的Linux进程,通过对这个进程的管理,就可以完成对虚拟机的管理。
kvm相关安装包及其作用
qemu-kvm 主要的KVM程序包
python-virtinst 创建虚拟机所需要的命令行工具和程序库
virt-manager GUI虚拟机管理工具
virt-top 虚拟机统计命令
virt-viewer GUI连接程序,连接到已配置好的虚拟机
libvirt C语言工具包,提供libvirt服务
libvirt-client 为虚拟客户机提供的C语言工具包
virt-install 基于libvirt服务的虚拟机创建命令
bridge-utils 创建和管理桥接设备的工具
QUME的主要功能:
处理器模拟器
仿真IO设备
关联模拟的设备至真实设备;
调试器
与模拟器交互的用户接口
qemu:kmv的文本管理工具,包括qemu-kvm、qemu-imgQUME的主要功能:
处理器模拟器
仿真IO设备
关联模拟的设备至真实设备;
调试器
与模拟器交互的用户接口
qemu:kmv的文本管理工具,包括qemu-kvm、qemu-img
快速使用kvm技术:
1 .判断CPU是否支持硬件虚拟化:
grep -i -E ‘(vmx|svm|lm)’ /proc/cpuinfo
vmx:Intel VT-x (inter的CPU出现vmx;lm “64位的操作平台”字样代表支持硬件虚拟化)
svm:AMD AMD-v (AMD的CPU出现svm字样代表支持硬件虚拟化)
yum install qemu-kvm
qemu工具集本身可以支持xen、kvm等,红帽公司为了推广自己公司的kvm,专门把qemu中支持kvm的部分提取出来做成了qemu-kvm包
ln -sv /usr/libexec/qemu-kvm /usr/bin/
但红帽并不推荐用qemu,在虚拟机控制软件他们推广自己研发的libvirt工具集。因此安装qemu-kvm后,qemu-kvm的yum安装路径没有放在环境变量Path默认的路径中,制造使用不便。所以在这里加了软链接,这样使用中不需要全路径了。红帽坏的666啊…
qemu-kvm -help
qemu-img
convert 无损格式转换
resize 更改磁盘大小
info 显示映像文件信息
[root@localhost ~]# qemu-img info cirros-0.3.4-x86_64-disk.img
image: cirros-0.3.4-x86_64-disk.img
file format: qcow2
virtual size: 39M (41126400 bytes)
disk size: 13M
cluster_size: 65536
Format specific information:
compat: 0.10
运行第一个虚拟镜像
[root@localhost seabios]# qemu-kvm -m 128 -smp 1 -name testcirros -hda ~/cirros-0.3.4-x86_64-disk.img
could not load PC BIOS 'bios-256k.bin'
使用 find / -name bios-256k.bin 我发现,bios-256k.bin是一个软连接文件,链接的是上层目录中,seabiso目录下的bios-256k.bin,但是seabios目录下并没有bios-256k.bin这个文件,这可能是redhat搞的鬼,就像qemu-kvm本身并不在PATH环境变量中一样,所以,我复制了seabios目录下的bios.bin 为bios-256k.bin,这样下来,qemu-kvm就可以启动了,我们可以再加上–nographic选项不使用图形化启动!太黑了!
也可以使用-cpu选项,指定模拟的cpu类型
-cpu model:设定CPU类型,如coreduo、qemu64、host等 qemu-kvm -cpu ?
# qemu-kvm -m 128 -cpu core2duo(host) -smp 1 -name testcirros -hda ~/cirros-0.3.4-x86_64-disk.img
再次执行,通过
[root@localhost seabios]# qemu-kvm -m 128 -smp 1 -name testcirros -hda ~/cirros-0.3.4-x86_64-disk.img
VNC server running on `::1:5900'
使用VNC,且只监听在本机,为了安全。。。
安装tigervnc
[root@localhost ~]yum install tigervnc -y
[root@localhost ~]# rpm -ql tigervnc
/usr/bin/vncviewer
/usr/share/applications/vncviewer.desktop
/usr/share/doc/tigervnc-1.8.0
/usr/share/doc/tigervnc-1.8.0/README.txt
使用vncviewer连接
[root@localhost ~]# vncviewer :5900
用户名密码都在,直接登录
使用以下命令可切换到管理员
sudo su -
ctrl+alt+2切换到监控平台
help 可以看到众多命令
info 命令可以显示信息
可实现很多管理功能
第一个虚拟机启动完成
当前的虚拟机相当于在CentOS主机上的一个进程,可以用ps aux查看
root 21595 1.8 3.7 810220 107688 pts/0 Sl+ 03:15 0:18 qemu-kvm -m 128 -smp 1 -name testcirros -hda /root/cirros-0.3.4-x86_64-disk.img
关闭虚拟机,发送关机信号
kill 21595 真机
halt 或 poweroff 虚拟机内部输入命令
使用复杂一些的启动设置如下
qemu-kvm -m 128 -name test -smp 1 -drive file=~/cirros-0.3.4-x86_64-disk.img,if=virtio,media=disk,cache=writeback,format=qcow2
指定了虚拟磁盘接口类型、介质类型、cache为回写、磁盘文件格式为qcow2
fdisk -l
Disk /dev/vda 变成了虚拟磁盘,不再是sda
ls /sys/bus 看总线类型,出现了virtio
ls /sys/bus/virtio/devices
virtio0
从头创建一个虚拟机
建立一个磁盘映像文件,winxp和centos各一个
[root@localhost ~]# qemu-img create -f qcow2 /images/kvm/winxp.qcow2 -o size=10G,preallocation=metadata
Formatting '/images/kvm/winxp.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 preallocation='metadata' lazy_refcounts=off
[root@localhost ~]# qemu-img create -f qcow2 /images/kvm/centos7.qcow2 -o size=10G,preallocation=metadata
Formatting '/images/kvm/centos7.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 preallocation='metadata' lazy_refcounts=off
开始创建虚拟机,并安装系统
qemu-kvm -m 1024 -name centos7 -smp 1 -cpu host -drive file=/images/kvm/centos7.qcow2,if=virtio,media=disk,cache=writeback,format=qcow2 -drive file=~/CentOS-7-x86_64-Minimal-1810.iso,media=cdrom -boot order=dc,once=d
VNC server running on `::1:5900'
调用VNC
安装完成后启动
qemu-kvm -m 1024 -name centos7 -smp 1 -cpu host -drive file=/images/kvm/centos7.qcow2,if=virtio,media=disk,cache=writeback,format=qcow2 -drive
成功了!
可以在当前的界面中运行虚拟机 -nographic
qemu-kvm -m 128 -name test -smp 1 -drive file=~/cirros-0.3.4-x86_64-disk.img,if=virtio,media=disk,cache=writeback,format=qcow2 -nographic
网络选项:
-net nic 定义net frontend
-net user
-net tap 定义net backend
script=:启动脚本
downscript=:停止脚本;
桥设备
bridge-utils.x86.64
modinfo bridge
[root@localhost ~]# rpm -ql bridge-utils
/usr/sbin/brctl
/usr/share/doc/bridge-utils-1.5
/usr/share/doc/bridge-utils-1.5/AUTHORS
/usr/share/doc/bridge-utils-1.5/COPYING
/usr/share/doc/bridge-utils-1.5/FAQ
/usr/share/doc/bridge-utils-1.5/HOWTO
/usr/share/man/man8/brctl.8.gz
brctl -h
创建桥设备
[root@localhost ~]# brctl addbr br0
[root@localhost ~]# ifconfig -a
br0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.11.73 netmask 255.255.255.0 broadcast 192.168.11.255
ether 06:17:e5:1a:5e:f7 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@localhost ~]# brctl stp br0 off
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000000000000 no
virbr0 8000.5254005abc25 yes virbr0-nic
[root@localhost ~]# brctl delbr br0
激活br0
[root@localhost ~]# ip link set dev br0 down
[root@localhost ~]# ip link set dev br0 up
[root@localhost ~]# ip link set dev br0 down
[root@localhost ~]# ifconfig br0 up
查看本机支持的网卡类别
[root@localhost ~]# qemu-kvm -net nic,model=?
qemu: Supported NIC models: ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio
添加两块网卡启动虚拟机,必须要有启动脚本(/etc/qemu-ifup),通过脚本网卡挂接到桥上
[root@localhost ~]# qemu-kvm -m 128 -name test -smp 1 -drive file=~/cirros-0.3.4-x86_64-disk.img,if=virtio,media=disk,cache=writeback,format=qcow2 -nographic -net nic,model=virtio -net tap,ifname=vif0.0 -net nic -net tap,ifname=vif0.1
因为没有启动脚本,报错:
[root@localhost ~]# qemu-kvm -m 128 -name test -smp 1 -drive file=~/cirros-0.3.4-x86_64-disk.img,if=virtio,media=disk,cache=writeback,format=qcow2 -nographic -net nic,model=virtio -net tap,ifname=vif0.0
/etc/qemu-ifup: could not launch network script
qemu-kvm: -net tap,name=vif0.0: Device 'tap' could not be initialized
qemu-ifup脚本 vif0.0会传递为$1
#!/bin/bash
#
bridge=br0
if [ -n "$1" ]; then
ip link set $1 up
sleep 1
brctl addif $bridge $1
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "Error: no interface specified."
exit 1
fi
qemu-ifdown脚本
#!/bin/bash
#
bridge=br0
if [ -n "$1" ]; then
brctl delif $bridge $1
ip link set $1 down
exit 0
else
echo "Error: no interface specified."
exit 1
fi
加上脚本运行,放在默认位置,不用只script也是可以的
[root@localhost ~]# qemu-kvm -m 128 -name test -smp 1 -drive file=~/cirros-0.3.4-x86_64-disk.img,if=virtio,media=disk,cache=writeback,format=qcow2 -nographic -net nic,model=e1000 -net tap,ifname=vif0.0,script=/etc/qemu-ifup
运行虚拟机后,给虚拟机配置ip
#ifconfig eth0 192.168.11.81/24
启动多个虚拟机默认MAC地址相同,因此需要指定mac=52:54:00:12:34:57;52:54:00固定,默认值是52:54:00:12:34:56
[root@localhost ~]# qemu-kvm -m 128 -name test -smp 1 -drive file=~/cirros-0.3.4-x86_64-disk.img,if=virtio,media=disk,cache=writeback,format=qcow2 -nographic -net nic,model=e1000,macaddr=52:54:00:12:34:57 -net tap,ifname=vif0.0,script=/etc/qemu-ifup
pxe启动虚拟机安装
qemu-img create /images/kvm/centos.img -o size 120G,preallocation=metadata -f qcow2
qemu-kvm -m 512 -name centos -smp 2 -drive file=/images/kvm/centos.img,if=virtio,media=disk,cache=writeback,format=qcow2 -net nic,macaddr=52:54:00:55:32:19 -net tap,ifname=br0,model=virtio,script=/etc/qemu-ifup -boot order=nc,once=n --nographic
启动已经建好的虚拟机
[root@localhost lib64]# qemu-kvm -m 1024 -name centos7.81 -smp 2 -cpu host -drive file=/images/kvm/centos7-81.img,if=virtio,media=disk,cache=writeback,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:12:34:81,model=virtio -net tap,ifname=vif0.0
openstack、kvm、qemu-kvm、libvirt、xen的关系
KVM是最底层的hypervisor,它是用来模拟CPU的运行,它缺少了对network和周边I/O的支持,所以我们是没法直接用它的。QEMU-KVM就是一个完整的模拟器,它是建基于KVM上面的,它提供了完整的网络和I/O支持. Openstack不会直接控制qemu-kvm,它会用一个叫libvit的库去间接控制qemu-lvm, libvirt提供了夸VM平台的功能,它可以控制除了QEMU的模拟器,包括vmware, virtualbox xen等等。所以为了openstack的夸VM性,所以openstack只会用libvirt而不直接用qemu-kvm。libvirt还提供了一些高级的功能,例如pool/vol管理。