01-KVM介绍与Ubuntu Linux的安装

一、KVM虚拟化介绍

1. 企业级虚拟机管理软件

常见的虚拟机管理平台(Hypervisor 也叫Virtual Machine Monitor)

1.1 商业软件

  • VMware的vSphere组件中ESXi
  • Microsoft的Hyper-V

1.2 开源软件

  • Linux的KVM
  • XEN

注:其中除了微软的Hyper-v是Windows Server 内核,其他都是基于Linux内核的。

2. 基于Linux内核虚拟化的特点

2.1 无虚拟化

  • X86架构一般设为4个Ring级别来管理和访问计算机硬件。
  • 系统内核一般运行在Ring 0 级别上
  • 用户模式应用程序一般运行在Ring 3级别上
  • 对于一个普通传统的Linux系统没有问题

 

 

下图为Linux内核的4个级别

 

 2.2 虚拟化

  • 在Guest 系统和Host 系统中间加一层Hypervisor
  • Host系统看它像运行在自己上面的程序
  • Guest系统看它像自己所运行的硬件
  • Host系统和Guest系统都运行相同的Linux,他们的Kernel都想运行在Ring0级别上,可怎么办?

2.3 非硬件辅助全虚拟化(最常见的虚拟化模式)

Full Virtualization without Hardware Assisit:

  • Hypervisor运行在Ring0级别上
  • Hypervisor对Guest OS提供CPU模拟,由Hypervisor 模拟一个CPU给VM,VM不直接使用真实的CPU。
  • Guest OS不做修改,还试图运行在Ring0级别上,只不过是调用模拟CPU的Ring 0(实际相当于Ring1)
  • Hypervisor对Guest OS的Ring 0上的指令进行转译,变成真实CPU的指令,只能运行在Ring 1上。

 

2.4 半虚拟化

Paravirtualization or OS Assisted Virtualization:

  • Hypervisor运行在Kernel Mode,Ring 0级别
  • Guest OS不能直接运行在Ring 0,而是需要Guest OS的Kernel进行修改,将运行在RIng 0上的指令转为调用Hypervisor(Hypercalls)
  • Guest OS 上的APP运行在Ring 3级别
  • 兼容性和便捷性相对较差,性能高于全虚拟化

2.5 KVM与VMware虚拟化对比总结

  • 和修改操作系统(OS)的使其支持半虚拟化功能相比,创建一个完全复杂的二进制转换来支持全虚拟化相对是困难的
  • 在全虚拟化状态下,Guest OS不知道自己是虚拟机,于是像发送普通的IO一样发送数据,被Hypervisor拦截,转发給真正的硬件。
  • 在半虚拟化状态下,Guest需要安装半虚拟化驱动,Guest OS知道自己是虚拟机,所以数据直接发送给半虚拟化设备,经过特殊处理,发送给真正的硬件。
  • VMware通过VMware tools来实现硬盘和网卡Paravirtualization来对硬件硬盘和网卡驱动的优化,但不是CPU Paravirtualization解决方案。
  • KVM下Paravirtualization半虚拟化设备virtio_blk,virtio_net,都是为了提高性能。

 2.6 硬件辅助全虚拟化

Full Virtualization with Hardware Assisit:

  • Inter(R) VT and AMD-V创建一个新的Ring 1 单独给 Hypervisor使用
  • Guest OS可以直接使用Ring 0而无需修改
  • 适合support 64-bit guest OS

 

 

 

2.7 Container Design - OS virtualization

 2.8 查看系统是否支持硬件辅助虚拟化

  • 对于Intel(R) CPU

grep "vmx" /proc/cpuinfo

  • 对于AMD CPU

grep "svm" /proc/cpuinfo

3. KVM,Qemu,Libvirt之间关系

3.1 KVM,Qemu,Libvirt特点

  • Qemu是一个模拟器,它向Guest OS模拟CPU,也模拟其他的硬件
  • 正如非硬件辅助全虚拟化讲到的,Guest OS认为自己和硬件直接打交道,其实是同Qemu模拟出来的硬件打交道,Qemu将这些指令转译给真正的硬件。
  • 由于所有指令都要从Qemu里面二进制转译,因而性能比较差。

 

  • KVM(Kernel-based Virtual Machine)是内核的模块,采用硬件辅助虚拟化技术 Intel(R) VT,AMD-V。
  • 使用KVM,Guest OS的CPU指令不用经过Qemu转译,直接运行,大大提高了速度。
  • KVM通过 /dev/kvm 暴露接口,用户级别程序可以通过ioctl来访问这个接口

  • Qemu将KVM整合进来,通过ioctl调用 /dev/kvm 接口,将有关CPU指令的部分交由KVM内核模块来做,就是qemu-kvm(qemu-system-XXX)。
  • Qemu还会模拟其他硬件,如:Network,Disk,virtio_net,降低这些设备的性能,于是产生Pass through半虚拟化设备virtio_blk,virtio_net,来提高设备性能。
  • Qemu-kvm对KVM的整合从release_0_5_1 开始有branch,在1.3.0正式merge到master。

  • Libvirt 是目前使用最广泛的对KVM虚拟化进行管理的工具和API

3.2 总结

  • Libvirt 是一个daemon进程,可以被本地的virsh 调用,也可以被远程的virsh调用。
  • Libvirt 调用qemu-kvn来操作虚拟机。
  • 有关CPU虚拟化部分,qemu-kvm调用kvm的内核模块来实现。

 

二、Ubuntu Linux的安装

下载最新的Ubuntu ISO:https://www.ubuntu.com/download/server

 

注:目前最新版本18.0.4.1 LTS,也可下载14.0.4.1 LTS,这里LTS表示持续支持版本,一般周期为3年左右。

三、调整apt软件库的源

1. 如何获取源

源是apt-get 要寻找和安装软件的软件库,以文件形式保存在 /etc/apt/sources.list

默认使用的欧洲源,国内下载速度很慢,可以把更新源换成速度更快的国内镜像站

这里选用163源:

Trusty(14.0.4)这里不通版本可能不一样

deb http://mirrors.163.com/ubuntu/trusty main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/trusty-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/trusty-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/trusty-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/trusty-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/trusty main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/trusty-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/trusty-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/trusty-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/trusty-backports main restricted universe multiverse

2. 更新源

root@KVMTEST01:/# apt-get update                             #更新软件包列表信息

root@KVMTEST01:/# apt-get upgrade                           #安装更新的软件包和相关依赖包

root@KVMTEST01:/# apt-get dist-upgrade                    #安装更新的软件包和相关依赖包

root@KVMTEST01:/# apt-cache search qemu-kvm       #查看qemu-kvm是否支持

问题:update、upgrade和dist-upgrade有何不同?

update
           update is used to resynchronize the package index files from their
           sources. The indexes of available packages are fetched from the
           location(s) specified in /etc/apt/sources.list. For example, when
           using a Debian archive, this command retrieves and scans the
           Packages.gz files, so that information about new and updated
           packages is available. An update should always be performed before
           an upgrade or dist-upgrade. Please be aware that the overall
           progress meter will be incorrect as the size of the package files
           cannot be known in advance.

       upgrade
           upgrade is used to install the newest versions of all packages
           currently installed on the system from the sources enumerated in
           /etc/apt/sources.list. Packages currently installed with new
           versions available are retrieved and upgraded; under no
           circumstances are currently installed packages removed, or packages
           not already installed retrieved and installed. New versions of
           currently installed packages that cannot be upgraded without
           changing the install status of another package will be left at
           their current version. An update must be performed first so that
           apt-get knows that new versions of packages are available.

       dist-upgrade
           dist-upgrade in addition to performing the function of upgrade,
           also intelligently handles changing dependencies with new versions
           of packages; apt-get has a "smart" conflict resolution system, and
           it will attempt to upgrade the most important packages at the
           expense of less important ones if necessary. The dist-upgrade
           command may therefore remove some packages. The
           /etc/apt/sources.list file contains a list of locations from which
           to retrieve desired package files. See also apt_preferences(5) for
           a mechanism for overriding the general settings for individual
           packages.
上面的内容是从apt-get的man文档中摘录出来的。上面表达的意思是:
  • update的作用是从/etc/apt/source.list文件中定义的源中去同步包的索引文件,即运行这个命令其实并没有更新软件,而是相当于windows下面的检查更新,获取的是软件的状态。
  • upgrade则是根据update命令同步好了的包的索引文件,去真正地更新软件。
  • dist-upgrade则是更聪明的upgrade,man文档中说它以更聪明的方式来解决更新过程中出现的软件依赖问题,它也是从/etc/apt/source.list文件中获得地址,然后从这些地址中检索需要更新的包。


注意:每次更新之前,我们需要先运行update,然后才能运行upgrade和dist-upgrade,因为相当于update命令获取了包的一些信息,比如大小和版本号,然后再来运行upgrade去下载包,如果没有获取包的信息,那么upgrade就是无效的。
posted @ 2019-01-07 16:37  青云浮龙  阅读(398)  评论(0)    收藏  举报