KVM(一) qemu-kvm

前言

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架构.jpg

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管理。

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值