KVM简介
1、虚拟化技术:
虚拟化可以根据不同划分标准进行分类,包括CPU 虚拟化,硬件虚拟化,服务器虚拟化,桌面虚拟化,全虚拟化等等。我们通常所说的虚拟化主要是指平台虚拟化技术,通过使用 Hypervisor隐藏特定计算平台的实际物理特性,为用户提供抽象的、统一的、模拟的计算环境(即虚拟机)。
2、虚拟化产品
vmware :windiws
KVM:rhel7_x64
xen:[kernel-xen] rhel5
仿真虚拟化 [对系统硬件没有要求,性能最低]
半虚拟化 [虚拟机可以使用真机物理硬件,性能高,需要改内核]
全虚拟化 直接使用物理硬件,性能高
vmware:支持仿真虚拟化
xen: 半虚拟化REHL5自带xen, 安装时需要安装内核:rpm -ivh kernel-xen-xxx.rpm
kvm: 全虚拟化 RHEL6, RHEL7自带kvm
3、KVM实现功能
KVM模块只负责的是:
1、虚拟机的虚拟CPU,也就是vCPU。
2、对虚拟内存进行管理和调度。
KVM模块只用于管理虚拟 CPU 和内存,那 IO 的虚拟化,比如存储和网络设备由谁实现呢?这个就交给Linux内核和Qemu来实现。
KVM自身就是一个Linux内核模块,当一个安装有Linux系统的物理机装载了KVM这个内核模块之后,摇身一变,此Linux系统就变成了一个hypervisor(管理程序)。但是这个Hypervisor上面运行的进程还是会继续运行,同时也可以创建虚拟机,但每个虚拟机就是运行在Linux内核之上的一个系统进程,可以随时使用kill命令杀死。
KVM组件
Kvm架构主要由两部分来组成:kvm模块和QEMU-KVM
Qemu-kvm
Qemu-kvm是KVM团队针对quem改善和二次开发的一套工具
QEMU-KVM 相比原生 QEMU 的改动:
1、原生的 QEMU 通过指令翻译实现 CPU 的完全虚拟化,但是修改后的 QEMU-KVM 会调用 ICOTL 命令来调用 KVM 模块。
2、原生的 QEMU 是单线程实现,QEMU-KVM是多线程实现。
管理工具和libvirt
dev/kvm
dev/kvm是一个字符设备,是kvm内核模块提供给用户空间的一个接口,工作于Hypervisor。在用户空间,可通过这个接口(调用ioctl系统调用)管理虚拟机或通过这个接口编程序用来管理虚拟机,实现VM创建、删除、分配内存、读写VCPU的寄存器、想VCPU注入中断、运行VCPU等功能。如virsh或qemu-kvm这些工具都是都可以用来管理KVM虚拟机。
4、存储
KVM可以支持任何Linux内核支持的存储设备,如:
本地存储:IDE、SCSI、SAN、SATA、SAS、PCI-E等。
网络附加存储:NAS、SAMBA等
存储区域网络:SAN,ISCSI。
分布式存储:GlustFS
KVM的原生磁盘格式为QCOW2,它支持快照,允许多级快照、压缩和加密。
5、实时迁移(这个本文章没有,可以查找别的文章)
各个Hypervisor利用共享存储实现实时虚拟机迁移,并且虚拟机运行的服务无中断。但是KVM实现实时迁移有一些前提条件,如:
1、镜像文件必须放在共享存储。
2、共享存储还必须放在同一个位置,否则配置文件会找不到。
3、各个Hypervisor必须要兼容。
4、CPU必须拥有相同特性,最好同款CPU。
5、两台Hypervisor的时间必须要一致。
6、两台Hypervisor必须有一样的网络配置。
6、KVM局限性:
(1)CPU过载使用
KVM允许过载使用CPU,但是过载能力有限,过载使用不但不会提升性能反而会降低性能。一般所有虚拟CPU数量加在一起不要大于物理CPU核心数,一旦超过物理CPU数量依然需要调度。
(2)虚拟化时间需要依赖外部时钟才能实现精确计时
Linux系统有个特性,它有两套时钟,一套是硬件时钟、另一套是系统启动时从硬件读取的时间称为系统时间。当系统一旦启动后,系统时间就开始自己记时了,根据CPU震荡频率来计时,比如是一个2G赫兹的CPU,那么系统就认为1s中震荡2G个时钟周期,它就认为时间过1s,计时非常精确。但是很遗憾的是,一旦我们做了虚拟化,就意味着这颗CPU未必就是供这一个虚拟机所使用的,比如2G赫兹的CPU,这个虚拟机只得到了1G赫兹,那么此虚拟化还是以2G赫兹为1s计时,就会比正常时间整整慢一半。所以任何虚拟机的时钟都不会精确,包括vmware workstations(vmware提供的vmware tools工具就是实现把虚拟机时间一直跟系统时间同步),一般所有虚拟化都需要提供一个时钟服务器,一直同步这个比较精确的时间。
(3)MAC地址
KVM的MAC地址分配机制跟vmare一样,前24位固定,后24后随机。当虚拟机量特别大时,可能会出现MAC地址冲突。
(4)性能影响
对于CPU MMU来讲,在完全虚拟化模式下,性能大概有10%的损耗;如果支持EPT技术以及硬件辅助虚拟化技术,性能损耗大概在5%左右。
对于网络IO在完全虚拟化模式下,只相当于物理硬件性能的60%左右;半虚拟化模式下75%;透传模式下95%。
对于磁盘IO如果使用模拟的方式,只相当于物理硬件性能的40%左右;如果使用半虚拟化性能在85%左右,所以磁盘IO是最需要半虚拟化的;如果是透传大概在95%左右。
对于显卡设备模拟,相当于物理硬件设备的50%左右;半虚拟化是不支持的。
KVM官网
http://www.linux-kvm.org/page/Main_Page
本实验这些文件位置,记住,别弄混了!
KVM部署
1、KVM安装方式
方法一:
在安装Linux系统选择安装软件的时候,把KVM勾上。
方法二:
已有的Linux系统中安装KVM,我们这里以第二种方法安装KVM
KVM实验拓扑图:
更改内存、开启CPU虚拟化、硬盘支持等设置
把虚拟机内存调成4G以上,因为我们要在VMware虚拟中安装KVM,然后在KVM中再安装虚拟机
注: 只有64位RHEL6以上系统支持KVM。 32位系统不支持。
扩展:
虚拟化cpu性能计数器作用是什么?
官方手册里有说明。
https://docs.vmware.com/cn/search/#/%E8%99%9A%E6%8B%9F%E5%8C%96cpu%E6%80%A7%E8%83%BD%E8%AE%A1%E6%95%B0%E5%99%A8?partialfields=A4Jw9gJgrgxgLgZwLwHUwgNYLgQzgSzADsBSAJgAYAFcAGhmLgFMi4BlMKEGJpGyWHHIUAImBhQAti1wFiQA
注意:你和大牛就差一个查看官方文档的过程,后期大家遇到没有讲到的知识,你都可以看官方文档。
开机后查看CPU是否支持全虚拟化
查看自己的CPU是否支持全虚拟化虚拟化技术且是64位的
Intel:cat /proc/cpuinfo | grep --color vmx
AMD: cat /proc/cpuinfo | grep --color svm
[root@cong11 ~]# cat /proc/cpuinfo | grep --color vmx
如果,看不到vmx,是因为 VMware CPU没有开启 VT 技术,自己去开启
2、安装依赖
[root@cong11 ~]# yum install -y qemu-kvm libvirt libguestfs-tools virt-viewer virt-install virt-manager libvirt-python acpid
注:
qemu-kvm : kvm主程序, KVM虚拟化模块
virt-manager: KVM图形化管理工具
libvirt: 虚拟化服务
libguestfs-tools : 虚拟机的系统管理工具
virt-install :安装虚拟机的实用工具,比如virt-clon克隆工具就是这个包安装的
libvirt-python : python调用libvirt虚拟化服务的api接口库文件
acpid:虚拟机的电源按钮服务
启动libvirtd服务
[root@cong11 ~]# systemctl start libvirtd #开启虚拟化服务
[root@cong11 ~]# systemctl enable libvirtd #设置libvirtd服务开机启动
[root@cong11 ~]# systemctl is-enabled libvirtd #查看是不是开机启动
enabled
启动acpid服务
[root@cong11 ~]# systemctl start acpid
[root@cong11 ~]# systemctl enable acpid
[root@cong11 ~]# systemctl is-enabled acpid
enabled
查看kvm 模块
[root@cong11 ~]# lsmod | grep kvm
如果没有加载,运行以下命令:
[root@cong11 ~]# modprobe kvm
内核模块导出了一个名为/dev/kvm的设备,这个设备将虚拟机的的地址空间独立于内核或者任何应用程序的地址空间。
[root@cong11 ~]# ll /dev/kvm
3、配置KVM网络桥接功能
网桥介绍:
我们经常所说的Bridge设备其实就是网桥设备,也就相当于现在的二层交换机,用于连接同一网段内的所有机器,所以我们的目的就是将网络设备ens33添加到br0,此时br0就成为了所谓的交换机设备,我们物理机的ens33也是连接在上面的。 添加桥接设备br0: 相当于一个二层交换机
安装bridge-utils
[root@cong11 ~]# yum install -y bridge-utils
把ens33绑到br0桥设备上
[root@cong11 ~]# cd /etc/sysconfig/network-scripts/
[root@cong11 network-scripts]# cp ifcfg-ens33 /tmp/
[root@cong11 network-scripts]# vim ifcfg-ens33
BRIDGE="br0" #文件最后添加这一行
#IPADDR="192.168.1.11" #这几行全部注释
#PREFIX="24"
#GATEWAY="192.168.1.1"
#DNS1="202.106.0.20"
#DNS2="8.8.8.8"
生成桥设备的配置文件:
[root@cong11 network-scripts]# vim ifcfg-br0
DEVICE="br0"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO=none
IPADDR=192.168.1.11
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=202.106.0.20
DNS2=8.8.8.8
注:TYPE="Bridge",B要大写
重启网卡
[root@cong11 network-scripts]# service network restart #重启网卡
查看bro网卡
[root@cong11 network-scripts]# ifconfig
查看桥接的信息
[root@cong11 network-scripts]# brctl show
4、建立虚拟机
使用命令:virt-manager 建立虚拟机
[root@cong11 ~]# virt-manager
报错:
解决:
重启服务器
[root@cong11 ~]# reboot
[root@cong11 ~]# virt-manager
配置KVM本地源
如果弹出界面显示的乱码,需要安装dejavu-lgc-sans-fonts,这个界面要中文的话 要装yum groupinstall “fonts”,这两个包在本地光盘仓库没有,需要配置网络源,或者配置KVM本地源
[root@cong11 ~]# ls
anaconda-ks.cfg kvm-packs.tar.gz
[root@cong11 ~]# tar -zxvf kvm-packs.tar.gz
[root@cong11 ~]# vim /etc/yum.repos.d/kvm.repo
[kvm]
name=kvm
baseurl=file:///root/kvm-packs
enable=1
gpgcheck=0
安装软件
[root@cong11 ~]# yum install -y dejavu-lgc-sans-fonts
[root@cong11 ~]# yum groupinstall -y "fonts"
建立虚拟机
[root@cong11 ~]# virt-manager
执行virt-manager后,弹出如下界面,可以看到显示正常了
5、实战:安装一台KVM虚拟机
如何不重启机器,让系统识别到新添加的硬盘:
[root@cong11 network-scripts]# ls /sys/class/scsi_host/
host0 host1 host2
[root@cong11 network-scripts]# echo "- - -" > /sys/class/scsi_host/host0/scan
[root@cong11 network-scripts]# echo "- - -" > /sys/class/scsi_host/host1/scan
[root@cong11 network-scripts]# echo "- - -" > /sys/class/scsi_host/host2/scan
创建一个分区,用于存放安装好的Linux操作系统
创建一个sdb1分区(可不做,直接格式化)
[root@cong11 ~]# fdisk /dev/sdb
格式化分区(可以不创分区,直接格式化)
[root@cong11 ~]# mkfs.xfs /dev/sdb1
挂载使用
[root@cong11 ~]# echo “/dev/sdb1 /var/lib/libvirt/images/ xfs defaults 0 0” >> /etc/fstab #设置硬盘开机自动挂载
[root@cong11 ~]# mount -a #测试自动挂载并且挂载/dev/sdb1
安装虚拟机的默认存放的路径:/var/lib/libvirt/images/
[root@cong11 ~]# df -h
查看磁盘情况
准备系统镜像
准备系统镜像:把centos7.5镜像上传到/var/lib/libvirt/images/目录下(虚拟机默认去找镜像的位置)。
[root@cong11 ~]# dd if=/dev/sr0 of=/var/lib/libvirt/images/CentOS7.iso
[root@cong11 ~]# ll -h /var/lib/libvirt/images
6、安装KVM虚拟机
打开虚拟系统管理器
[root@cong11 ~]# virt-manager
新建一个虚拟机
选择iso镜像
修改内存、cpu大小
选择存储
定义虚拟机名称和网络
这里可以修改虚拟机名字和网络,并且在安装前还可以重新定义虚拟主机配置
修改下光盘引导和镜像位置
修改显示器键盘设置(不然会遇到键盘不能用的问题)
开始创建向虚拟机
开始安装虚拟机
跟我们在vmware安装虚拟机步骤一样(这里就不做演示了)
注意:如果安装完虚拟机重启进的还是安装页面,先关机,修改引导。 再启动就好了
打开之后修改一下ip,删除IPV6,IPV6没用,然后修改划线的地方,重启网卡
然后可以通过xshell连接到这个虚拟机了
测试
[root@cong11 ~]# ssh 192.168.1.100
可以登陆到kvm1的虚拟机里,这样就可以正常使用了
如果连不上:
这样就好了!
KVM虚拟机常用命令
列出所以的虚拟机
[root@cong11 ~]# virsh list
关闭虚拟机
[root@cong11 ~]# virsh shutdown centos7.0
启动虚拟机
[root@cong11 ~]# virsh start centos7.0
设置centos7.0虚拟机为物理机开机后,自动启动
[root@cong11 ~]# virsh autostart centos7.0
关闭cong11测试centos7.0是否为开机自启动
[root@cong11 ~]# reboot
[root@cong11 ~]# virsh list
[root@cong11 ~]# ssh 192.168.1.100
KVM虚拟机克隆
命令语法
克隆前,centos7.0需要提前关机。
语法:virt-clone -o 原虚拟机 -n 新虚拟机 -f 新虚拟机镜像存放路径
选项:-o old -n new
虚拟机镜像:就是整个虚拟机文件,不是操作系统光盘镜像CentOS7.iso
查看虚拟机镜像
[root@cong11 ~]# cd /var/lib/libvirt/images/
[root@cong11 images]# ll -h
1、基于centos7.0克隆一台虚拟机
基于centos7.0克隆一台虚拟机KVM2
注:虚拟机克隆完毕后,MAC地址也是需要修改,网卡配置文件也修改一下
[root@cong11 images]# virsh shutdown centos7.0 #在关闭状态下才能进行克隆
[root@cong11 images]# virt-clone -o centos7.0 -n kvm2 -f /var/lib/libvirt/images/kvm2.img
#克隆谁,克隆的名字叫什么,克隆到哪。(这是完整克隆,不能连接克隆)
[root@cong11 images]# ll –h
查看克隆完后,使用磁盘情况
[root@cong11 images]# df -h
2、KVM虚拟机组成
一台KVM虚拟机由两部分组成:虚拟机配置文件和镜像img
查看虚拟机的配置文件位置
虚拟机的配置文件在/etc/libvirt/qemu目录中
[root@cong11 images]# cd /etc/libvirt/qemu
[root@cong11 qemu]# ls /etc/libvirt/qemu
虚拟机的配置文件内容自己查看
[root@cong11 qemu]# cat centos7.0.xml
查看原虚拟机和克隆完的虚拟机配置文件的区别。ctrl+w+w可以切换光标
[root@cong11 qemu]# vimdiff centos7.0.xml kvm2.xml
注:这里可以看出两者的MAC地址是不一样的。对克隆或复制出来的虚拟机MAC地址会自动修改
3、启动kvm2,虚拟机测试
[root@cong11 qemu]# virt-manager
测试新克隆的机器
可以看到我们进入的是kvm2的虚拟机
查看kvm2的MAC地址
在配置文件中查看网卡的MAC地址
[root@cong11 qemu]# vim /etc/libvirt/qemu/kvm2.xml
<interface type='bridge'>
<mac address='52:54:00:ef:ec:75'/>
<source bridge='br0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
发现虚拟机磁盘中的mac地址已经和克隆后的网卡的MAC地址不一样(自动更改MAC地址)。
在centos6下,kvm还没有这样的功能(不能自动更改MAC地址)。
修改kvm2的hostname,IP地址
[root@kvm1 ~]# hostnamectl set-hostname kvm2
[root@kvm1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
IPADDR=“192.168.1.101”
[root@kvm2 ~]# systemctl restart network
测试登陆KVM2
[root@cong11 qemu]# ssh root@192.168.1.101
4、在ctnos6下kvm克隆后的操作
登录新克隆的虚拟机删除原来的mac和IP地址,让新克隆的机器可以上网:
方法1:
[root@kvm1 ~]# rm -rf /etc/udev/rules.d/70-persistent-*
[root@kvm1 ~]#vim /etc/sysconfig/network-scripts/ifcfg-eth0 #写入以下内容
DEVICE=eth0
IPADDR=192.168.1.100
NETMASK=255.255.255.0
ONBOOT=yes
NAME=eth0
注: 记得把 ONBOOT="no" 改为:ONBOOT="yes"
注:把原配置文件中的MAC和UUID地址删除,然后修改一个和原虚拟机不一样的IP
[root@ kvm1 ~]# reboot #重启生效
[root@ kvm1 ~]# start_udev
#重新启动udev服务,自动生成刚删除的/etc/udev/rules.d/70-persistent-*文件,新生成的udev文件,会使用新系统的MAC地址。
[root@ kvm1 ~]# service network restart