虚拟化技术之KVM实战

虚拟化技术之KVM实战

一、走进云计算

云计算:云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问, 进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互。

1.1 云计算的特点和优势

1)云计算是一种使用模式
2)云计算必须通过网络访问
3)弹性计算,按需付费

1.2 在云计算之前的模式或技术

1)IDC托管
2)IDC租用
3)虚拟主机(卖空间的)
4)vps:虚拟专有主机,openvz超卖很坑人的,xen不支持超卖

1.3 相对于云计算,传统数据中心面临的问题

1)资源利用率低(大部分机器cpu所占比率低于15%)
2)资源分配不合理

举例:由于某个活动,上线各种服务器,但是并未达到实际效果,导致服务器资源浪费

3)很难实现真正的运维自动化

1.4图解云计算的三层服务

基础设施:计算,存储,网络服务 
平台服务:对象存储,身份认证,运行环境,消息队列,数据库服务 

应用平台:监控,内容,合作,通信,财务 


二、云计算与虚拟化

2.1 公有云、私有云和混合云

公有云(Public Cloud) 
通常指第三方提供商为用户提供的能够使用的云,公有云一般可通过 Internet 使用,可能是免费或成本低廉的,公有云的核心属性是共享资源服务。这种云有许多实例,可在当今整个开放的公有网络中提供服务。例如:aws,阿里云,青云,百度云,腾讯云。 
优点:价格低廉,使用方便
私有云(Private Clouds) 
是为一个客户单独使用而构建的,因而提供对数据、安全性和服务质量的最有效控制。该公司拥有基础设施,并可以控制在此基础设施上部署应用程序的方式。私有云可部署在企业数据中心的防火墙内,也可以将它们部署在一个安全的主机托管场所,私有云的核心属性是专有资源。 
优点:可控,数据安全(银行必然使用私有云
混合云(Hybrid Cloud) 
混合云融合了公有云和私有云,是近年来云计算的主要模式和发展方向。我们已经知道私企业主要是面向企业用户,出于安全考虑,企业更愿意将数据存放在私有云中,但是同时又希望可以获得公有云的计算资源,在这种情况下混合云被越来越多的采用,它将公有云和私有云进行混合和匹配,以获得最佳的效果,这种个性化的解决方案,达到了既省钱又安全的目的,例如在一次活动中,只需要暂时几台机器,在私有云存在的情况,考虑混合云的使用,是最合理化的。 
优点:集合的使用方式更完美,可扩展,更节省
2.2云计算的层次


SaaS 
提供给客户的服务是运营商运行在云计算基础设施上的应用程序,用户可以在各种设备上通过客户端界面访问,如浏览器。消费者不需要管理或控制任何云计算基础设施,包括网络、服务器、操作系统、存储等等;平时使用的邮件服务器,即属于SaaS服务。
PaaS 
提供给消费者的服务是把客户采用提供的开发语言和工具(例如Java,python, .Net等)开发的或收购的应用程序部署到供应商的云计算基础设施上去。客户不需要管理或控制底层的云基础设施,包括网络、服务器、操作系统、存储等,但客户能控制部署的应用程序,也可能控制运行应用程序的托管环境配置;更适合提供给开发人员使用,在这里也可以使用docker容器技术实现
IaaS 
提供给消费者的服务是对所有计算基础设施的利用,包括处理CPU、内存、存储、网络和其它基本的计算资源,用户能够部署和运行任意软件,包括操作系统和应用程序。消费者不管理或控制任何云计算基础设施,但能控制操作系统的选择、存储空间、部署的应用,也有可能获得有限制的网络组件(例如路由器,防火墙、负载均衡器等)的控制。更适合提供给运维人员使用
2.3 虚拟化的优势


虚拟化可以虚拟出来多个操作系统:每个操作系统之间是相互独立的,所以每个操作系统上所跑的应用自然是相互不影响的。在这里用一个经典的例子说明,一台物理机跑8个tomcat和8个虚拟机上各跑一个tomcat,跑8个tomcat的物理机,如果其中一个tomcat出问题(内存有问题,jvm有问题等),势必会影响到其他7个tomcat,但是在8个虚拟机上跑分别各跑一个tomcat,他们之间是互不影响的,由于虚拟化一层原因占用了一些资源,效果并没有直接一台物理机跑8个tomcat效果好,但是虚拟机的互相独立互不影响是更重要的,而且便于管理,每个tomcat实例都会起3个端口(8080:对外服务端口,8009:AJP端口,8005:关闭端口),使用虚拟机之后,就不会担心多个tomcat端口冲突的情况。 
支持异构 :linux系统可以虚拟化windows系统,方便不同场景系统的使用 
支持快照功能和克隆等功能:快照功能在某个物理机不知运行什么,是否正在运行的情况下,如果是一台虚拟机就好办了,直接停了该虚拟机,只不过是占了一些磁盘空间而已。

2.4 虚拟化和云计算的简单总结

虚拟化是一种技术,云计算是通过虚拟化技术实现的一种通过网络访问获取资源,流量,交付的使用模式,两者并不能相互比较,虚拟化相当于实干家,而云计算是思想家。

三、虚拟化的分类

3.1 全虚拟化与半虚拟化

全虚拟化 
又叫硬件辅助虚拟化技术,最初所使用的虚拟化技术就是全虚拟化(Full Virtualization)技术,它在虚拟机(VM)和硬件之间加了一个软件层–Hypervisor,或者叫做虚拟机管理程序(VMM)。hypervisor 可以划分为两大类。首先是类型 1,这种 hypervisor 是直接运行在物理硬件之上的。其次是类型 2,这种 hypervisor 运行在另一个操作系统(运行在物理硬件之上)中。类型 1 hypervisor 的一个例子是基于内核的虚拟机(KVM —— 它本身是一个基于操作系统的 hypervisor)。类型 2 hypervisor 包括 QEMU 和 WINE。因为运行在虚拟机上的操作系统通过Hypervisor来最终分享硬件,所以虚拟机发出的指令需经过Hypervisor捕获并处理。为此每个客户操作系统(Guest OS)所发出的指令都要被翻译成CPU能识别的指令格式,这里的客户操作系统即是运行的虚拟机,所以Hypervisor的工作负荷会很大,因此会占用一定的资源,所以在性能方面不如裸机。但是运行速度要快于硬件模拟。全虚拟化最大的优点就是运行在虚拟机上的操作系统没有经过任何修改,唯一的限制就是操作系统必须能够支持底层的硬件,不过目前的操作系统一般都能支持底层硬件,所以这个限制就变得微不足道了。 

半虚拟化 
半虚拟化技术是后来才出现的技术,半虚拟化技术英文是paravirtualization,也叫做准虚拟化技术,现在比较热门,它就是在全虚拟化的基础上,把客户操作系统进行了修改,增加了一个专门的API,这个API可以将客户操作系统发出的指令进行最优化,即不需要Hypervisor耗费一定的资源进行翻译操作,因此Hypervisor的工作负担变得非常的小,因此整体的性能也有很大的提高。不过缺点就是,要修改包含该API的操作系统,但是对于某些不含该API的操作系统(主要是windows)来说,就不行能用这种方法,Xen就是一个典型的半虚拟化的技术。 


3.2服务器虚拟化,桌面虚拟化,应用虚拟化


服务器虚拟化 
数量少的情况推荐使用ESXI,XenServer 
数量大的情况推荐使用KVM,RHEV(并不开源),oVirt,Openstack,Vmvare vshpere
桌面虚拟化 
桌面虚拟化依赖于服务器虚拟化,在数据中心的服务器上进行服务器虚拟化,生成大量的独立的桌面操作系统(虚拟机或者虚拟桌面),同时根据专有的虚拟桌面协议发送给终端设备。用户终端通过以太网登陆到虚拟主机上,只需要记住用户名和密码及网关信息,即可随时随地的通过网络访问自己的桌面系统,从而实现单机多用户。多用于IP外包,呼叫中心,银行办公、移动桌面。
应用虚拟化 
技术原理是基于应用/服务器计算A/S架构,采用类似虚拟终端的技术,把应用程序的人机交互逻辑(应用程序界面、键盘及鼠标的操作、音频输入输出、读卡器、打印输出等)与计算逻辑隔离开来。在用户访问一个服务器虚拟化后的应用时,用户计算机只需要把人机交互逻辑传送到服务器端,服务器端为用户开设独立的会话空间,应用程序的计算逻辑在这个会话空间中运行,把变化后的人机交互逻辑传送给客户端,并且在客户端相应设备展示出来,从而使用户获得如同运行本地应用程序一样的访问感受。 
3)硬件虚拟化和软件虚拟化 

四、虚拟化之KVM

4.1kvm的虚拟化特性

1)嵌入到linxu正式kernel(提高了兼容性) 
2)代码级资源调用(提高性能) 
3)虚拟机就是一个进程(内存易于管理) 
4)直接支持NUMA技术(提高扩展性) 
5)虽然被Redhat收购了,但是依然保持着开源发展模式,社区活跃 
6)更好的商业支持及服务保障 
7)Centos7较Centos6默认支持cpu热添加,内存的热添加,大页内存默认都是开启的

inter的cpu:vmx 
AMD的cpu:svm 
本文使用的是vmvare,需要开启如下条件即可(需要CPU支持虚拟化,切在bios中虚拟化配置为enabled)
我的cpu是i7 hq6700 勾选 虚拟化Intel VT-x/EPT或AMD-V/RVI(V)选项即可

在cpuinfo中可以查看具体的支持虚拟化的信息

[python]  view plain  copy
  1. # grep -E "svm|vmx" /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 ht 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 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 xsavec xgetbv1  

4.3 kvm安装实战

安装kvm
# yum install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install -y
kvm: linux内核的一个模块,模块不需要安装,只需要加载 
qemu:虚拟化软件,可以虚拟不同的CPU,支持异构(x86的架构可以虚拟化出不是x86架构的) 
qemu-kvm:用户态管理kvm,网卡,声卡,PCI设备等都是qemu来管理的

创建一个虚拟磁盘,-f 指定格式,路径是/opt/CentOS-7.3-x86_64.raw,大小为10G

# qemu-img create -f raw /opt/centos-7.3-x86_64.raw 10G
Formatting '/opt/centos-7.3-x86_64.raw', fmt=raw size=10737418240 

显示内核中kvm的状态
# lsmod | grep kvm 
kvm_intel             170181  0 
kvm                   554609  1 kvm_intel
irqbypass              13503  1 kvm


启动libvirt,查看状态,关键字:active
# systemctl enable libvirtd.service
# systemctl start libvirtd.service
# systemctl status libvirtd.service


4.4 开始装一台虚拟机

在vmvare上挂载一个镜像
将iso导入到宿主机中,当然时间可能较长


# dd if=/dev/cdrom of=/opt/centos7.3-x86_64.iso
16173056+0 records in
16173056+0 records out
8280604672 bytes (8.3 GB) copied, 836.726 s, 9.9 MB/s

使用命令创建一台虚拟机 

virt-install –help 
-n(Name):指定虚拟机的名称 
–memory(–raw):指定内存大小 
–cpu:指定cpu的核数(默认为1) 
–cdrom:指定镜像 
–disk:指定磁盘路径(即上文创建的虚拟磁盘) 
–virt-type:指定虚拟机类型(kvm,qemu,xen) 
–network:指定网络类型
执行创建虚拟机命令

# virt-install --name centos-7.3-x86_64 --virt-type kvm --ram 1024 --cdrom=/opt/centos7.3-x86_64.iso --disk=/opt/centos-7.3-x86_64.raw --network=default --graphics vnc,listen=0.0.0.0 --noautoconsole

通过vnc连接上虚拟机,就可以进行安装了,安装完成后reboot重启(其实就是关机)



4.5 虚拟机基本操作学习

生成kvm虚拟机:virt-install 
查看在运行的虚拟机:virsh list 
查看所有虚拟机:virsh list –all 
查看kvm虚拟机配置文件:virsh dumpxml name 
启动kvm虚拟机:virsh start name 
正常关机:virsh shutdown name 
非正常关机(相当于物理机直接拔掉电源):virsh destroy name 
删除:virsh undefine name(彻底删除,找不回来了,如果想找回来,需要备份/etc/libvirt/qemu的xml文件) 
根据配置文件定义虚拟机:virsh define file-name.xml 
挂起,终止:virsh suspend name 
恢复挂起状态:virsh resumed name

启动刚才创建的虚拟机

列出所有虚拟机
# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     centos-7.3-x86_64              shut off

启动虚拟机
[root@localhost ~]# virsh start centos-7.3-x86_64
Domain centos-7.3-x86_64 started

[python]  view plain  copy
  1. [root@localhost ~]# ps -ef|grep kvm  
  2. root        598      2  0 08:38 ?        00:00:00 [kvm-irqfd-clean]  
  3. qemu       9072      1 99 19:13 ?        00:00:08 /usr/libexec/qemu-kvm -name centos-7.3-x86_64 -S -machine pc-i440fx-rhel7.0.0,accel=kvm,usb=off -cpu Nehalem -m 1024 -realtime mlock=off -smp 1,sockets=1,cores=1,threads=1 -uuid 7b3cf604-0059-4dd4-a5dc-b1b380e55590 -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-2-centos-7.3-x86_64/monitor.sock,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=discard -no-hpet -no-shutdown -global PIIX4_PM.disable_s3=1 -global PIIX4_PM.disable_s4=1 -boot strict=on -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x5.0x7 -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x5 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x5.0x1 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x5.0x2 -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x4 -drive file=/opt/centos-7.3-x86_64.raw,format=raw,if=none,id=drive-virtio-disk0 -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -drive if=none,id=drive-ide0-0-0,readonly=on -device ide-cd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 -netdev tap,fd=26,id=hostnet0,vhost=on,vhostfd=28 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:16:5b:d1,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -chardev socket,id=charchannel0,path=/var/lib/libvirt/qemu/channel/target/domain-2-centos-7.3-x86_64/org.qemu.guest_agent.0,server,nowait -device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=org.qemu.guest_agent.0 -device usb-tablet,id=input0,bus=usb.0,port=1 -vnc 0.0.0.0:0 -vga cirrus -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x7 -msg timestamp=on  
  4. root       9092      2  0 19:13 ?        00:00:00 [kvm-pit/9072]  
  5. root       9096   9005  0 19:13 pts/0    00:00:00 grep --color=auto kvm  


4.6 编辑kvm的xml文件,更改虚拟机CPU配置

配置虚拟机的cpu,两种方式(启动的时候指定核数,更改xml)
第一种方法:为了实现cpu的热添加,就需要更改cpu的最大值,当然热添加的个数不能超过最大值
# # virsh edit centos-7.3-x86_64 
<vcpu placement='auto' current='1'>4</vcpu>  # 当前为1,自动扩容,最大为4


重启虚拟机
# virsh shutdown centos-7.3-x86_64
Domain centos-7.3-x86_64 is being shutdown
[root@localhost ~]# virsh start centos-7.3-x86_64
Domain centos-7.3-x86_64 started


登录虚拟机上,查看cpu信息,确认cpu的个数,下面开始进行cpu热添加
cpu的热添加(cpu只支持热添加,不支持热减少)
# virsh setvcpus centos-7.3-x86_64 2 --live

再到虚拟机中查看cpu信息

kvm版本较高,并不需要echo "1" 到/sys/devices/system/cpu/cpu1/online 进行激活,自动可以激活。
# cat /sys/devices/system/cpu/cpu1/online 
1
第二种方法:安装的时候指定 
virt-install –vcpus 5 –vcpus 5,maxcpus=10,cpuset=1-4,6,8 –vcpus sockets=2,cores=4,thread=2


4.7 编辑kvm的xml文件,更改虚拟机内存配置


内存的设置拥有一个"气球(balloon)机制",可以增大减少,但是也要设置一个最大值,默认并没有设置最大值,也可以在安装的时候指定,这里不再重复此方法
# virsh edit centos-7.3-x86_64 
  <memory unit='KiB'>4194304</memory>
  <currentMemory unit='KiB'>1048576</currentMemory> # 当前内存为1G


重启虚拟机并查看当前状态的内存使用情况
# virsh qemu-monitor-command centos-7.3-x86_64 --hmp --cmd info balloon
balloon: actual=1024


对内存进行热添加到2048m并查看
# virsh qemu-monitor-command centos-7.3-x86_64 --hmp --cmd balloon 2048
[root@localhost ~]# virsh qemu-monitor-command centos-7.3-x86_64 --hmp --cmd info balloon
balloon: actual=2048


更改虚拟机中存储,硬盘设置(不建议在生产环境使用硬盘的扩大收缩模式,很容易产生故障)
# qemu-img --help |grep -i "formats:"  
Supported formats: vvfat vpc vmdk vhdx vdi sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd iscsi gluster dmg cloop bochs blkverify blkdebug
从结果看出,kvm支持很多种硬盘格式 
硬盘格式总体上分为两种:1为全镜像格式,2为稀疏格式 
全镜像格式(典型代表raw格式),其特点:设置多大就是多大,写入速度快,方便的转换为其他格式,性能最优,但是占用空间大 
稀疏模式(典型代表qcow2格式),其特点:支持压缩,快照,镜像,更小的存储空间(即用多少占多少) 
硬盘格式都可以通过qemu-img管理,详情qemu-img –help


4.8 编辑kvm的xml文件,更改虚拟机网桥连接配置

默认情况是NAT情况,但是在生产情况,使用更多的是桥接模式,更改虚拟机为网桥模式,原理图如下,网桥的基本原理就是创建一个桥接接口br0,在物理网卡和虚拟网络接口之间传递数据 

修改eth0(这里Centos7的eth0在装机的时候就指定,不需要特意指定了)
添加一个网桥并查看

# brctl addbr br0

把eth0加入网桥,使用桥接模式,给br设置ip,添加路由网关,关闭防火墙
# brctl addif br0 eth0 && ip addr del dev eth0 192.168.3.140/24 && ifconfig br0 192.168.3.140/24 up && route add default gw 192.168.3.1 && iptables -F

编辑虚拟机的网络配置使用br0网桥模式
# virsh edit centos-7.3-x86_64

<interface type='bridge'>
<mac address='52:54:00:16:5b:d1'/>
<source bridge='br0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>


重启虚拟机,网桥模式生效,此时使用crt便可以链接到所创建的虚拟机了,在vmvare机器上使用ifconfig查看详情


[root@localhost ~]# virsh shutdown centos-7.3-x86_64
Domain centos-7.3-x86_64 is being shutdown

[root@localhost ~]# virsh start centos-7.3-x86_64

在宿主机器上使用ifconfig查看详情


进入KVM虚拟机,编辑网络相关配置,重启网络
# vim /etc/sysconfig/network-scripts/ifcfg-eth0 
TYPE=Ethernet
BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
#IPV6INIT=yes
#IPV6_AUTOCONF=yes
#IPV6_DEFROUTE=yes
#IPV6_PEERDNS=yes
#IPV6_PEERROUTES=yes
#IPV6_FAILURE_FATAL=no
#IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=cbf1ba77-ba13-47b9-ae2d-1e67f7ac40a1
DEVICE=eth0
ONBOOT=yes


# service network restart
可以看到已经获取了IP地址



测试安装 yum install -y net-tools 可以看到ifconfig命令可以执行
# ifconfig 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.3.149  netmask 255.255.255.0  broadcast 192.168.3.255
        inet6 fe80::5054:ff:fe16:5bd1  prefixlen 64  scopeid 0x20<link>
        ether 52:54:00:16:5b:d1  txqueuelen 1000  (Ethernet)
        RX packets 15187  bytes 14301922 (13.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5887  bytes 355982 (347.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 204  bytes 17728 (17.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 204  bytes 17728 (17.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

五、创建虚拟机镜像

5.1 虚拟磁盘及镜像


由于在一开始创建了虚拟磁盘,并命名为centos-7.3-x86_64.raw,这就是虚拟机的镜像。

# cd /opt
[root@localhost opt]# ll
total 9415632
-rw-r--r-- 1 qemu qemu  8280604672 Apr 21 17:29 centos7.3-x86_64.iso
-rw-r--r-- 1 qemu qemu 10737418240 Apr 25 10:11 centos-7.3-x86_64.raw


5.2 镜像制作原则


分区的时候,只分一个/根分区,并不需要swap分区,由于虚拟机的磁盘性能就不好,如果设置了swap分区,当swap工作的时候,性能会更差。例如阿里云主机,就没有交换分区。
镜像制作需要删除网卡(eth0)中的UUID,如果有udev(/etc/udev/rules.d/70-persistent-ipoib.rules)的规则也要删除
关闭selinux,关闭iptables
安装基础软件的包:net-tools lrzsz screen tree vim wget telnet iftop tcpdump
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值