KVM的使用

虚拟化作为服务器端和运维领域比较常见的应用场景显得日益重要。提取虚拟化,对于Linux内核支持的kvm虚拟化是Linux体系下最重要的一个系统自带的,不需要依赖于其他第三方软件的虚拟化技术。这里就讲介绍kvm在Linux下的使用。

提到虚拟化技术,这里我们先来区分下虚拟化技术不同的形式。

  1. 硬件虚拟化:使用完全虚拟化໌技术(KVM)。
  2. 半虚拟化:Xen所使用技术,运行linux虚拟机。
  3. 软件虚拟化(仿真):使用二进制转换和其他仿真技术来运行操作系统(不用修改)。软件虚拟化的性能要比硬件虚拟化或半虚拟化要差,比如QEMU。

再来了解下什么是kvm。KVM 就是内核虚拟机英文的缩写。 KVM(Kernel Virtual Machine)是一种完全虚拟化技术。KVM包含一个可加载的内核模块(kvm.ko),这个模块提供核心虚拟化基础架构和处理器特定模式(kvm-intel.ko或kvm-amd.ko)。KVM使用QEMU来进行I/O硬件仿真。QEMU是用户空间仿真器,可以模拟多种架构处理器,性能也很不错。KVM还需要一个经过修改的QEMU软件(qemu-kvm),作为虚拟机上层控制和界面。使用KVM可以运行不用修改的Linux或Windows系统。每个虚拟机都有独立的虚拟硬件:网卡、硬盘、图形适配器等。自2.6.20开始,KVM内核组件已经包含在Linux内核中。可以通过下面的命令来查看kvm相关内核模块是否被夹在。

modprobe -l|grep kvm
kernel/arch/x86/kvm/kvm.ko
kernel/arch/x86/kvm/kvm-intel.ko
kernel/arch/x86/kvm/kvm-amd.ko

KVM可以通过libvirt API和工具来管理,libvirt工具包括virt-manager、virsh等。虚拟机作为Linux进程和线程运行,这些进程和线程由内核模块控制。由于KVM默认不会被安装在Linux下的,这里先介绍下centos7下kvm的安装

yum -y install qemu-kvm libvirt virt-install bridge-utils

这里主要安装了qemu和libvirt来实现管理虚拟机,bridge-utils是用来建立网桥。kvm的网络系统中需要应用到网桥。
先来看如果通过libvirt来创建一个centos-6.5的虚拟机吧

virt-install --virt-type kvm --name centos-6.5-clean --ram=8196 --cdrom=/deployment/CentOS-6.5-x86_64-bin-DVD1-1.iso --disk=/var/lib/libvirt/images/centos-6.5-clean.qcow2,size=30,format=qcow2 --graphics vnc,listen=0.0.0.0 —noautoconsole

以上命令通过Centos6.5的iso文件来安装系统,vnc监听主要用于操作系统的安装和未来图形界面的登录。

对于windows类操作系统,这里给出安装win 2k8虚拟机的命令。

virt-install -n ilanni02 -r 2048 –vcpus=2 –os-type=windows –accelerate -c /iso/windows_server_2008_R2/Win_Server_2008_R2_SP1_33in1.iso –disk path=/iso/virtio-win-0.1-81.iso,device=cdrom –disk path=/vhost/ilanni02.img,format=qcow2,bus=virtio –network bridge=br0 –vnc –vncport=5992 –vnclisten=0.0.0.0 –force –autostart

由于kvm使用virtio作为硬盘,所以windows安装程序并不能识别,需要通过加载专用驱动实现,相关模块需要在安装时应用。通过加载额外的虚拟光驱来实现。

这里简单描述下KVM网络相关的配置
kvm-qemu向客户机提供了如下四种不同模式的网络
1、基于网桥的虚拟网卡
2、基于nat的虚拟网络
3、QEMU内置的用户网络模式
4、直接分配网络设备的网络

-net nic[,vlan=n][,macaddr=mac][,model=type][,name=name][,addr=addr][,vertors=v]

默认未配置情况下为 -net nic -net user 即使用上面的第三种模式的网络

网桥模式1、可以让客户机和宿主机共享一个物理网络设备连接网络,2、也可以让客户机有自己的IP直连与宿主机一摸一样的网络。

这里介绍一下共享一个物理网络设备连接网络的情况,具体示意图如下图所示

基本原理就是创建一个桥接接口br0,在物理网卡和虚拟网络接口之间传递数据,具体做法为:虚拟出一个bridge,将这个bridge绑定到物理网卡上并分配一个对外的地址,再将对应的虚拟机网络设备绑定到这个虚拟bridge的一个端口上。

qemu-kvm配置网桥模式的步骤如下:
在宿主机中安装工具,bridge-utils和tunctl

yum install bridge-utils tunctl
lsmod | grep tun #查看是否加载tun模块
modprobe tun #加载tun模块

建立bridge,并绑定到一个可以正常对外访问的网络接口上,同时让bridge成为本机与外部网络的接口

brctl addbr br0          #添加bridge
brctl addif br0 eth0     #将br0和eth0绑定起来 (可能让网络断掉,最好在本机操作,不要通过网络)
brctl stp br0 on         #将br0设置为启用STP协议
ifconfig eth0 0          #将eth0的IP设置为0
dhclient br0             #将br0网络配置好

建立好bridge后的状态是:eth0进入混杂模式,接收网络中所有数据包,网桥br0进入转发状态。

准备开启和关闭客户机的网络配置脚本(创建客户机时带上参数后,客户机开启关闭会自动调用)

################################qemu-ifup.sh
#!/bin/bash
switch=br0
if [ -n "$1" ]; then
#create a tap interface
#tunctl -u $(whoami) -t $1
#start up the tap interface
ip link set $ up
sleep 1
#add tap interface to the bridge
brctl addif ${switch} $1
exit 0
else
echo "error: no interface specified"
exit 1
fi

################################qemu-ifdown.sh
#!/bin/bash
switch=br0
if [ -n "$1" ]; then
delete the specified interface
tunctl -d $1
rlease tap interface from bridge
brctl delif $(switch) $1
shutdown the tap interface
ip link set $1 down
exit 
else
echo "error: no interface specified"
exit 1
fi

qemu-kvm启动网桥模式,参数如下

-net tap[,vlan=n][,name=str][,fd=h][,fds=x:y:...:z
[,ifname=name][,script=file]
[,downscript=dfile][,helper=helper][,sndbuf=nbytes][,vnet_hdr=on|off][,vhost=on|off]
[,vhostfd=h][,vhostfds=x:y:...:z][,vhostforce=on|off
[,queues=n]

该配置表示连接宿主机的TAP(TAP是模拟数据链路层的虚拟网络设备)网络端口到n号VLAN,
并使用file和dfile作为启动和关闭客户机时的网络配置脚本。
example
qemu-system-x86_64 *.img -smp 2 -m 1024 -net nic
-net tap,ifname=tap1,script=/etc/qemu-ifup.sh,downscript=no -vnc :0 -daemonize

NAT模式
network address translation, 网络地址转换,将内网IP数据包包头中的源IP地址转换为一个外网的IP地址,因此内部IP对外是不可见的,隐藏了内部结构更加安全,但对外提供服务则是其局限性,目前通常采用iptables工具进行端口映射解决。具体示意图如下所示
1、相比使用网桥共享同一个网络设备,其区别在于virbr0并未直接绑定到实际的物理网卡,数据包经过virbr0,进行nat后转到IP包转发后从实际的物理网络设备中出去
2、在nat模式下,需要在宿主机上运行一个DHCP服务器给内网的机器分配IP地址,可以使用dnsmasq工具实现

配置虚拟机已nat方式连接网络的步骤如下

1检查Linux内核网络配置和nat相关配置是否已经配好
2安装必要的软件包bridge-utils、iptables、dnsmasq
3建立bridge,设置bridge内网IP
brctl addbr virbr0
brctl stp virbr0 on
brctl setfd virbr0 0 #设置网络转发延时
ifconfig virbr0 192.168.122.1 netmask 255.255.255.0 up
ifconfig tap0 0.0.0.0 up
brctl addif virbr0 tap0

开始ip转发

echo 1> /proc/sys/net/ipv4/ip_forward

QEMU内部用户模式网络
用户模式网络(默认的网络模式)完全由qemu实现,不依赖其他工具,是qemu使用slirp实现的一整套TCP/IP协议栈,并使用这个协议栈实现了一整套虚拟的NAT网络

这种方式优点在于简单、独立性好、不需要root权限,但存在以下三个缺点

性能较差
不支持部分网络功能,例如ICMP协议
不能从宿主机和外部网络访问客户机

Lokie博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论
  • 本博客使用免费开源的 laravel-bjyblog v5.5.1.1 搭建 © 2014-2018 lokie.wang 版权所有 ICP证:沪ICP备18016993号
  • 联系邮箱:kitche1985@hotmail.com