资讯专栏INFORMATION COLUMN

2018年第13周-虚拟化技术理解(内含Centos7上安装KVM)

cgh1999520 / 2719人阅读

摘要:硬件虚拟化早在世纪年代开发大型机时就认识到了虚拟化的重要性。常见的硬件虚拟化技术例如和都同时支持全虚拟化和半虚拟化。因此,硬件虚拟化也被称为重量级虚拟化,在同一宿主机上能够同时运行的虚拟机数量相当有限。

虚拟化技术简介

说道KVM,那必须先提虚拟化技术,我网上查的资料,貌似大家对虚拟化的一些术语没有达成统一的标准,如:仿真、完全虚拟化、超虚拟化、操作系统级虚拟化。
其实我觉得这些术语没有统一,也仅仅是因为角度的问题。也或许是理解不深,所以我这说的也仅仅是个人理解,可能也是理解不够深,仅供参考。
而单单连虚拟化这词,在不同人,不同层面上理解,都不一样。

神级别的虚拟化(虚拟化的起源)

先站住计算机科学的层面来看,也就是站在神级别的角度去看(仅仅为了说得生动而已,并非神化科学),站在神级别的角度来看什么是虚拟化,准确来说是虚拟化的起源:

它的存在已经超过 50多年了。虚拟化技术最早用在包括 IBM的7044、麻省理工学院(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。

处理器虚拟化
虚拟化早期的另外一种用法(在本例中是对处理器的仿真)是 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-这虚拟化概念牵涉真深。

指令集虚拟化
虚拟化最新的发展称为指令集虚拟化,或者二进制转换。在这种模型中,虚拟指令集被转换成底层硬件的物理指令集,这个过程通常都是动态的。当代码执行时,就会对代码的某个段进行转换。如果出现分支情况,就会导入新代码集并进行转换。这使它与缓存操作非常类似,后者是将指令块从内存移动到本地快速缓存中执行。
这种模型最近在 Transmeta 设计的 Crusoe 中央处理单元(CPU)中得到了使用。二进制转换由 Code Morphing 的专利技术实现。类似的一个例子是完全虚拟化解决方案通过运行时代码扫描来查找和重定向特权指令(用来解决特定处理器指令集的一些问题)。

这么一说,好像是Java的JIT(just-in-time) 即时编译

当虚拟机发现某个方法或代码块运行特别频繁时,就会把这些代码认定为“Hot Spot Code”(热点代码),为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各层次的优化,完成这项任务的正是 JIT 编译器。
人级别的虚拟化(大家常说的虚拟化)

而这个层面,虚拟化是:

虚拟化是指在同一台物理服务器上模拟多台虚拟机的能力,且每台虚拟机在逻辑上拥有独立的CPU、内存、硬盘和网络接口等。虚拟化可以提高硬件资源的利用率,使多个应用能隔离的运行在同一台物理机上。

站在广义的虚拟化来看(知道我为什么上面用神级别虚拟化来代替吧,我真不知道比广义还广的应该叫啥,知道的同学可以帮忙科普下):
虚拟化分为硬件层面的虚拟化软件层面的虚拟化

硬件层面的虚拟化

硬件层面的虚拟化,我发现好像很多人是站在这个角度去看的,所以才把这里面的虚拟化技术分为:仿真、完全虚拟化、超虚拟化、超虚拟化、操作系统级虚拟化(这个应该属于软件层面的虚拟化,放在这里方便统一记忆)。

在硬件虚拟化的层面,现代虚拟化技术通常是全虚拟和半虚拟的混合体。常见的硬件虚拟化技术例如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

虚拟化性能分析(XEN/KVM/LXC)

参考 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的即可

上述两个网卡我需说一下,此时只能启动br0,如果ifup 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

当上面准备工作都做好,就可以安装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实现对虚拟机的操作

验证安装结果,此命令有输出说明KVM模块被正确加载

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 

以下标签就是文件的路径

``
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地址

TroubleShoot

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/10573.html

相关文章

  • 2018年第48-centos7下的docker的安装及常用命令

    摘要:下图是与其他虚拟技术的对比图。的目标是,基于这个目标,将你需要发布的应用组件及需要的环境配置都封装成一个镜像,然后基于镜像创建容器并启动运行。这样就可以达到组建级别的一次封装,多次运行。而默认情况下,属于用户,需要权限才能访问。 docker玩过很多次,但每次都是从零开始,所以这次而打算记录下来,方便后面查询。 docker的技术基础是LXC虚拟化技术,虚拟化技术有很多,有硬件层面和...

    lemon 评论0 收藏0
  • 2018年第12-yum私库搭建

    摘要:此实验过程仅在上实践过先顶一下角色,假设我有三台服务器,,。除了库,我们还可以将库,库等,私有化。 此实验过程仅在centos上实践过 先顶一下角色,假设我有三台服务器A,B,C。 服务器A是centos6.5版本,目标:我想把它当做yum私库服务器B是centos7.2版本,目标:yum安装程序包时,不从internet上获取安装包信息,而是从服务器A获取安装包信息来安装服务器C是...

    lk20150415 评论0 收藏0
  • 2018年第49-dnsmasq的安装(docker方式)

    摘要:在开发或测试环境可能有大量服务器数据库应用服务器中间件服务器等特别大数据系统涉及的服务器很多的时候很难记就算修改本机但每次新增删除一个对于的域名都是很麻烦的于是搭建一个就非常必须了这里使用无侵入式的搭建服务不要时删除即可新建三个文件在宿主新 在开发或测试环境, 可能有大量服务器, 数据库, 应用服务器, 中间件服务器等. 特别大数据系统, 涉及的服务器很多的时候, ip很难记, 就算修...

    Yuanf 评论0 收藏0
  • 2018年第33-javeer对nodejs体会

    摘要:流程源处理源代码,例如过滤任何值。工艺类从编译后处理生成的文件,例如对类进行字节码增强。整合后的测试执行集成测试后执行所需的操作。校验运行任何检查以验证包装是否有效并符合质量标准。 nodejs和es6 nodejs的语法和es6不一样,如模块系统,一个是CommonJS的require、一个是es6的import,写模块也不一样。 nodejs的npm 我来理解,nodejs类似与j...

    xiongzenghui 评论0 收藏0
  • Linux运维:Docker安装

    摘要:由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。子程序中,是守护进程,可以监听在套接字之上。这个套接字只允许允许在本机上。默认的镜像仓库是安装系统环境支持位,并且要求内核版本不低于。 docker学习笔记 LXC操作系统层虚拟化 LXC,其名称来自Linux软件容器(Linux Containers)的缩写,一种操作系统层虚拟化(Operating system–leve...

    dreamans 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<