KVM介绍
KVM 全称是 基于内核的虚拟机(Kernel-based Virtual Machine),它是一个 Linux 的一个内核模块,该内核模块使得 Linux 变成了一个 Hypervisor,依赖于硬件虚拟化本身,只有硬件支持虚拟化,才能运行KVM。
虚拟化
虚拟化是云计算的基础。简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的 CPU、内存、IO 硬件资源,但逻辑上虚拟机之间是相互隔离的。
物理机一般称为宿主机(Host),宿主机上面的虚拟机称为客户机(Guest)
KVM 架构
KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案。KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 进程。这使得 KMV 能够使用 Linux 内核的已有功能。
但是,KVM 本身不执行任何硬件模拟,需要客户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的 I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是 QEMU。
虚拟化技术类型:
主机虚拟化:xen, kvm, virtualbox, …
容器(用户空间隔离): lxc(LinuX Container), openvz, …
系统库虚拟化:wine, …
应用程序级虚拟化:jvm, pvm,…
mmu (内存管理单元)
主机虚拟化
CPU:
模拟器:emulation, 虚拟机的arch与物理平台的arch可以不相同;qemu;
虚拟机:virtualization
完全虚拟化(full-virt)
BT: 二进制转换 (软件)
HVM:硬件辅助的虚拟化(硬件)
半(准)虚拟化 (para-virt)
GuestOS得明确知道自己运行于虚拟化技术
硬盘的虚拟
可以用文件构建虚拟的假硬盘空间来供使用:例如有20G的硬盘可分给10人每人10G,理论上超出了自己实际硬盘的大小,但在实际使用当中,每个人可能只使用1G就够了。
网卡的虚拟:
用软件的方式给每个虚拟机虚拟一块网卡和MAC地址,当通信时使用同一块物理网卡,网卡通讯有排队方式,在同一台物理网卡上,排队执行任务。(将物理网卡设为混杂模式;无论是不是发向本机物理网卡的内容都给与接收);此时将物理网卡也虚拟化一个MAC地址,把物理网卡当作交换机来使用。
CPU的虚拟化
宿主机内核运行在CPU的0环上,然后每个虚拟机,用软件的方式都虚拟出一个CPU的0环。软件实现的速度会很慢。
最后发展为,在环0里添加一个环-1;宿主机的内核运行在环-1上;虚拟机的内核运行在环0上。虚拟机的其他应用在CPU的环3上;现在的pc机上都支持这一技术。
I/O设备的虚拟化
虚拟机如何使用硬盘的空间:虚拟机在物理硬盘上划分一个文件来使用,此文件也是靠宿主机通过文件系统将磁盘分区后,并创建文件系统后,分给虚拟机一个文件的大小的空间。在宿主机上表现的就是一个文件,而在虚拟机上表现的就是一块硬盘。所以还需要用软件的方式模拟一个适配器,将此文件,模拟成硬盘。这种方式为全虚拟化,据统计全虚拟化的速率只有真实物理硬盘的40%,而半虚拟化可以达到80%,所以我们要实现半虚拟化,实现方法:宿主机有多块硬盘时,直接将一整块硬盘给虚拟机使用,而不是要通过宿主机以文件的方式来使用。(此方法叫I/O透传)
虚拟化的技术类型
主机虚拟化
虚拟化的结构:物理机器—–>操作系统——->虚拟化管理平台——->虚拟机(这种方法,虚拟机上的一个应用要运行,首先调用自己的内核,然后再经过虚拟化管理平台,最后传到物理机的内核,这种方法虚拟机上的应用要通过三层调用才能够处理,效率太低)此种为type-2虚拟化。
两级管控平台:将虚拟化平台和操作系统合二为一,直接运行再物理硬件上,然后再虚拟化平台上在创建虚拟机,这样就变成了两级调用。这种虚拟化管理平台被统称为:Hypervisor 。(兼具操作系统和虚拟换管理的作用)此种为type-1虚拟化种类。在这种技术下常用的虚拟化软件有:xen, kvm, virtualbox:
xen的工作方式:首先在操作系统上安装xen;(rpm包);装好之后重启宿主机的操作系统,起来之后xen就成为了操作系统,直接运行在物理硬件之上了,将原来宿主机的操作系统,挤下去成为第一个虚拟机(dom0)。将刚挤下去的成为第一个虚拟机(dom0)的当为它的管理接口(管理接口:创建,删除,新建虚拟机)后面创建的虚拟机为dom1;dom2……
KVM的工作方式:KVM是内核模块,一旦装上KVM的内核模块,原来的内核,就变为虚拟化管理平台:Hypervisor ,不用重启就直接可以在虚拟化管理平台上创建虚拟机了。
容器级虚拟化 :(相较于主机级虚拟化隔离的不彻底)
lxc, libcontainer, runC, openvz
Linux内核运行在物理设备上;在内核上运行多个操作系统如:centos,wubantu;susan;等,因为他们都是基于linux内核来开发的不同界面的操作系统而已,底层运行的内核是相同的。在每个操作系统上在运行每个应用。在内核上运行一个软件来创建和管理容器,是一个很小的软件,基本不消耗性能。
由于多个操作系统使用的是同一个内核,当在操作系统上执行关机命令,就会将内核关闭,所以需要将每个操作系统隔离开来,关掉的只是自身容器 本身而已。各个操作系统之间的操作互补干扰。(共享内核)
Linux目前流行的开源虚拟化技术解决方案:
主机虚拟化:xen, kvm, virtualbox
容器级:lxc, libcontainer, runC, openvz
模拟器:qemu
#modinfo kvm:查看KVM的详细模块信息(在centos和红帽系统上已将KVM编译到内核模块里,只是没有装载而已)
快速使用KVM技术
判断CPU是否支持硬件虚拟化
#grep -i -E ‘(vmx|svm|lm)’ /proc/cpuinfo
vmx:Intel VT-x #inter的CPU出现vmx;lm “64位的操作平台”字样代表支持硬件虚拟化
svm:AMD AMD-v #AMD的CPU出现svm字样代表支持硬件虚拟化
由于在虚拟主机上在创建虚拟主机是不支持的,需要在vamwar上修改虚拟机的cpu之后:就会出现你所要搜索的VMX了。
在centos7.5上利用虚拟机管理器去创建一个虚拟机:和使用VMware一样来新建一个虚拟机(使用自动化安装光盘导入后自动化来安装)
#yum install libvirt-daemon-kvm qemu-kvm virt-manager libvirt #安装包 (virt-manager :图形管理工具”如同vmware一样实现对虚拟机的创建删除等管理” ; libvirt:虚拟化工具;远程可使用virsh命令行工具来管理kvm) #modprobe kvm #加载kvm模块 #systemctl start libvirtd.service #启动服务 #ps aux 查看进程 /usr/sbin/libvirtd是否运行起来了 #/etc/libvirt/ #各配置文件存放的目录 #virsh iface-bridge ens37 br0 #创建一个桥接网卡br0地址在ens33上
#virt-manager #在图形化界面运行此命令打开管理虚拟机的图形界面
创建过程中设定网卡
virsh iface-bridge ens37 br0 (创建一个桥接网卡地址)
桥接到ens33上,新建的虚拟机就会连接到ens33上网卡及地址,如果要想此虚拟机连接到外网上,则开始就需要桥接到可以连接到外网的ens37网卡上。在虚拟机的硬件设备中,选择刚创建的网桥作为自己的网卡设备:可以在安装好虚拟机后再硬件设备里去更改,也可以在新建虚拟机的时候有选项时添加网卡的选项:如下图设置的内容:
上图的网卡地址是自己创建的网桥和宿主机的网卡链接到一起的。
创建好设置网卡
#virsh list #列出在本机上正在运行的虚拟机
#ls /var/lib/libvirt/images/ #存放虚拟机文件的目录 #ls /etc/libvirt/qemu/ #会生一个centos6.9.xml文件,此文件是配置虚拟机的详细参数
有图形界面的宿主机通过远程ssh连接无图形界面的宿主机管理虚拟机
# yum install openssh-askpass #在图形界面的机子上安装相关工具包
virsh命令(KVM命令行的管理工具)
虚拟机的生成需要依赖于预定义的xml格式的配置文件;其生成工具有两个:virt-manager, virt-install;
virsh和virt-manager都可以实现对虚拟机的管理,一个是命令行的工具,一个是图形化的工具。
/etc/libvirt/qemu/会生一个centos6.9.xml文件,此文件是配置虚拟机的详细参数。如果将此文件更改一下,就可以使用创建新的虚拟机了。
创建虚拟机:
create:从xml格式的配置文件创建并启动虚拟机(virsh create –console /etc/libvirt/qemu/centos6.9.xm) define:从xml格式的配置文件创建虚拟机不启动;
virsh list (列出所有的虚拟机)
停止:
virsh destroy +虚拟机的名称:强行关机;
virsh shutdown +虚拟机的名称:关机;
启动:
virsh start +虚拟机的名称:启动 virsh reboot +虚拟机的名称:重启; virsh undefine +虚拟机的名称:删除虚拟机; suspend/resume:暂停于内存中,或继续运行暂停状态的虚拟机;
真正实现的效果:pause/unpause
virsh save +虚拟机名/virsh restore +文件名 :保存虚拟机的当前状态至文件中,或从指定文件恢复虚拟机;
console:连接至指定domain的控制台;
域的设备资源管理
cpu-stats vcpuinfo vcpucount setvcpus vcpupin setmaxmem virsh setmem +虚拟主机名 1500 (更改内存大小;改完后会触发重启)
例:
[root@centos7 ~]# virsh cpu-stats centos6.9-2 CPU0: cpu_time 105.819051740 seconds vcpu_time 56.660703440 seconds Total: cpu_time 105.819051740 seconds user_time 7.130000000 seconds system_time 14.370000000 seconds [root@centos7 ~]# virsh vcpuinfo centos6.9-3 VCPU: 0 CPU: 0 State: running CPU time: 54.8s CPU Affinity: y
虚拟主机磁盘设备的创建和更改替换(在KVM主机上操作)
attach-disk/detach-disk/domblklist:磁盘设备的热插拔; cd /var/lib/libvirt/images/ (进入存放虚拟 机文件的目录下) virsh domblklist centos6.9 (查看虚拟主机名为cents6.9下的磁盘) Target Source ———————————————— vda /var/lib/libvirt/images/centos6.9.img (第一块磁盘默认为vda;类似如sda;sdb等) hda – qemu-img create -f qcow2 -o size=20G,preallocation=metadata ./secon.img (在当前目录下创建一个20G的磁盘。secon.img 新创建的磁盘名称;qcow2;位创建磁盘的格式) qemu-img info secon.img (查看刚刚创建的磁盘文件的信息) virsh attach-disk centos6.9 /var/lib/libvirt/images/secon.img vdb (将刚创建的磁盘加到虚拟机上) virsh domblklist centos6.9 (在此查看虚拟机的磁盘信息:发现已经有了第二块磁盘上了) virsh console centos6.9 (连接到虚拟机上查看,分区,使用) virsh detach-disk centos6.9 vdb (拆除vdb磁盘。拆除之前要确保磁盘不在挂载使用) OK!
实现网络接口的热插拔:(以下操作是在KVM主机上的)
attach-interface/detach-interface/domiflist:网络接口设备的热插拔; type:bridge source:BRIDGE_NAME virsh domiflist centos6.9 (查看虚拟主机的网卡信息) virsh attach-interface centos6.9 bridge virbr0 (将虚拟主机的网卡桥接到virbr0上去:virbr0:是物理桥;查看虚拟主机的网卡信息会发现多了而一个网卡地址) virsh detach-interface centos6.9 bridge –mac 52:54:00:5e:0d:05 (拆除网卡:需要写要拆除网卡的mac地址) 再次去创建的虚拟主机上查看网卡信息就会发现已经拆掉了。
qemu :(使用qemu对虚拟机进行管理)
Qemu:
处理器模拟器
仿真各种IO设备
将仿真设备连接至主机的物理设备
提供用户接口
和libvirt 工具一样可以实现对虚拟主机的管理。
brctl addbr mybr0 (添加一个网桥)
brctl show (查看创建的网桥)
ifconfig mybr0 up (使用前需要将创建的网桥开启)
#yum install qemu-kvm #安装包
#ln -sv /usr/libexec/qemu-kvm /usr/bin/ #由于安装好的qemu不在/usr/bin/下所以需要链接至其下
qemu-kvm命令语法
qemu-kvm [options] [disk_image] qemu-kvm -machine ?(查看所支持模拟机器的类型) qemu-kvm -cpu ? (查看模拟所支持的cpu的类型)
CentOS磁盘镜像文件下载:
https://cloud.centos.org/centos/7/images/
#vim /etc/qemu-ifup #新建一个脚本 #!/bin/bash # bridge=mybr0 if [ -n “$1” ];then ip link set $1 up sleep 1 brctl addif $bridge $1 [ $? -eq 0 ] && exit 0 || exit 1 else echo “Error: no interface specified.” exit 2 fi
#bash -n /etc/qemu-ifup #检查脚本的语法错误
#chmod +x /etc/qemu-ifup #添加执行权限
#mkdir -pv /data/VMs/c1 #创建文件夹。来存放磁盘镜像文件
#cd /data/VMs/c1/ #进入此目录下
#cirros-no_cloud-0.3.0-x86_64-disk.img #再ftp服务器里ISOs里将此镜像文件下载到本目录下,也可以将centos镜像文件放在这里
#mv cirros-no_cloud-0.3.0-x86_64-disk.img c1.img #将文件重新命名
#qemu-kvm -name c1 -smp 2 -m 128 -cpu host -drive
file=/data/VMs/c1/c1.img,if=virtio,media=disk,cache=writeback,format=qcow2 -net nic,macaddr=52:54:00:00:00:11,model=virtio -net tap,script=/etc/qemu-ifup -vnc :0 (回车查看5900的端口 已经打开了)
通过桌面上的vnc链接到本机的IP地址192.168.130.8:0 (就可以连接上了)
连接上之后,给此虚拟机添加一个IP地址:ifconfig eth0 10.0.0.4/16
查看添加的网卡接口位:tap0
远程ssh也是可以来凝结本虚拟机的。
如果需要关闭虚拟机直接将qemu进程杀掉就可以了。
如果再创建一个虚拟机,vnc的编号要改;mac地址也要改;磁盘镜像文件也要添加新的