云计算与虚拟化工具之KVM

摘要

  云计算指的是资源使用和交互的一种模式
  虚拟化指的是技术,可以将物理计算机虚拟成多个逻辑计算机(VMware)
  他俩是彼此独立,互不影响,但是云计算又需要使用虚拟化技术。我们也可以说成云计算包含虚拟化,他们两个是无法相比较的。

云计算与虚拟化工具之KVM

云计算
时间:2016年10月27日
博客:www.abcdocker.com
微信公众号:abcdocker
笔者QQ:381493251
Abcdocker交流群:454666672
如果遇到什么问题可以进群询问,我们是一个乐于帮助的集体!

很多人会将云计算和虚拟化弄混,我下面为大家介绍一下

  云计算指的是资源使用和交互的一种模式   虚拟化指的是技术,可以将物理计算机虚拟成多个逻辑计算机(VMware)
  他俩是彼此独立,互不影响,但是云计算又需要使用虚拟化技术。我们也可以说成云计算包含虚拟化,他们两个是无法相比较的。

如果我们不想使用KVM,也可以使用LXD来替代KVM虚拟化技术

拓展知识:

LXD是容器虚拟化技术,可以用来替代KVM。测试的性能是远远的超过KVM,它是lxc管理工具来实现的。LXD是一个完整的操作系统
   相关文章链接请点我
LXC是容器是一种内核虚拟化技术。
   相关文章链接请点我
LXCFS主要是用作docker隔离,例如我们执行uptime,出来的时间是物理机的而不是容器里面的proc下面的文件docker是无法隔离的,我们可以使用LXCFS技术进行隔离
   相关文章链接请点我


云计算介绍

传统数据中心面临的问题:

资源利用率低
资源分配不合理
自动化能力差
初始成本高

IDC托管传统流程:买台机器-放到IDC-安装系统-部署应用-买个域名-绑定上去-对外访问-ICP备-ICP证-文网文

一、云计算是什么?

  1. 云计算是一种模式
  2. 云计算必须通过网络来使用
  3. 弹性计算、按需付费、快速扩展 VPS就无法做到)
  4. 不需要关心太多基础设施,都有云计算提供商提供

二、云计算分类

私有云 解释:私有云就是自己构建一个云计算平台
公有云 解释:公有云提供商来进行提供云计算服务
混合云 解释:既有私有云又包含公有云

提示:现在私有云在国内比较火

三、云计算分层

提示:有了云计算以后,下面绿色的才是我们需要维护的

三种不同的场景
1.IDC环境 需要考虑网络、服务器、机房位置、带宽等,都需要考虑
2.基础设施环境 平台级别,类似于阿里云的ces 提供一个平台 服务是我们自己搭建的
3.平台环境 软件级别类似于腾讯企业邮箱,只需要买用户就可以安全措施腾讯有提供服务
1.jpg-101.4kB
        2.jpg-35.2kB

云计算是一种资源通过网络交互的一种模式,同时这个资源要具有弹性扩展按需付费等特性
提示:现在大多数互联网基本上都是SaaS只卖服务不卖产品

四、什么是KVM?

KVM是内核级虚拟化技术
KVM全称Kernel-based Virtual Machine
3.jpg-33.3kB
4.jpg-35.1kB
提示:在虚拟化中,每台系统之间都是不会相互影响的。

五、虚拟化分类

1.硬件虚拟化 硬件虚拟化代表:KVM
2.软件虚拟化 软件虚拟化代表:Qemu

提示:硬件虚拟化是需要CPU支持,如果CPU不支持将无法创建KVM虚拟机

六、虚拟化技术

  1.  全虚拟化:全虚拟化代表有:`KVM`
  2.  半虚拟化:半虚拟化代表有:`Hypervisor`
  3. 针对`IO层面半虚拟化`要比全虚拟化要好,因为`磁盘IO`多一层必定会慢。一般说IO就是网络IO和磁盘IO 因为这两个相对而言是比较`慢`的
  4.   
  5. 提示: QemuKVM的最大区别就是,如果一台物理机内存直接4G,创建一个vm虚拟机分配内存分4G,在创建一个还可以分4G。支持超配,但是qemu不支持

七、虚拟化使用场景分类

服务器虚拟化:解决资源利用率低的问题
桌面虚拟化:有一些弊端,图形显示层面会有问题
应用虚拟化:没接触过,公司比较穷买不起,基本上只有银行等国企才会用`**Xenapp  ICA

八、虚拟化工具KVM介绍

KVM 全称Kernel-based Virtual Machine内核级虚拟化机器
  原本由以色列人创建,现在被红帽收购
ESXI 虚拟套件,现在是免费使用
VMware vSphere Hypervisor – 安装和配置
提示:一台服务器首选ESXI

九、KVM安装

调整虚拟机
1.png-84.6kB
虚拟化Intel使用的是intel VT-X AMD使用的是AMD-V

创建虚拟机步骤
1.准备虚拟机硬盘
2.需要系统iso镜像
3.需要安装一个vnc的客户端来连接

查看系统环境

  1. [root@linux-node1 ~]# cat /etc/redhat-release
  2. CentOS Linux release 7.2.1511 (Core)
  3. [root@linux-node1 ~]# uname -r
  4. 3.10.0-327.36.2.el7.x86_64

Centos7下载:http://pan.baidu.com/s/1c2MHsGg 密码:5w1u

检查是否有vmx或者svm

  1. [root@linux-node1 ~]# grep -E '(vmx|svm)' /proc/cpuinfo
  2. flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ida arat epb pln pts dtherm hwp hwp_noitfy hwp_act_window hwp_epp tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 invpcid rtm rdseed adx smap xsaveopt

安装kvm用户态模块

  1. [root@linux-node1 ~]# yum list|grep kvm
  2. libvirt-daemon-kvm.x86_64 1.2.17-13.el7_2.5 updates
  3. pcp-pmda-kvm.x86_64 3.10.6-2.el7 base
  4. qemu-kvm.x86_64 10:1.5.3-105.el7_2.7 updates
  5. qemu-kvm-common.x86_64 10:1.5.3-105.el7_2.7 updates
  6. qemu-kvm-tools.x86_64 10:1.5.3-105.el7_2.7 updates
  7. [root@linux-node1 ~]# yum install qemu-kvm qemu-kvm-tools libvirt -y
  8. libvirt 用来管理kvm
  9. kvm属于内核态,不需要安装。但是需要一些类似于依赖的

启动

  1. [root@linux-node1 ~]# systemctl start libvirtd.service
  2. [root@linux-node1 ~]# systemctl enable libvirtd.service

启动之后我们可以使用ifconfig进行查看,libvirtd已经为我们安装了一个桥接网卡

  1. [root@linux-node1 ~]# ifconfig
  2. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  3. inet 192.168.56.11 netmask 255.255.255.0 broadcast 192.168.56.255
  4. inet6 fe80::20c:29ff:fef4:affe prefixlen 64 scopeid 0x20<link>
  5. ether 00:0c:29:f4:af:fe txqueuelen 1000 (Ethernet)
  6. RX packets 34379 bytes 41300995 (39.3 MiB)
  7. RX errors 0 dropped 0 overruns 0 frame 0
  8. TX packets 11590 bytes 1384679 (1.3 MiB)
  9. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  10. lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
  11. inet 127.0.0.1 netmask 255.0.0.0
  12. inet6 ::1 prefixlen 128 scopeid 0x10<host>
  13. loop txqueuelen 0 (Local Loopback)
  14. RX packets 103 bytes 7866 (7.6 KiB)
  15. RX errors 0 dropped 0 overruns 0 frame 0
  16. TX packets 103 bytes 7866 (7.6 KiB)
  17. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  18. virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
  19. inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
  20. ether 52:54:00:f6:bd:c9 txqueuelen 0 (Ethernet)
  21. RX packets 0 bytes 0 (0.0 B)
  22. RX errors 0 dropped 0 overruns 0 frame 0
  23. TX packets 0 bytes 0 (0.0 B)
  24. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

libvirtd为我们启动了一个dnsmasqp,这个主要是用来dhcp连接的,这个工具会给我们的虚拟机分配IP地址

  1. [root@linux-node1 ~]# ps -ef|grep dns
  2. nobody 5233 1 0 14:27 ? 00:00:00 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
  3. root 5234 5233 0 14:27 ? 00:00:00 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
  4. root 5310 2783 0 14:31 pts/0 00:00:00 grep --color=auto dns

查看磁盘空间大小
  最好是20G以上

  1. [root@linux-node1 tmp]# df -h
  2. Filesystem Size Used Avail Use% Mounted on
  3. /dev/mapper/centos-root 48G 1.7G 46G 4% /
  4. devtmpfs 1.9G 0 1.9G 0% /dev
  5. tmpfs 1.9G 0 1.9G 0% /dev/shm
  6. tmpfs 1.9G 8.6M 1.9G 1% /run
  7. tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
  8. /dev/sda1 497M 167M 330M 34% /boot
  9. tmpfs 378M 0 378M 0% /run/user/0

上传镜像
提示:如果使用rz上传镜像可能会出现错误,所以我们使用dd命令,复制系统的镜像。只需要挂载上光盘即可

  1. [root@linux-node1 opt]# dd if=/dev/cdrom of=/opt/CentOS-7.2.iso
  2. [root@linux-node1 opt]# ll
  3. total 33792
  4. -rw-r--r-- 1 root root 34603008 Jun 12 18:18 CentOS-7.2-x86_64-DVD-1511.iso

下载VNC
下载地址:http://www.tightvnc.com/download/2.8.5/tightvnc-2.8.5-gpl-setup-64bit.msi
安装完VNC如下图
2.png-22.9kB
3.png-105.1kB

创建磁盘
提示: qemu-img软件包是我们安装qemu-kvm-tools 依赖给安装上的

  1. [root@linux-node1 opt]# qemu-img create -f raw /opt/CentOS-7.2-x86_64.raw 10GFormatting '/opt/Centos-7-x86_64.raw', fmt=raw size=10737418240
  2. [root@linux-node1 opt]#
  3. [root@linux-node1 opt]# ll /opt/Centos-7-x86_64.raw
  4. -rw-r--r-- 1 root root 10737418240 Oct 26 14:53 /opt/Centos-7-x86_64.raw
  5. -f 制定虚拟机格式,raw是裸磁盘
  6. /opt/Centos 存放路径
  7. 10G 代表镜像大小

安装启动虚拟机的包

  1. [root@linux-node1 tmp]# yum install -y virt-install

安装虚拟机
 可以使用—help查看相关存储

  1. [root@linux-node1 tmp]# virt-install --help
  2. 我们可以指定虚拟机的CPU、磁盘、内存等

安装虚拟机

  1. [root@linux-node1 opt]# virt-install --name CentOS-7.2-x86_64 --virt-type kvm --ram 1024 --cdrom=/opt/CentOS-7.2.iso --disk path=/opt/CentOS-7.2-x86_64.raw --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
  2. --name = 给虚拟机起个名字
  3. --ram = 内存大小
  4. --cdrom = 镜像位置,就是我们上传iso镜像的位置,我放在/tmp下了
  5. --disk path = 指定磁盘
  6. --network network= 网络配置 default 就会用我们刚刚ifconfig里面桥接的网卡
  7. --graphics vnc,listen= 监听vnc

默认连接端口是从5900开始的

  1. [root@linux-node1 tmp]# netstat -lntup
  2. Active Internet connections (only servers)
  3. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  4. tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 2036/mysqld
  5. tcp 0 0 0.0.0.0:5900 0.0.0.0:* LISTEN 5767/qemu-kvm
  6. tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 4401/rpcbind
  7. tcp 0 0 0.0.0.0:4369 0.0.0.0:* LISTEN 1163/epmd
  8. tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 5233/dnsmasq
  9. tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1105/sshd
  10. tcp 0 0 0.0.0.0:15672 0.0.0.0:* LISTEN 1101/beam
  11. tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1701/master
  12. tcp 0 0 0.0.0.0:25672 0.0.0.0:* LISTEN 1101/beam
  13. tcp6 0 0 :::111 :::* LISTEN 4401/rpcbind
  14. tcp6 0 0 :::4369 :::* LISTEN 1163/epmd
  15. tcp6 0 0 :::22 :::* LISTEN 1105/sshd
  16. tcp6 0 0 ::1:25 :::* LISTEN 1701/master
  17. tcp6 0 0 :::5672 :::* LISTEN 1101/beam
  18. udp 0 0 192.168.122.1:53 0.0.0.0:* 5233/dnsmasq
  19. udp 0 0 0.0.0.0:67 0.0.0.0:* 5233/dnsmasq
  20. udp 0 0 0.0.0.0:111 0.0.0.0:* 4401/rpcbind
  21. udp 0 0 0.0.0.0:123 0.0.0.0:* 866/chronyd
  22. udp 0 0 127.0.0.1:323 0.0.0.0:* 866/chronyd
  23. udp 0 0 0.0.0.0:760 0.0.0.0:* 4401/rpcbind
  24. udp6 0 0 :::111 :::* 4401/rpcbind
  25. udp6 0 0 ::1:323 :::* 866/chronyd
  26. udp6 0 0 :::760 :::* 4401/rpcbind

提示:因为vnc默认是从5900开始的,所以我们如果是第一台不需要输入端口号

4.png-23.2kB

安装界面如下:
5.png-13.7kB
因为centos7 默认网卡发生改变,我们需要修改内核参数,使用eth0作为网卡
6.png-15.1kB
光标移动到Install CentOS上,按tab键 输入net.ifnames=0 biosdevname=0 回车

分区说明
提示:我们不分交换分区,因为公有云上的云主机都是没有交换分区的
7.png-25.2kB

分区如下:
8.png-126.2kB
然后我们点击Done
本次分配分区按照10G内存进行分配
分配标准分区
9.png-102.7kB
10.png-122kB
11.png-108.5kB
12.png-300kB
温馨提示:在虚拟机的世界里,越简单越好。像阿里云系统分区以前是给20个G,现在是给40个G
 装系统步骤不详细说明了,过于简单,请自行百度

虚拟机安装完成后是关闭了,我们需要启动

  1. [root@linux-node1 ~]# virsh list --all
  2. [root@linux-node1 ~]# virsh start CentOS-7.2-x86_64
  3. #CentOS-7.2-x86_64 是虚拟机的名字,是我们创建的时候定义的

启动之后将虚拟机网络进行修改
13.png-24kB
重启/etc/init.d/network restart 或者systemctl restart network
14.png-15kB
我们还需要修改一下DNS
15.png-25.5kB
现在我们就可以安装软件包了
16.png-10.3kB
我们启动的这个虚拟机在宿主机上显示这只是一个进程
17.png-84.6kB
提示:只有虚拟机启动才可以使用vnc进行连接

十、Libvirt介绍

libvirt是一个开源免费管理工具,可以管理KVMVMware
他需要起一个后台的进程,它提供了API。像openstack就是通过libvirt API来管理虚拟机
5.jpg-78.8kB
像我们virt-install 等命令底层都是通过libvirt来完成的

  1. [root@linux-node1 ~]# ll /etc/libvirt/qemu
  2. total 4
  3. -rw------- 1 root root 3896 Oct 26 16:34 CentOS-7.2-x86_64.xml
  4. drwx------ 3 root root 40 Oct 26 16:11 networks

  kvm虚拟机都是靠libvirt xml来定义的,我们是无法对他进行修改的,可以使用virsh edit CentOS-7.2-x86_64进行编辑
  
我们可以查看一下配置文件,大多数都是可以看的懂的
1.png-54.4kB

KVM管理命令

  1. [root@abcdocker ~]# virt-install #建立kvm虚拟机
  2. [root@abcdocker ~]# virsh list #查看正在运行的KVM虚拟机
  3. [root@abcdocker ~]# virsh list --all #查看所有KVM虚拟机
  4. [root@abcdocker ~]# virsh start name #启动KVM虚拟机
  5. [root@abcdocker ~]# virsh shutdown name #正常关闭KVM虚拟机
  6. [root@abcdocker ~]# virsh destroy name #强制关闭KVM虚拟机(类似于直接断电)
  7. [root@abcdocker ~]# virsh suspend name #挂起KVM虚拟机
  8. [root@abcdocker ~]# virsh resume name #恢复挂起的KVM虚拟机
  9. [root@abcdocker ~]# virsh dumpxml name #查看KVM虚拟机配置文件
  10. [root@abcdocker ~]# virsh edit name #编辑KVM虚拟机的xml配置文件
  11. [root@abcdocker ~]# virsh undefine name #彻底删除KVM虚拟机,不可逆,如果想找回来,需要备份/etc/libvirt/qemu的xml文件
  12. [root@abcdocker ~]# virsh snapshot-create name #创建快照
  13. [root@linux-node1 ~]# virsh snapshot-create CentOS-7.2-x86_64
  14. error: unsupported configuration: internal snapshot for disk vda unsupported for storage type raw
  15. 提示:kvm默认有一个镜像,我们现在做的镜像只是虚拟机修改过的地方做的快照.raw磁盘格式无法进行快照.我们在安装的时候需要修改为qcow2.具体介绍可以看下方io优化部分
  16. [root@abcdocker ~]# virsh snapshot-delete name #删除快照
  17. [root@abcdocker ~]# virsh snapshot-dumpxml name #导出XML
  18. [root@abcdocker ~]# virsh snapshot-list name #查看快照
  19. [root@linux-node1 ~]# virsh snapshot-list CentOS-7.2-x86_64
  20. Name Creation Time State
  21. ------------------------------------------------------------

十一、KVM虚拟机配置

1、CPU设置

修改CPU的数量,我们在创建的时候就可以指定cpu数量

  1. [root@linux-node1 ~]# virt-install --help | grep cpu
  2. --vcpus VCPUS Number of vcpus to configure for your guest. Ex:
  3. --vcpus 5
  4. --vcpus 5,maxcpus=10,cpuset=1-4,6,8
  5. --vcpus sockets=2,cores=4,threads=2,
  6. --cpu CPU CPU model and features. Ex:
  7. --cpu coreduo,+x2apic
  8. --cpu host

修改CPU我们只能修改虚拟机XML的配置

  1. [root@linux-node1 ~]# head /etc/libvirt/qemu/CentOS-7.2-x86_64.xml
  2. <!--
  3. WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
  4. OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
  5. virsh edit CentOS-7.2-x86_64
  6. or other application using the libvirt API.
  7. -->
  8. <domain type='kvm'>
  9. <name>CentOS-7.2-x86_64</name>
  10. <uuid>9c00c23f-505e-4e77-9fcd-34c0c834fc8d</uuid>

这里已经提示我们需要使用virsh edit CentOS-7.2-x86_64进行编辑修改

修改前
<vcpu placement='static'>1</vcpu>
现在是静态的,不能进行改变。 我们修改为auto动态

  1. <vcpu placement='auto' current="1">4</vcpu>
  2. Auto=动态 static=静态
  3. Current=当前cpu数量
  4. 4= 最大是4

动态修改不需要重启

  1. [root@linux-node1 ~]# virsh setvcpus CentOS-7.2-x86_64 2 --live
  2. 正常情况需要重启虚拟机,但是我们可以使用virsh setvcpus 使它动态获取
  3. 2 表示cpu的个数

还可以使用

  1. [root@linux-node1 ~]# virsh shutdown CentOS-7.2-x86_64
  2. [root@linux-node1 ~]# virsh start CentOS-7.2-x86_64

效果图如下:

修改前
2.png-18.6kB
3.png-35.3kB

2、内存设置

  内存是我们在安装的时候制作的,现在无法进行扩展,但是可以进行缩小。无法扩展的意思是我们执行virsh –install分配内存多大在如何修改也不可以超过设定的这个数

修改内存为512

  1. [root@linux-node1 ~]# virsh qemu-monitor-command CentOS-7.2-x86_64 --hmp --cmd balloon 512
  2. [root@linux-node1 ~]# virsh qemu-monitor-command CentOS-7.2-x86_64 --hmp --cmd
  3. #第一条命令是修改,第二条命令是查看

修改前
4.png-3.9kB

修改后
5.png-13.6kB
恢复

  1. [root@linux-node1 ~]# virsh qemu-monitor-command CentOS-7.2-x86_64 --hmp --cmd balloon 1024
  2. [root@linux-node1 ~]# virsh qemu-monitor-command CentOS-7.2-x86_64 --hmp --cmd info balloon

6.png-7.9kB

提示: 由此可见内存修改可以是动态的,但是有一个缺点是不能高于我们创建虚拟机的内存

3、硬盘设置

提示: 虚拟机磁盘支持扩容,但是生产不要使用。

Raw :全镜像模式,无法制作快照
Qcow2:稀疏模式,qcow2镜像格式是QEMU模拟器支持的一种磁盘镜像。它也是可以用一个文件形式来表示一块固定大小的块设备磁盘。
 与普通raw格式的镜像相比,有以下特征:

1.更小的空间占用,即使用文件系统不支持空洞(hosts)
2.支持写时拷贝(COW,copy-on-write),镜像文件只能反映底层磁盘的变化
3.支持快照(snapshot),镜像文件能够包含多个快照的历史
4.可选择基于zlib的压缩方式
5.可以选择AES加密

Raw和Qcow2区别:

1.Raw 性能会比Qcow2快,因为没有那么多的功能
2.Raw磁盘无法扩展,分配多大就占用多大
3.Qcow2就是动态的,你用多大就占多大
4.通过Raw可以转换其他格式

我们可以使用qemu-img info来查看镜像格式

  1. [root@linux-node1 ~]# qemu-img info /opt/CentOS-7.2-x86_64.raw
  2. image: /opt/CentOS-7.2-x86_64.raw
  3. file format: raw
  4. virtual size: 10G (10737418240 bytes)
  5. disk size: 1.0G

转换格式

  1. [root@linux-node1 ~]# qemu-img convert -f raw -O qcow2 /opt/CentOS-7.2-x86_64.raw test.qcow2

提示: 生产环境还是不要使用,可能会造成数据丢失

  1. -rw-r--r-- 1 qemu qemu 4.1G Oct 26 16:33 CentOS-7.2.iso
  2. -rw-r--r-- 1 qemu qemu 10G Oct 27 15:08 CentOS-7.2-x86_64.raw
  3. -rw-r--r-- 1 root root 1.1G Oct 27 15:12 test.qcow2

按照用多少占多少进行分配的

  1. [root@linux-node1 opt]# qemu-img info test.qcow2
  2. image: test.qcow2
  3. file format: qcow2
  4. virtual size: 10G (10737418240 bytes)
  5. disk size: 2.0G
  6. cluster_size: 65536
  7. Format specific information:
  8. compat: 1.1
  9. lazy refcounts: false

4、KVM网络设置

默认虚拟机网络模式是NAT,我们可以看一下iptables

  1. [root@linux-node1 ~]# iptables -L -n
  2. Chain INPUT (policy ACCEPT)
  3. target prot opt source destination
  4. ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
  5. ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
  6. ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:67
  7. ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
  8. Chain FORWARD (policy ACCEPT)
  9. target prot opt source destination
  10. ACCEPT all -- 0.0.0.0/0 192.168.122.0/24 ctstate RELATED,ESTABLISHED
  11. ACCEPT all -- 192.168.122.0/24 0.0.0.0/0
  12. ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
  13. REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
  14. REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
  15. Chain OUTPUT (policy ACCEPT)
  16. target prot opt source destination
  17. ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:68

查看桥接网卡

  1. [root@linux-node1 ~]# brctl show
  2. bridge name bridge id STP enabled interfaces
  3. virbr0 8000.52540012d483 yes virbr0-nic
  4. vnet0

添加桥接网卡,因为DHCP会使我们无法使用xshell进行管理,所以我们将网卡变更为桥接网卡。.

  1. [root@linux-node1 ~]# brctl addif br0 eth0
  2. 添加br0并桥接到eth0

现在br0已经和eth0关联起来
7.png-6.2kB

删除eth0的IP地址
8.png-2.3kB

配置网桥IP地址
10.png-3.2kB

现在已经可以连接上,无法出外网。缺少路由

  1. [root@linux-node1 ~]# ip ro li
  2. 192.168.56.0/24 dev br0 proto kernel scope link src 192.168.56.11
  3. 192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1

添加路由,ping百度进行测试

  1. [root@linux-node1 ~]# route add default gw 192.168.56.2
  2. [root@linux-node1 ~]# ping www.baidu.com
  3. PING www.a.shifen.com (61.135.169.125) 56(84) bytes of data.
  4. 64 bytes from 61.135.169.125: icmp_seq=1 ttl=128 time=9.52 ms
  5. ^C
  6. --- www.a.shifen.com ping statistics ---
  7. 1 packets transmitted, 1 received, 0% packet loss, time 0ms
  8. rtt min/avg/max/mdev = 9.529/9.529/9.529/0.000 ms

提示:kvm 桥接网卡和eth0只能一个有IP地址,这样才算是正常的结果

  1. [root@linux-node1 ~]# ifconfig
  2. br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  3. inet 192.168.56.11 netmask 255.255.255.0 broadcast 192.168.56.255
  4. inet6 fe80::20c:29ff:fef4:affe prefixlen 64 scopeid 0x20<link>
  5. ether 00:0c:29:f4:af:fe txqueuelen 0 (Ethernet)
  6. RX packets 251 bytes 18832 (18.3 KiB)
  7. RX errors 0 dropped 0 overruns 0 frame 0
  8. TX packets 157 bytes 19763 (19.2 KiB)
  9. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  10. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  11. inet6 fe80::20c:29ff:fef4:affe prefixlen 64 scopeid 0x20<link>
  12. ether 00:0c:29:f4:af:fe txqueuelen 1000 (Ethernet)
  13. RX packets 15047 bytes 1796201 (1.7 MiB)
  14. RX errors 0 dropped 0 overruns 0 frame 0
  15. TX packets 23525 bytes 1763895 (1.6 MiB)
  16. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  17. lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
  18. inet 127.0.0.1 netmask 255.0.0.0
  19. inet6 ::1 prefixlen 128 scopeid 0x10<host>
  20. loop txqueuelen 0 (Local Loopback)
  21. RX packets 108 bytes 8966 (8.7 KiB)
  22. RX errors 0 dropped 0 overruns 0 frame 0
  23. TX packets 108 bytes 8966 (8.7 KiB)
  24. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  25. virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  26. inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
  27. ether 52:54:00:12:d4:83 txqueuelen 0 (Ethernet)
  28. RX packets 28 bytes 3842 (3.7 KiB)
  29. RX errors 0 dropped 0 overruns 0 frame 0
  30. TX packets 20 bytes 3615 (3.5 KiB)
  31. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  32. vnet0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  33. inet6 fe80::fc54:ff:fee2:1482 prefixlen 64 scopeid 0x20<link>
  34. ether fe:54:00:e2:14:82 txqueuelen 500 (Ethernet)
  35. RX packets 28 bytes 4234 (4.1 KiB)
  36. RX errors 0 dropped 0 overruns 0 frame 0
  37. TX packets 6677 bytes 350011 (341.8 KiB)
  38. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

现在里面的虚拟机还无法上网,我们需要编辑虚拟机
[root@linux-node1 ~]# virsh edit CentOS-7.2-x86_64
修改前

  1.     ...
  2. <interface type='network'>
  3. <mac address='52:54:00:e2:14:82'/>
  4. <source network='default'/>
  5. <model type='virtio'/>
  6. <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
  7. </interface>
  8.     ...

修改后

  1.     ...
  2. <interface type='bridge'>
  3. <mac address='52:54:00:e2:14:82'/>
  4. <source bridge='br0'/>
  5. <model type='virtio'/>
  6. <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
  7. </interface>
  8.     ...
  9. #br0是桥接网卡的名字

现在我们就需要重启虚拟机

  1. [root@linux-node1 ~]# virsh list --all
  2. Id Name State
  3. ----------------------------------------------------
  4. 2 CentOS-7.2-x86_64 running
  5. [root@linux-node1 ~]# virsh shutdown CentOS-7.2-x86_64
  6. [root@linux-node1 ~]# virsh start CentOS-7.2-x86_64

重启之后我们需要修改虚拟机的网卡配置文件
11.png-14.9kB
修改完并重启,然后ping 网关ping百度查看是否可以ping通

提示:修改的是重启的虚拟机的网卡文件
现在我们就可以使用xshell进行连接了
12.png-26.7kB
13.png-32.5kB

十二、KVM优化

KVM优化分为三个方面 CPU内存IO(磁盘)

CPU优化:

  Kvm是一个进程,是受cpu的调度,对于一个多口的cpu,进程会被调度到任何一个cpu上去。例如CPU缓存现在在1上面,进程被分配到2上面,那么就无法使用1的缓存就会遭成无法命中
  我们可以使用taskset来进行操作

  1. [root@linux-node1 ~]# taskset -cp 0 8337
  2. pid 8337's current affinity list: 0-3
  3. #表示当前8337会在0-3CPU上调度
  4. pid 8337's new affinity list: 0
  5. #表示当前8337会在cpu0上进行调度
  6. 8377 是进程号,通过ps -ef|grep kvm 来获取到
  7. -p pid 指定进程
  8. -c 指定cpu(可以写多个)

提示:可以减少开机miss,性能可以提高10%

内存优化

  内存需要优化的很少,但是需要开起Memory EPT。这个技术是在bios里面开通的。还需要设置内存的寻址,简单的来说就是使用大页内存
  默认内存是分页的,一页是4096K.

  1. [root@linux-node1 ~]# cat /proc/meminfo
  2. HugePages_Total: 0
  3. HugePages_Free: 0
  4. HugePages_Rsvd: 0
  5. HugePages_Surp: 0
  6. Hugepagesize: 2048 kB

内存合并技术
  我们操作系统有一个内核级的进程会定期的去扫描内存,把连续的内存合并成一个2兆的大页内存,减少内存碎片。默认已经开启了

  1. [root@linux-node1 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
  2. [always] madvise never

提示: 内存我们要做的不多,基本上系统已经我们优化好了。

IO优化

  IO优化基本上我们要做的没有,因为默认kvm就使用virtio。Virtio是一种半虚拟化技术,让磁盘知道你是运行在虚拟机里面。这是一种半虚拟化技术,有兴趣可以了解一下

IO调度算法介绍
 IO调度算法有三种(cenots6有四种)
Noop: 不进行任何调度算法(SSD一定要把这个设置为Noop,因为这个队列是针对磁盘的)

相关资料:
http://www.cnblogs.com/zhenjing/archive/2012/06/20/linux_writeback.html
http://jackyrong.iteye.com/blog/898938

查看当前调度算法

  1. [root@linux-node1 ~]# cat /sys/block/sda/queue/scheduler
  2. noop [deadline] cfq

更改调度算法如下:

  1. echo noop > /syc/block/sda/queue/scheduler

   完!

   weixin.gif-425.6kB


新闻联播老司机

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: