设为首页 收藏本站
查看: 2890|回复: 0

[经验分享] kvm虚拟化平台部署

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-9-30 08:45:44 | 显示全部楼层 |阅读模式
kvm简介

Linux Kernel-based Virtual Machine (KVM) 是一款开源的虚拟化软件,是完全虚拟化的一种实现,KVM的虚拟化需要有硬件的支持,且其只能运行于64位系统上。其实KVM仅是内核的一个模块,宿主机的内核加载了kvm的模块后就可以使用工具创建虚拟机,该模块在Linux2.6.20之后就集成在Linux的的各个主要发行版中。
kvm的相关模块:
1
2
3
[iyunv@node1 ~]# lsmod | grep kvm
kvm_intel              54285  0
kvm                   333172  1 kvm_intel



kvm的架构图:
wKioL1YKj4CR_TikAACAvjHcI0c093.jpg

其实kvm模块仅负责CPU与内存的虚拟化管理,其自身不会虚拟I/O设备,需要借助于qemu来实现管理用户空间和模拟I/O等相关功能。只是qemu是通过完全模拟的形式来创建I/O设备,性能低下,为了提高性能,I/O设备尽量使用半虚拟化设备virtio,virtio驱动在2.6.25之后直接整合进了Linux内核,部署的虚拟机能够直接驱动对应设备。

在部署虚拟机之前首先需要检查当前的服务器硬件是否支持硬件虚拟化技术,查看输出的cpu信息中flags这一项里是否有vmx(Intel的cpu),amd的cpu为svm。如果没有这一项,就表示cpu不支持硬件虚拟化,kvm则不能使用。
1
[iyunv@node1 ~]# grep --color=auto -Ei "vmx|svm" /proc/cpuinfo




使用qemu-kvm部署虚拟机
安装对应的软件包。

1
[iyunv@node1 ~]# yum install -y qemu-kvm qemu-kvm-tools



在RHEL6上,qemu-kvm命令位于/usr/libexec目录中。由于此目录不属于PATH环境变量,故无法直接使用,通过创建一个/usr/bin/目录下的链接来解决该问题。
1
2
[iyunv@node1 ~]# ln -sv /usr/libexec/qemu-kvm /usr/bin/qemu-kvm
`/usr/bin/qemu-kvm' -> `/usr/libexec/qemu-kvm'




配置网桥
桥设备不支持使用NetworkManager来管理,使用network来管理。简单起见,可以安装桥设备管理程序包brctl-utils,通过命令来完成创建。正真桥功能的实现是内核中的某一模块,所以不使用brctl-utils的功能,手动配置的方式也可以实现。
1
2
[iyunv@node1 ~]# service NetworkManager stop
[iyunv@node1 ~]# chkconfig NetworkManager off



1
2
3
4
5
6
7
8
9
10
11
12
13
[iyunv@node1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=Bridge
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none
IPADDR=192.168.1.106
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
STP=on
DNS1=61.153.81.74
DNS1=202.96.104.27
USERCTL=no                                 #防止网络环路



eth0设备当做交换机使用:
1
2
3
4
5
6
7
8
[iyunv@node1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none
BRIDGE=br0
USERCTL=no



配置完成后,重启网卡。

1
2
3
4
5
[iyunv@node1 ~]# service network restart

[iyunv@node1 ~]# brctl show
bridge name    bridge id      STP enabled    interfaces
br0     8000.000c293331f2   yes     eth0



在启动虚拟机时,使用script=file指定脚本(默认为/etc/qemu-ifup)来配置当前网络接口,并使用downscript=file指定的脚本(默认为/etc/qemu-ifdown)在虚拟机关闭时撤消接口配置;使用script=no和downscript=no可分别用来禁止执行脚本。
编辑/etc/qemu-ifup:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
vim /etc/qemu-ifup
#!/bin/bash
#
switch=br0

if [ -n "$1" ]; then
   ip link set $1 up
   sleep 0.5s
   brctl addif $switch $1
   exit 0
else
   echo "Error:no specifed Interface."
   exit 1
fi



该脚本中的$1(第一个参数)为ifname指定的tap设备,配置完成后为脚本添加执行权限:
1
[iyunv@node1 ~]# chmod u+x /etc/qemu-ifup



创建磁盘镜像文件

1
2
[iyunv@node1 ~]# qemu-img create -f qcow2 -o size=30G /vm/img/centOS_1.qcow2
Formatting '/vm/img/centOS_1.qcow2', fmt=qcow2 size=32212254720 encryption=off cluster_size=65536



安装系统
这里使用pxe的方式安装操作系统,最常见的方式是在虚拟机启动时直接导入镜像文件。

1
2
3
4
[iyunv@node1 ~]# qemu-kvm -name "centOS_1" -m 1024 -cpu host -smp 1 -drive file=/vm/i
mg/centOS_1.qcow2,if=virtio,index=0,media=disk,format=qcow2 -boot order=nc -net nic,m
odel=virtio -net tap,ifname=vnet0,script=/etc/qemu-ifup,downscript=no
VNC server running on `::1:5900'



-boot order=nc    #指定引导次序,先通过网络方式引导,然后是磁盘。
这里使用的磁盘接口是virtio(通过半虚拟化的方式实现),virtio的磁盘设备在虚拟机中体现的文件为“vda”,需要将ks文件中的sda设备改为vda。以上命令的各个选项可以通过man文档查看。
虚拟机启动之后,图形信息默认输出至VNC会话,该服务监听在本地的5900端口,也可以通过-vnc选项动态指定。
使用vncviewer查看:
1
[iyunv@node1 ~]# vncviewer :5900



wKioL1YKpQOijxV0AAE22xV61WE419.jpg
启动安装过程,
wKiom1YKpSyzIA_mAAF6m6y5KTw225.jpg
在使用vncviewer查看之前,需要使宿主机支持显示图形界面:
1
2
3
4
[iyunv@node1 ~]# yum groupinstall "X Window System"
[iyunv@node1 ~]# yum groupinstall Desktop
[iyunv@node1 ~]# yum install tigervnc-server
[iyunv@node1 ~]# yum install tigervnc



图形界面的显示比较占用带宽,可以在启动虚拟机时指定-nographic选项,在当前命令行中直接输出虚拟机的字符界面。这需要在虚拟机上的/etc/grub.conf文件中添加内核参数“console=ttyS0“,貌似在创建虚拟机时无法直接向内核注入参数,使用virt-install创建时就可以。

使用qemu进行实时迁移
实验环境:
192.168.1.106 -->192.168.1.127
在192.168.1.127上配置好环境(例如网桥,磁盘镜像...),迁移过程只是迁移内存中的数据,如果迁移过程中,虚拟机实例内存的改变量超出了网络带宽的传输能力,这个迁移将无法完成。

将192.168.1.106上将磁盘镜像文件同步至192.168.1.127,当然最好是使用共享存储:
1
[iyunv@node1 ~]# scp /vm/img/centOS_1.qcow2 192.168.1.127:/vm/img/



同步虚拟机启动时创建网络设备的脚本文件:
1
[iyunv@node1 ~]# scp /etc/qemu-ifup 192.168.1.127:/etc/



在192.168.1.106上启动虚拟机,并为虚拟机配置好网络。
1
2
3
[iyunv@node1 ~]# qemu-kvm -name "centOS_1" -m 1024 -cpu host -smp 1 -drive file=/vm/i
mg/centOS_1.qcow2,if=virtio,index=0,media=disk,format=qcow2,cache=writeback -boot ord
er=cn -net nic,model=virtio -net tap,ifname=vnet0,script=/etc/qemu-ifup,downscript=no -nographic



在192.168.1.127上使用同样的镜像文件启动虚拟机,启动时使用-incoming选项,实例不会启动而是等待来自其他主机的迁移请求。
1
2
3
4
[iyunv@node3 ~]# qemu-kvm -name "centOS_1" -m 1024 -cpu host -smp 1 -drive file=/vm/i
mg/centOS_1.qcow2,if=virtio,index=0,media=disk,format=qcow2,cache=writeback -boot ord
er=cn -net nic,model=virtio -net tap,ifname=vnet0,script=/etc/qemu-ifup,downscript=no -incoming tcp:0:5678
VNC server running on `::1:5900'



进入monitor端查看虚拟机状态(用vnc打开图形界面后,使用Ctrl+Alt+2进入monitor端,Ctrl+Alt+1切换回文本行界面):

wKioL1YKqMqwniiOAACLQ_k4FrU215.jpg

在192.168.1.106上开始迁移过程:
1
2
3
4
5
(qemu) info status
VM status: running
(qemu) migrate tcp:192.168.1.127:5678
(qemu) info status
VM status: paused (post-migrate)




在192.168.1.127上查看虚拟机状态,可以看到虚拟机相对于迁移之前已经处于运行状态。
wKiom1YKqReQzKbtAACp94o6L3U134.jpg
在迁移过程中,对被迁移的虚拟机发起ping请求,仅其中一个响应时间较长。
wKioL1YKqnWzYHZRAAOZTw12jmw736.jpg

使用libvirt部署虚拟机
libvirt这套工具是对qemu工具的二次封装,具有更好的用户体验,且适用于管理不同架构上的虚拟化技术,也支持远程连接,libvirt具有更强大的功能且更通用。
使用libvirt需要安装的包,并需要启动libvirtd服务。
1
2
3
4
[iyunv@node1 ~]# yum install -y libvirt virt-manager virt-viewer python-virtinst

[iyunv@node1 ~]# service libvirtd start
Starting libvirtd daemon:                                  [  OK  ]



创建桥设备:
1
2
3
4
5
6
7
8
[iyunv@node1 ~]# virsh iface-bridge eth0 br0
Created bridge br0 with attached device eth0
Bridge interface br0 started

[iyunv@node1 ~]# brctl show
bridge name    bridge id      STP enabled    interfaces
br0     8000.000c293331f2   yes     eth0
virbr0      8000.52540046a8b2   yes     virbr0-nic



创建磁盘镜像文件:
1
2
[iyunv@node1 ~]# qemu-img create -f qcow2 -o size=30G /vm/img/centOS_1.qcow2
Formatting '/vm/img/centOS_1.qcow2', fmt=qcow2 size=32212254720 encryption=off cluster_size=65536



使用virt-install启动虚拟机,并安装操作系统。
1
2
3
4
5
[iyunv@node1 ~]# virt-install --connect qemu:///system --virt-type kvm --name centOS6.5_1
--vcpus 1 --ram 1024 --disk path=/vm/img/centOS_1.qcow2,size=30,bus=virtio,sparse,forma
t=qcow2 --network bridge=br0,model=virtio --location
r/centos-6.5-x86_64/ --extra-args "ks=http://192.168.3.10/cobbler/ks.cfg console=ttyS0 seri
al" --force --noautoconsole --nographics



--location       #指定安装源
--extra-args    #指定额外的参数,ks指定安装过程所用的ks文件,console=ttyS0为注入的内核参数。
这个与qemu-kvm创建的虚拟机类似,默认虚拟机的显示类型为vnc,且监听在本地的5900端口,若在创建虚拟机时,指定--nographics,虚拟机的显示通过文本界面输出。这时需要为虚拟机的内核添加参数console=ttyS0,最好是在创建虚拟机时指定(--extra-args "kconsole=ttyS0")。然后在宿主机上可以通过“virsh console domainName”进入虚拟机的终端。使用”Ctrl+]“退出虚拟机的终端。如下图:
wKioL1YKrjOgx48fAAGRZrIApcU263.jpg

若已经存在镜像文件,创建虚拟机时直接导入:
1
2
3
[iyunv@node1 ~]# virt-install --connect qemu:///system --virt-type kvm --name centOS6.5_1
--vcpus 1 --ram 1024 --disk path=/vm/img/centOS_1.qcow2,size=30,bus=virtio,sparse,forma
t=qcow2 --network bridge=br0,model=virtio --import --force --noautoconsole




虚拟机创建完成后,其配置信息保存在/etc/libvirt/qemu目录中,文件名与虚拟机相同,格式为XML。所以虚拟机在创建时指定的名称(--name)必须唯一。
对于已经创建好的虚拟机可通过virsh命令来管理,简单介绍几个常用的子命令:
查看本机上的所有已启动的虚拟机:

1
2
3
4
[iyunv@node1 ~]# virsh list
Id    Name                           State
----------------------------------------------------
2     centOS6.5_1                    running



启动关闭某个虚拟机:

1
2
[iyunv@node1 ~]# virsh start centOS6.5_1
[iyunv@node1 ~]# virsh shutdown centOS6.5_1



删除一个虚拟机:
1
[iyunv@node1 ~]# virsh undefine centOS6.5_1



导出虚拟机的配置信息;根据定义好的配置信息创建虚拟机(不启动)
1
2
[iyunv@node1 ~]# virsh dumpxml centOS6.5_1 > /tmp/centOS6.5_2.xml
[iyunv@node1 ~]# virsh define /tmp/centOS6.5_2.xml



关于更具体说明查看“virsh help”.................^_^


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-120680-1-1.html 上篇帖子: KVM Error:list.remove(x):x not in list 下篇帖子: kvm : Permission denied
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表