说道KVM,那必须先提虚拟化技术,我网上查的资料,貌似你们对虚拟化的一些术语没有达成统一的标准,如:仿真、彻底虚拟化、超虚拟化、操做系统级虚拟化。
其实我以为这些术语没有统一,也仅仅是由于角度的问题。也或许是理解不深,因此我这说的也仅仅是我的理解,可能也是理解不够深,仅供参考。
而单单连虚拟化这词,在不一样人,不一样层面上理解,都不同。html
先站住计算机科学的层面来看,也就是站在神级别的角度去看(仅仅为了说得生动而已,并不是神化科学),站在神级别的角度来看什么是虚拟化,准确来讲是虚拟化的起源:前端
它的存在已经超过 50多年了。虚拟化技术最先用在包括 IBM的704四、麻省理工学院(MIT)的 CTSS(Compatible Time Sharing System)以及曼彻斯特大学的 Atlas 项目(世界上最先的超级计算机之一),这些都是请求页面调度和监管进程调用的先驱。
IBM 早在 20 世纪 60 年代开发 System/360™ Model 67 大型机时就认识到了虚拟化的重要性。Model 67 经过 VMM(Virtual Machine Monitor)对全部的硬件接口都进行了虚拟化。在早期计算中,操做系统被称为supervisor。可以在运行其余操做系统的操做系统被称为 hypervisor(这个术语是在 20 世纪 70 年代出现的)。
VMM 能够直接在底层硬件上运行,容许运行多个虚拟机(VM)。每一个 VM 均可以运行一个本身私有操做系统的实例 —— 在早些时候,这称为 CMS(或 Conversational Monitor System)。以后 VM 继续发展,如今您能够在 System z9™ 大型机上发现 VM。这提供了很好的向后兼容性,甚至是对 System/360 产品线的兼容性。
这里,这个hypervisor术语有点重要,要考的。在早期计算中,操做系统被称为supervisor。可以在运行其余操做系统的操做系统被称为 hypervisor。python
虚拟化早期的另一种用法(在本例中是对处理器的仿真)是 P-code(或伪码)机。P-code 是一种机器语言,运行于虚拟机而不是实际硬件。P-code 早在 20 世纪 70 年代就已在加州大学圣地亚哥分校(UCSD)Pascal 系统上很有名气了,它将 Pascal 程序编译成 P-code,而后在一个 P-code 虚拟机上运行。这就使 P-code 程序具备了高度的可移植性,并且,只要有可用的 P-code 虚拟机,P-code 程序就能够运行。
20 世纪 60 年代对 BCPL(Basic Combined Programming Language)的设计中也采用了相同的概念,C 语言即由 BCPL 发展而来。在这种用法中,编译器会将 BCPL 代码编译成称为 O-code 的中间机器代码。接下来的第二个步骤是将 O-code 编译成目标机器的原始语言。现代编译器所使用的这种模型为将编译器移植到新目标体系结构上提供了很大的灵活性(经过一种中间语言将前端和后端分隔开来)。
soga,原来C的设计也是有这么一方面的考虑。-0-这虚拟化概念牵涉真深。linux
虚拟化最新的发展称为指令集虚拟化,或者二进制转换。在这种模型中,虚拟指令集被转换成底层硬件的物理指令集,这个过程一般都是动态的。当代码执行时,就会对代码的某个段进行转换。若是出现分支状况,就会导入新代码集并进行转换。这使它与缓存操做很是相似,后者是将指令块从内存移动到本地快速缓存中执行。
这种模型最近在 Transmeta 设计的 Crusoe 中央处理单元(CPU)中获得了使用。二进制转换由 Code Morphing 的专利技术实现。相似的一个例子是彻底虚拟化解决方案经过运行时代码扫描来查找和重定向特权指令(用来解决特定处理器指令集的一些问题)。
这么一说,好像是Java的JIT(just-in-time) 即时编译vim
当虚拟机发现某个方法或代码块运行特别频繁时,就会把这些代码认定为“Hot Spot Code”(热点代码),为了提升热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各层次的优化,完成这项任务的正是 JIT 编译器。
而这个层面,虚拟化是:后端
虚拟化是指在同一台物理服务器上模拟多台虚拟机的能力,且每台虚拟机在逻辑上拥有独立的CPU、内存、硬盘和网络接口等。虚拟化能够提升硬件资源的利用率,使多个应用能隔离的运行在同一台物理机上。
站在广义的虚拟化来看(知道我为何上面用神级别虚拟化来代替吧,我真不知道比广义还广的应该叫啥,知道的同窗能够帮忙科普下):
虚拟化分为硬件层面的虚拟化和软件层面的虚拟化。centos
硬件层面的虚拟化,我发现好像不少人是站在这个角度去看的,因此才把这里面的虚拟化技术分为:仿真、彻底虚拟化、超虚拟化、超虚拟化、操做系统级虚拟化(这个应该属于软件层面的虚拟化,放在这里方便统一记忆)。api
在硬件虚拟化的层面,现代虚拟化技术一般是全虚拟和半虚拟的混合体。常见的硬件虚拟化技术例如VMWare、Xen和KVM都同时支持全虚拟化和半虚拟化。硬件虚拟化方式提供的虚拟机,都独立的运行着一个完整的操做系统,这样在同一台物理宿主机上存在大量相同或者类似的进程和内存页,从而致使较大的性能损耗(好比:宿主机操做系统是Centos,使用KVM生成的多个虚拟机,且在每一个虚拟机中都运行Windows操做系统和相同的QQ程序,这样宿主机的性能必然产生较大损耗)。所以,硬件虚拟化也被称为重量级虚拟化,在同一宿主机上可以同时运行的虚拟机数量至关有限。
这层面虚拟化项目有:缓存
项目 | 类型 | 许可证 |
---|---|---|
Bochs | 仿真 | LGPL |
QEMU | 仿真 | LGPL/GPL |
VMware | 彻底虚拟化 | 私有 |
z/VM | 彻底虚拟化 | 私有 |
Xen | 超虚拟化 | GPL |
UML | 超虚拟化 | GPL |
Linux-VServer | 操做系统级虚拟化 | GPL |
OpenVZ | 操做系统级虚拟化 | GPL |
一句话:硬件层面的虚拟化,就是在硬件上面模拟出N套硬件出来,N套硬件上能够装不一样的系统,而后不一样的虚拟化技术就是层次不同,从而形成性能、便利等有所区别。服务器
而站在这个角度里看,有些人都把上述的硬件层面的虚拟机化统称为彻底虚拟化(这个概念跟上面的硬件层面的虚拟化中的“彻底虚拟化”冲突了,可能会有困惑,理解角度不同看到就不同,这或许就没那么困惑)。
指在同物理服务器上提供多个隔离的虚拟运行环境,也被称为容器技术。在软件虚拟化的层面,同一宿主机上的全部虚拟机(又称Container)共享宿主机的操做系统实例,不存在因为运行多个操做系统实例所形成的性能损耗(好比:宿主机的操做系统为Centos,经过软件虚拟化技术生成多个Container,且每一个Container都运行着QQ程序,因为它们共享同一个宿主机Centos操做系统,全部Container中QQ程序的进程在Centos中只有一个)。所以,软件虚拟化也被称为轻量级虚拟化,在同一宿主机上可以同时运行的虚拟运行环境数量比较宽松。以Solaris操做系统上的Container为例,一个Solaris操做系统的实例理论上能够支持多达8000个Container(实际可以运行的Container数量取决于系统资源和负载)。与此相似,Linux操做系统上的LXC也能够轻松地在同一宿主机上同时支持数量可观的虚拟运行环境。
LXC技术就是属于这层次上面,对应的项目有:Linux-VServer、OpenVZ和另一个鼎鼎大名的Docker
参考 http://blog.chinaunix.net/uid...
三种虚拟化性能比较 LXC>>KVM>>XEN
因为LXC使用cgroup机制,其性能损坏基本为0。
三种虚拟化隔离比较 XEN>>KVM>>LXC
LXC只能虚拟化linux。
三种虚拟化内存利用率 LXC>>KVM>>XEN
因为LXC共用内核,内存利用率最高;其余两种方案每一个虚机都须要单独的操做系统占用一部份内存空间。
到了这个层次,虚拟化应该诞生出行业的区别。诞生出的行业有:云计算、大数据
比较有表明性就是亚马逊AWS和开源项目Openstack
比较有表明性的是Hadoop
这里就不展开的说,再展开或许就有点跑偏题。
另外,虚拟化也能够将多台计算机组合成一台计算机的形式呈现出来。这一般称为服务器聚合或网格计算。
1.装centos7时,SOFTWARE SELECTION这选项选择Virtualization Host
2.进入系统后,修改host
hostnamectl --static set-hostname cdh-host.c7.jevoncode.com
3.关闭SELinux
vim /etc/selinux/config 将第一个enable改成disable
4.关闭防火墙
systemctl stop firewalld.service systemctl mask firewalld.service
5.新建桥接的网卡,假设现有以太网的网卡是eth0,则改成如下
进入目录: cd /etc/sysconfig/network-scripts/
TYPE="Ethernet" BOOTPROTO="none" 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="0cd981cd-8d6c-4802-a185-c64770110711" DEVICE="eth0" ONBOOT="yes" BRIDGE="br0"
其中BOOTPROTO、BRIDGE、ONBOOT是须要改以外,其余都是系统安装时的样子便可
6.在当前目录新建配置ifcfg-br0(复制ifcfg-eth0更名为ifcfg-br0),内容以下:
TYPE="Bridge" BOOTPROTO="static" 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="br0" UUID="0cd981cd-8d6c-4802-a185-c64770110711" DEVICE="br0" ONBOOT="yes" IPADDR=192.168.1.108 PREFIX=16 GATEWAY=192.16.1.1 DNS1=192.168.1.1
其中TYPE、BOOTPROTO、BRIDGE、ONBOOT、NAME、DEVICE、IPADDR、PREFIX、GATEWAY、DNS1是须要改以外,其余都是复制ifcfg-eth0的便可
device p4p1 is already a member of a bridge; can't enslave it to bridge br0
也就只能ifup br0,因此br0的IPADDR最好就是设置以前eth0获取的ip,另外gateway的查询是: netstat -rn 或 route -n
netstat -rn Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 br0 192.168.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br0 192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
(以0.0.0.0开始的行的Gateway是默认网关)
DNS的查询则是
cat /etc/resolv.conf
注,需查看本身CPU支不支持虚拟化:
egrep '(vmx|svm)' /proc/cpuinfo
有vmx(Intel)或svm(AMD)字样,就说明CPU的支持的。
当上面准备工做都作好,就能够安装kvm了
1.安装KVM程序包及其依赖
yum install qemu-kvm libvirt virt-install bridge-utils -y
kvm相关程序包及其做用:
安装包 | 做用 |
---|---|
qumu-kvm | KVM核心模块 |
libvirt | 虚拟机管理工具,对虚拟机进行操做的集成各类接口库函数的中间件 |
python-virtinst | 记录建立VM的xml文件 |
bridge-utils | 网桥支持工具 |
virt-viewer | 图形查看功能 |
virt-manager | 安装图形界面管理虚拟机,virt-manager经过libvirt实现对虚拟机的操做 |
lsmod | grep kvm
3.开启kvm服务,而且设置其开机自动启动
systemctl start libvirtd systemctl enable libvirtd
4.两个方式查看kvm服务运行情况
systemctl status libvirtd systemctl is-enabled libvirtd
1.新建虚拟机命令:
virt-install \ --virt-type=kvm \ --name=centos7A \ --vcpus=2 \ --memory=4096 \ --location=/root/CentOS-7-x86_64-DVD-1708.iso \ --disk path=/home/vms/centos7A.qcow2,size=40,format=qcow2 \ --network bridge=br0 \ --graphics none \ --extra-args='console=ttyS0' \ --force
2.安装可过程是命令式安装centos的,此过程跟图像界面很相似,这就略过了
1.退出连接虚拟机:ctrl+]
2.查看虚拟机列表
virsh list --all
3.连接虚拟机
virsh console centos7A
4.启动虚拟机
virsh start centos7C
5.删除虚拟机
virsh undefine centos7A rm -rf /home/vms/centos7A.qcow2
KVM的虚拟机复制分两种状况:
1.关闭虚拟机
virsh shutdown centos7A
2.查看虚拟机镜像文件在哪
virsh edit centos7A
如下标签就是文件的路径
<source file='/home/vms/centos7A.qcow2'/>
``
3.将centos7A复制为centos7B
virt-clone -o centos7A -n centos7B -f /home/vms/centos7B.qcow2
4.便可连接虚拟机centos7B了
这目的就是完成相似用VirtualBox的导出功能,导出来给其余机子上使用
1.建立新虚拟机centos7B的配置文件
virsh dumpxml centos7A > /etc/libvirt/qemu/centos7B.xml
2.进入centos7A镜像的目录/home/vms/,复制镜像
cp centos7A.qcow2 centos7B.qcow2
3.用vim修改配置文件centos7B.xml,修改name,uuid,disk文件位置,mac地址
4.经过新虚拟机的配置文件,定义一个虚拟机:
virsh define /etc/libvirt/qemu/centos7B.xml
注:uuid能够网上找个工具生成,但mac地址必定是新物理机有的mac地址,若是是本机复制,那就不用改mac地址
1.非本机复制时,define一个虚拟机时报:
错误:从 /etc/libvirt/qemu/centos7C.xml 定义域失败 错误:XML error: expected unicast mac address, found multicast '23:F6:7F:2B:67:5D'
那是由于所造的mac地址是组播地址,要非组播的mac地址才行,开头大于24便可
2.
错误:开始域 centos7C 失败 错误:unsupported configuration: guest and host CPU are not compatible: Host CPU does not provide required features: x2apic, hypervisor, rdseed, adx, smap, 3dnowprefetch; try using 'Broadwell-noTSX' CPU model