目录
1 云计算和虚拟化
简单点说,
云计算
是一种资源使用可交付的方式,可以通过网络来访问,实现弹性计算,按需付费等功能。虚拟化
是一种具体实现方式。
对比,云计算是一种使用模式
,而虚拟化是一种技术
。云计算是通过使用虚拟化的这种技术来实现它的功能的。故两者之间是不能比较的。
没有云计算之前的传统模式
1、IDC托管
2、IDC租用
3、虚拟主机
4、VPS (Virtual Private Server 虚拟专用服务器)
云计算分类
根据其服务性质不同,把云计算分为:私有云(银行等金融机构会使用)、公有云(阿里云、腾讯云等)、混合云(二者混合的实现)
云计算分层
1.1 什么是kvm
kvm
是基于虚拟化扩展(Intel VT
或者AMD-V
)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案。kvm中,虚拟机被实现为常规的Linux进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 进程。这使得 kvm 能够使用 Linux 内核的已有功能。
但是,kvm 本身不执行任何硬件模拟,需要客户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的 I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是QEMU
。
1.2 qemu-kvm
其实 qemu 原本不是 kvm 的一部分,它自己就是一个纯软件实现的虚拟化系统,所以其性能低下。但是,QEMU 代码中包含整套的虚拟机实现,包括处理器虚拟化,内存虚拟化,以及 KVM需要使用到的虚拟设备模拟(网卡、显卡、存储控制器和硬盘等)。
为了简化代码,KVM 在 QEMU 的基础上做了修改。VM 运行期间,QEMU 会通过 KVM 模块提供的系统调用进入内核,由 KVM 负责将虚拟机置于处理的特殊模式运行。遇到虚机进行 I/O 操作,KVM 会从上次的系统调用出口处返回 QEMU,由 QEMU 来负责解析和模拟这些设备。
从 QEMU 的角度看,也可以说是 QEMU 使用了 KVM 模块的虚拟化功能,为自己的虚机提供了硬件虚拟化加速。除此以外,虚机的配置和创建、虚机运行说依赖的虚拟设备、虚机运行时的用户环境和交互,以及一些虚机的特定技术比如动态迁移,都是 QEMU 自己实现的。
简单点说,qemu本身是一种虚拟软件,qemu-kvm就是一种用户态的软件,而kvm是一种内核态的。qemu帮kvm模拟了计算机上的网络、磁盘等设备。
1.3 libvirt
Libvirt是用于管理虚拟化平台的开源的API,后台程序和管理工具。它可以用于管理
KVM
、Xen
、VMware ESX
、QEMU
和其他虚拟化技术。这些API在云计算的解决方案中广泛使用。
libvirt是提供了一个方便的方式来管理虚拟机和其他虚拟化功能的软件的集合,如存储和网络接口管理。这些软件包括一个API库,一个守护进程(Libvirtd
),和一个命令行实用程序(virsh
)。
libvirt的首要目标是能够管理多个不同的虚拟化供应商/虚拟机管理程序提供一个单一的方式。例如,命令“virsh列表等等都可以用于任何支持现有的虚拟机管理程序列表(KVM、Xen、VMware ESX,等)不需要学习管理程序特定的工具!
2 安装及配置kvm
2.1 环境准备
1、先准备一台Centos7系列的虚拟机(CentOS7镜像下载地址),7的一些新特性是6里面没有的,如内存热添加热压缩、CPU热添加等,而后给其分配至少4G内存,最好配置好yum源和epel源。
2、在安装kvm之前需要检查虚拟机是否支持虚拟化
,Inter的CPU支持虚拟化会有vmx
文件,AMD的CPU支持虚拟化会有svm
文件。只需要查找本地CPU是否有这两个标识,有即支持虚拟化。
3、VNC客户端,用来远程安装kvm虚拟机(VNC客户端下载地址)
2.2 搭建kvm虚拟机
# Centos7 yum Base源地址
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# Centos7 epel源地址
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
# 安装kvm及管理软件包
[root@RSQ ~]# yum install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install -y
# 检查虚拟机是否支持虚拟化
[root@RSQ ~]# grep -E "(vmx|svm)" /proc/cpuinfo
[root@RSQ ~]#
# 虚拟机一般默认是没有的,需要手动开启虚拟化功能,在虚拟机设置,点击处理器,然后启动虚拟化功能;物理机需要在Bios中开启虚拟化功能,默认开启的。
[root@RSQ ~]# grep -E '(vmx|svm)' /proc/cpuinfo
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc 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 arat tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap xsaveopt
# 创建一块硬盘:qemu-img -f 指定硬盘格式 指定路径 大小
[root@RSQ ~]# qemu-img create -f raw /opt/CentOS-7.1-x86_64.raw 10G
Formatting '/opt/CentOS-7.1-x86_64.raw', fmt=raw size=10737418240
[root@RSQ ~]# lsmod |grep kvm
kvm_intel 170181 0
kvm 554609 1 kvm_intel
irqbypass 13503 1 kvm
# 开启libvirtd服务,上边已经说过次服务的功能了
[root@RSQ ~]# systemctl enable libvirtd.service
[root@RSQ ~]# systemctl start libvirtd.service
[root@RSQ ~]# systemctl status libvirtd.service
# 上传CentOS7镜像到/opt目录
[root@RSQ opt]# ll -h
total 906M
-rw-r--r--. 1 root root 10G May 23 17:07 CentOS-7.1-x86_64.raw
-rw-------. 1 root root 906M May 4 05:07 CentOS-7.iso
# 用virt-install配置安装一台虚拟机
[root@RSQ ~]# virt-install --name CentOS-7-x86-64 --virt-type kvm --ram 1024 --cdrom=/opt/CentOS-7.iso --disk path=/opt/CentOS-7.1-x86_64.raw --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
# 查看5900端口是否被监听,kvm虚拟机监听端口会从5900开始逐渐递增
[root@RSQ ~]# netstat -lntup |grep kvm
tcp 0 0 0.0.0.0:5900 0.0.0.0:* LISTEN 2068/qemu-kvm
vnc客户端连接本地,进行kvm虚拟机安装。前边设置的listen=0.0.0.0就是这个作用
# 图形界面配置完后需要重启以引导程序加载完毕,此时vnc连接会断开,5900端口会down掉,需要用virsh重新开启虚拟机
[root@RSQ ~]# virsh list --all
Id Name State ----------------------------------------------------
- CentOS-7-x86-64 shut off
[root@RSQ ~]# virsh start CentOS-7-x86-64
Domain CentOS-7-x86-64 started
[root@RSQ ~]# lsof -i :5900
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
qemu-kvm 3190 qemu 17u IPv4 39719 0t0 TCP *:rfb (LISTEN)
vnc再次连接kvm虚拟机
# 查看kvm进程
[root@RSQ ~]# ps -aux |grep kvm
root 769 0.0 0.0 0 0 ? S< 17:03 0:00 [kvm-irqfd-clean]
qemu 3190 28.5 8.6 1593132 350472 ? Sl 18:03 0:39 /usr/libexec/qemu-kvm -name CentOS-7-x86-64 -S -machine pc-i440fx-rhel7.0.0,accel=kvm,usb=off,dump-guest-core=off -cpu Broadwell,-hle,-rtm -m 1024 -realtime mlock=off -smp 1,sockets=1,cores=1,threads=1 -uuid 73ec2932-17bb-40a4-b5a4-438d93261aff -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-2-CentOS-7-x86-64/monitor.sock,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=delay -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=0x4.0x7 -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x4.0x1 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x4.0x2 -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x5 -drive file=/opt/CentOS-7.1-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:2f:b9:c7,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-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
root 3199 0.0 0.0 0 0 ? S 18:03 0:00 [kvm-pit/3190]
root 3240 0.0 0.0 112712 968 pts/2 S+ 18:06 0:00 grep --color=auto kvm
创建完kvm虚拟机后,把网卡地址onboot改为yes后会自动获取一个内网IP地址,且通过NAT和真实虚拟机连接,能上网。
在创建完虚拟机后会在
/run/libvirt/qemu/
目录下生成一个xml
文件,是自动生成的,通过编辑此xml文件可对虚拟机内存、cpu颗数等信息进行修改,下文会详细介绍如何管理及优化kvm虚拟机
[root@RSQ ~]# cd /run/libvirt/qemu/
[root@RSQ qemu]# ll
total 16
-rw-------. 1 root root 4 May 23 18:03 CentOS-7-x86-64.pid
-rw-------. 1 root root 10998 May 23 18:03 CentOS-7-x86-64.xml
拓展知识