KVM

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网卡上。在虚拟机的硬件设备中,选择刚创建的网桥作为自己的网卡设备:可以在安装好虚拟机后再硬件设备里去更改,也可以在新建虚拟机的时候有选项时添加网卡的选项:如下图设置的内容:

42}%~2U{BFSK@SD}T%[UDG4

上图的网卡地址是自己创建的网桥和宿主机的网卡链接到一起的。

 创建好设置网卡

#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地址也要改;磁盘镜像文件也要添加新的

posted @ 2018-07-29 17:53  琼兔  阅读(422)  评论(0编辑  收藏  举报