设为首页 收藏本站
查看: 2768|回复: 2

[经验分享] kvm使用详解

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-12-23 08:51:03 | 显示全部楼层 |阅读模式
介绍:

KVM(Kernel-based Virtual Machine,即内核级虚拟机)是一个开源的系统虚拟化模块,是使用于 Linux 核心中的虚拟化基础建设,KVM 在 2007 年 2 月被导入 Linux 2.6.20 核心中,它也被引入 FreeBSD。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM目前已成为学术界的主流VMM之一。
kvm需要经过修改的QEMU软件(qemu-kvm)和virt(libvirt)作为虚拟机上层控制界面,kvm能在不改变linux或windows镜像的情况下同时运行多个虚拟机,并为每一个虚拟机配置个性化硬件环境(网卡、磁盘、图形适配器……),也可以按需求加载半虚拟化驱动,加强和硬件的协作。
在主流的linux内核,如2.6.20以上的内核均包含了kvm核心,在近两年的linux内核更新中,也都有增强kvm稳定性和负载能力的修改。
一言以蔽之,kvm是和VMware,virtual box一样的虚拟机工具,不过他并没有windows版本.他功能强大,稳定性高,最重要的,当然是完全免费开源了.

安装kvm:
安装前,需要先检查一下cpu支不支持虚拟化,不然,装了也没意义.

1
cat /proc/cpuinfo |grep -E 'vmx|svm'



如果输出的结果包含VMX,是Intel处理器虚拟机技术标志:如果包含SVM,是AMD处理器虚拟机技术的标志,如果什么都没有得到,那系统并没有支持虚拟化的处理,不能使用KVM,当然,近几年新出的cpu绝大部分都支持了。
然后,就可以来安装了,kvm这个工具其实是一个工具集群,所以要想编译安装的话,难度太高,所以无论那篇文章,都是建议yum或apt安装的,而还好各大官方和非官方的源都对kvm的更新跟进比较迅速,所以还是可以.
1
2
3
4
5
6
#redhat和centos
yum install -y qemu-kvm libvirt virt-manager python-virtinst libvirt-client libvirt-python
#ubuntu
apt-get install -y qemu-kvm libvirt-bin virt-manager virtinst python-libvirt
#然后启动一下
service libvirtd start



软件包说明:

qemu-kvm:kvm基本功能,但仅仅安装KVM还不是一个完整意义上的虚拟机,只是安装了一个hypervisor(这个步骤其实和单纯安装ESXI产品一样),必须安装一些管理工具软件包配合才能使用。
libvirt :是一个可与管理程序互动的 API 程序库。libvirt 使用 xm 虚拟化构架以及 virsh 命令行工具管理和控制虚拟机。
virt-manager:也称 Virtual Machine Manager,它可为管理虚拟机提供图形工具。它使用 libvirt程序库作为管理 API。
virtinst:提供创建虚拟机的 virt-install 命令。
libvirt-python:软件包中含有一个模块,它允许使用由 Python 编程语言编写的应用程序使用
还有其他依赖包就不一一说明了,到这一部kvm是安装完成了,后面就看怎么安装虚拟机了.

安装虚拟机:
软件装完了,那就上虚拟机吧,不过在安装前,还需要做些事情,检查selinux关闭状态和bios的虚拟化有没有开,如果这两个没做好,你就装不了虚拟机.
1
2
3
4
5
6
7
8
9
10
11
#关闭selinux
#动态关闭方式,重启了依然会开
setenforce 0
#永久关闭方式,不过需要重启才会生效
sed -i '/^SELINUX=/c\SELINUX=disabled' /etc/selinux/config
#检查kvm模块有没有加载,没加载就需要去bios设置(当然是要重启了)
lsmod |grep -w kvm
#这是开了的结果,会看到1这个数字
kvm    540672  1 kvm_intel
##这是没有开的结果,会看到是0这个数字
#kvm    540672  0




我想selinux就不用多说了,这个是军工级防火墙,大部分人是用不到的,也阻碍虚拟机和外界的通信,不实际,除非你真的有这样的需求吧.
至于bios没开虚拟化的问题,正如我开头说的,近几年的cpu都支持虚拟化,但是服务器厂家出于某些安全和性能原因,默认关闭,这个时候就需要手动去开启,开启选项各不相同,我不能一一举例,如果很不幸没开虚拟化,还请各位自己摸索了.如果不设置好这个模块加载的问题,那么你的虚拟机一装就蓝屏,就等于用不了了.
--------------------------------选读内容---分割线----------------------------------------
然后还有一个关于网络设置的问题,kvm和其他虚拟机软件一样,支持nat和网桥的网络模式,虽然我觉得nat模式再做iptables转发是足够的,但是总有些人觉得网桥模式直接获取本地DHCP源IP也很有需要,而网桥模式需要把服务器自身的网卡设置成网桥.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#先配置一个网络桥接设备
vim ifcfg-br0
DEVICE=br0
BOOTPROTO=static
ONBOOT=yes
TYPE=Bridge
IPADDR=10.10.102.2
NETMASK=255.255.0.0
GATEWAY=10.10.77.254
DNS1=8.8.8.8
DELAY=0
#假如你是DHCP
#BOOTPROTO=dhcp
#然后再配置本地网卡
vim ifcfg-eth0
DEVICE=eth0
HWADDR=00:16:76:D6:C9:45
ONBOOT=yes
BRIDGE=br0
NM_CONTROLLED=no
#重启网络
service network restart
#重启一下kvm工具
service libvirtd restart



要注意报错信息,只算是一个介绍吧,各位见谅.
---------------------------------------分割线---------------------------------------------
好了,该准备的准备好了,下面就可以来安装虚拟机了,看完刚才yum的软件包,大家应该知道,可以用命令安装,也可以用图形来安装,然后我都不打算细说,只说几个重点,进到装系统界面嘛,我就什么也不说了,装系统应该是干IT的基本技能了.
先看一个最基本的命令行安装的例子:
1
2
#创建一个虚拟机
virt-install --name rhel5 --hvm --ram 1024 --disk path=/tmp/win7.img,size=1 --network network:default --vnc --os-variant vista --cdrom /mnt/cd1



上面的操作命令,使用网络为默认的网络,虚拟机的名字为rhel5.内存分配为1024M。虚拟机存储文件的位置为:/tmp/rhel5.img 使用/mnt/cd1为安装源(已经挂载了iso的文件夹)。然后就会调用一个图形界面virt-viewer进行安装,再然后就和你一般装系统一样了,慢慢点"下一步"吧。
要想图形界面安装虚拟机,就更简单了:
1
2
#调用kvm图形界面安装工具,最好在本机操作,不然可能会有键盘不能用的情况
virt-manager



然后就弹出一个框:

wKioL1hbcmLzdnj0AACW39t-0bg293.jpg
然后就是点击[创建虚拟机],其他就自己慢慢试下,后面再截些图详细说说.
下面再来详细讲讲一些细节:

先来讲讲虚拟机的存储文件,如果有了解过其他虚拟机软件的话,其实这个还是分很多种格式,不过并不准备详细说,只说一种,而且是kvm自带的qcow2格式,他的特点是可伸缩,而且有实际存储数据才会占空间,没有就不占,
1
2
3
4
5
6
7
8
9
10
11
#创建一个qcow2格式的虚拟硬盘,容量50G
qemu-img create -f qcow2 windows2008.img 50G
#查看这个虚拟硬盘的信息,看到实际上这个文件占很少空间,因为此时这个虚拟硬盘并没有数据
qemu-img info windows2008.img
image: windows2008.img
file format: qcow2
##虚拟磁盘50G容量
virtual size: 50G (53687091200 bytes)
##实际占用136K空间
disk size: 136K
cluster_size: 65536



这种方式就是磁盘的精简模式。如果使用virt-manager来创建的话,创建磁盘文件的容量不能超过当前磁盘的空闲容量,看起来就不那么灵活了.
然后来看他灵活的地方,记得要关闭虚拟机来做,

1
2
3
4
5
6
7
8
9
10
11
12
#添加1G空间
qemu-img resize windows2008.img +1G
qemu-img info windows2008.img
image: windows2008.img
file format: qcow2
##总的空间为51G
virtual size: 51G (54760833024 bytes)
disk size: 5.9G
cluster_size: 65536
#但是qcow2格式不能减。
qemu-img  resize windows2008.img -- -30G
qemu-img: This image format does not support resize



其实qcow2格式只能加不能减少容量,而raw格式可以实现增加或者减少容量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
qemu-img  resize rhel-5.7.img -- -2G
Image resized.
qemu-img info rhel-5.7.img
image: rhel-5.7.img
file format: raw
virtual size: 18G (18824036352 bytes)
disk size: 16G
qemu-img  resize rhel-5.7.img -- +2G
Image resized.
qemu-img info rhel-5.7.img
image: rhel-5.7.img
file format: raw
virtual size: 20G (20971520000 bytes)
disk size: 16G



每种镜像文件格式都有优点缺点,想要用得666,是要熟悉每种格式的特点,不过个人觉得,用好自己熟悉的也是可以了,大部分情况下还是差别不大的。
然后,就有了开头那条命令的安装步骤:
1
2
3
4
5
6
7
8
9
#先挂载一个iso系统盘
mount -o loop /data/vsftp/cn_windows_server_2008_r2_standard_XXXX.iso /mnt/cd1/
mount: /dev/loop0 is write-protected, mounting read-only
#安装命令
virt-install --name win2008 --hvm --ram 1024 --disk path=/data/kvmimg/windows2008.img,size=1 --network network:default --vnc --os-variant vista --cdrom /mnt/cd1
#然后,就会弹出一个框,出现系统安装界面
#怎么装系统我就不说了,这个大家应该知道怎么安装
#最后,安装完记得把iso取消挂载了
umount /mnt/cd1



当然,和其他虚拟机软件一样,他也支持克隆:
关闭demo这台虚拟机.把这个系统作为模版,从模版里面作结做LINK模式克隆。

1
2
3
4
5
#进入镜像的目录
cd /data/kvmimg/
###创建一个名为mysqla.img的磁盘文件
qemu-img create -b demo.img -f qcow2 mysqla.img
Formatting 'mysqla.img', fmt=qcow2 size=53687091200 backing_file='demo.img' encryption=off cluster_size=0



给新的虚拟机创建一个配置文件,在linux世界,一切都是文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#进入/etc/libvirt/qemu 是kmv的配置文件存放的地方。
cd /etc/libvirt/qemu
#你可以复制出两份副本。分别是mysqla.xml和mysqlb.xml
cp demo.xml mysqla.xml
#先生成一个uuid来用,一会用到
uuidgen
50cb15eb-8f53-4d35-a1bb-0aafd7f280e7
#修改配置文件,一般修改四个地方即可。Name/uuid/磁盘源文件/mac地址。
vim mysqla.xml
###这个为虚拟机的机器名,机器名不等于hostname
<name>mysqla</name>   
###修改新的uuid,因为uuid是每台虚拟机的唯一标示符,刚才生成的那个
<uuid>50cb15eb-8f53-4d35-a1bb-0aafd7f280e7</uuid>
###磁盘新路径,也就是磁盘源文件。
<source file='/data/kvmimg/mysqla.img'/>  
###修改其中一个mac地址的数字即可,防止mac地址重复
<mac address='52:54:00:a6:56:89'/>
#修改好保存退出,然后重启
/etc/init.d/libvirtd restart
#可以使用virt-manger图形界面启动mysqla这台虚拟机。也可以使用命令行启动。
#域 mysqla 被创建(从 /etc/libvirt/qemu/mysqla.xml)
virsh  create /etc/libvirt/qemu/mysqla.xml
virsh start mysqla



如此类推,你能创建很多克隆的镜像.
图形界面就字面意思了:
点击第一张图显示的[创建新虚拟机],然后弹出一个窗口,这里如无特别需求,都是默认的,点[forward]下一步

wKioL1hbmLfBQVirAADw_nZTEA0388.jpg

这里选择iso文件,如箭头所指,先点击[浏览],然后选择镜像目录,这里是[cop],再然后选到你想安装的iso文件

wKiom1hbmLeAmjEMAAIz3ffVDIU400.jpg
再然后,选择你想分配的内存和cpu,想安装快一点,可以分多点,后面可以随便改

wKioL1hbmLjDwHUkAAC08QjYw0c507.jpg

选择虚拟硬盘,你想用默认的格式就直接该改数字,然后下一步就好了,你想自己创建,那就点[manage],然后选择你想存放虚拟硬盘镜像文件的路径,然后点那个绿色的[加号],再然后创建你想的格式和容量,点击[完成],最后选择你刚创建的虚拟硬盘镜像,再点[foeward]下一步

wKiom1hbmLmxz-0KAAJmg5xctVw125.jpg
最后改名,和选择网络,一般来说就只有这个nat模式了,你有设置网桥就选你创建的网桥就行

wKioL1hbmLmD1ZXLAAD4Ljw07AE576.jpg
还是那样,安装系统我就不多说了,各位自行操作.

虚拟机端口映射:
我们装虚拟机当然不是为了玩玩,是切切实实用起来,但问题是,如果不是网桥模式,在nat模式下,虚拟机虽然能访问外网,外网是访问不了它的,这可咋办?不要慌,linux有iptables,可以达到路由功能,实现数据包转发.
首先,要了解两个要点:
第一,新版本的kvm在libvirtd启动时,会自己加入确保虚拟内网正常访问外网的NAT规则进来,在旧版本里是没有的,所以有些文章由于版本新旧的问题,并不一定能用,因为双方规则可能有些冲突了.
第二,系统自带的iptables匹配规则是有先后之分的,默认是自下而上匹配,以最后一次匹配为准,所以就有可能出现和kvm自带规则冲突的问题,-A是加到最下面一行的,-I是加到最上面一行的.
来看看要怎么做,例如我们有个windows虚拟机,要开通远程3389端口:
母机ip:192.168.1.132
母机映射目的端口:3389
nat网关:192.168.122.1
虚拟机ip:192.168.122.73
虚拟机端口:3389
1
2
3
4
5
6
7
8
9
10
11
#开启路由转发功能,在/etc/sysctl.conf里添加更改
sed -i '/net\.ipv4\.ip\_forward/c\net\.ipv4\.ip\_forward\=1' /etc/sysctl.conf
#有些可能没有这个设置,那就在这个文件最后加入
echo "net\.ipv4\.ip\_forward\=1" >>  /etc/sysctl.conf
#重载一下这个文件的参数
sysctl -p
#开启KVM服务器的IPtables的转发功能,
#让来自3389的请求透过防火墙连接到防火墙之后转发给192.168.122.73,并根据下面的规则转发出去,没有这条的话,下面两条都用不了。
iptables -I FORWARD -d 192.168.122.73/32 -p tcp --dport 3389 -j ACCEPT
#把所有访问192.168.1.132:3389的请求转发到192.168.122.73:3389的端口上。
iptables -t nat -A PREROUTING -p tcp --dport 3389 -d 192.168.1.132 -j DNAT --to 192.168.122.73:3389




这里无需做SNAT,因为libvirtd自己添加的在NAT表的MASQUERADE规则相当于已经给你做掉了SNAT转换!
如果你的iptables空空余也,那确实也是要做的,

1
2
#把所有访问192.168.122.73:3389端口的数据全部通过192.168.122.1这个网关转发出去。
iptables -t nat -A POSTROUTING -p tcp -d 192.168.122.73 --dport 3389 -j SNAT --to 192.168.122.1



如果iptables太多规则,不好保存save怎么办好呢,那就写个脚本吧
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cat fow.sh
#!/bin/bash
Guest_name=win2008
Host_external_ipaddr=192.168.1.132
Host_port=3389
Host_ipaddr=192.168.122.1
Guest_ipaddr=192.168.122.73
Guest_port=3389
if [ "${1}" = "${Guest_name}" ]; then
  if [ "${2}" = "start" ]; then
     iptables -t nat -A PREROUTING -p tcp --dport ${Host_port} -d ${Host_external_ipaddr} \
              -j DNAT --to ${Guest_ipaddr}:${Guest_port}
     iptables -I FORWARD -d ${Guest_ipaddr}/32 -p tcp \
              --dport ${Guest_port} -j ACCEPT
elif [ "${2}" = "stopped" ]; then
     iptables -t nat -D PREROUTING -p tcp --dport ${Host_port} -d ${Host_external_ipaddr} \
              -j DNAT --to ${Guest_ipaddr}:${Guest_port}
     iptables -D FORWARD -d ${Guest_ipaddr}/32 -p tcp \
              --dport ${Guest_port} -j ACCEPT
fi
fi



这是单一的匹配,当然你是可以改成多条匹配,这个自己慢慢去摸索了.

运维网声明 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-318152-1-1.html 上篇帖子: kvm cgroup的使用 下篇帖子: kvm 安全相关:selinux svirt
累计签到:1 天
连续签到:1 天
发表于 2017-3-21 15:33:15 | 显示全部楼层
KVM没用过,还是谢谢,学习下

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

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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