36-虚拟化

本章内容

◆ 虚拟化基础
◆ 虚拟化技术之KVM
◆ kvm实战案例

一:虚拟化基础

https://www.vmware.com/cn/solutions/virtualization.html

1.1:传统的物理机部署方案
  • 服务器选型及采购
  • IDC选择
  • 服务器系统选择、系统安装、上架
  • 应用规划及部署
  • 域名选择及注册
  • DNS映射
  • 测试外网访问

传统数据中心面临的问题:

  • 服务器资源利用率低下,CPU、内存等不能共享
  • 资源分配不合理
  • 初始化成本高
  • 自动化能力差
  • 集群环境需要大量的服务器主机
1.2:什么是虚拟化和虚拟机

1.2.1:虚拟化

  • 在计算机技术中,虚拟化(Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分割、组合为一个或多个计算机配置环境,并重新分割、重新组合,以达到最大化合理利用物理资源的目的。
  • 虚拟化可以提高 IT 敏捷性、灵活性和可扩展性,同时大幅节约成本,实现更高的工作负载移动性、更高的性能和资源可用性、自动化运维 - 这些都是虚拟化的优势,虚拟化技术可以使 IT 部门更轻松地进行管理以及降低拥有成本和运维成本。其他优势包括:
降低资金成本和运维成本。
最大限度减少或消除停机。
提高 IT 部门的工作效率、效益、敏捷性和响应能力。
加快应用和资源的调配速度。
提高业务连续性和灾难恢复能力

虚拟化的由来

  • 1964年,IBM推出了专为 System/360 Mainframe 量身订造的操作系统 CP-40,首次实现了虚拟内存和虚拟机。
  • 1967 年,第一个管理程序(hypervisor)诞生,5年之后,IBM 发布用于创建灵活大型主机的虚拟机(VM)技术,该技术可根据动态的需求快速而有效地使用各种资源。从此,虚拟化这一词汇正式被引入了IT的现实世界。
  • 20世纪 90 年代 Windows 的广泛使用以及 Linux 作为服务器系统的出现奠定了 x86 服务器的行业标准地位。
  • 1998年VMware公司在美国成立,1999年VMware发布了它的第一款产品VMware Workstation、 2001年发布VMware GSX Server和VMware ESXI Server宣布进入服务器虚拟化市场, 2003年VMware推出了VMware Virtual Center, 2004年推出了64位支持版本,同年被EMC收购,2013年收入52.1亿美元。
  • 2007年8月21日,思杰宣布5亿美元收购XenSource公司,并推出服务器虚拟化XenServer、桌面虚拟化XenDesktop和应用虚拟化XenApp,2013年收入29亿美元。
    2008年3月13日微软在北京发布Windows Server 2008,内置虚拟化技术hyper-v。
    2008年9月,红帽以1.07亿美元的价格收购KVM的母公司Qumranet,并推出企业级虚拟化解决方案RHEV,目前最新版本3.3,2013年收入超过13亿美元
image.png

1.2.2:虚拟机

虚拟计算机称为“虚拟机”(VM,Virtual Machine),它是一种严密隔离且内含操作系统和应用的软件容器。每个自包含
虚拟机都是完全独立的。通过将多台虚拟机放置在一台计算机上,可仅在一台物理服务器或“主机”上运行多个操作
系统和应用,名为“hypervisor”的精简软件层可将虚拟机与主机分离开来,并根据需要为每个虚拟机动态分配计算
资源。

虚拟机的主要特性

共享硬件
可在一台物理机上运行多个操作系统。
可在虚拟机之间分配系统硬件资源。

相互隔离
各虚拟机之间相互隔离互不影响。

封装
可将虚拟机的完整状态保存到文件中。
移动和复制虚拟机就像移动和复制文件一样轻松。

独立于硬件
可将任意虚拟机调配或迁移到其他理服务器上。

1.2.3:虚拟化类型

  • 1.2.3.1:服务器虚拟化

    服务器虚拟化支持将多个操作系统作为高效的虚拟机在单个物理服务器上运行。主要优势包括

    提升 IT 效率
    降低运维成本
    更快地部署工作负载
    提高应用性能
    提高服务器可用性
    消除服务器数量剧增情况和复杂性
    

    1.2.3.2:网络虚拟化

    通过软件定义网络,即网络的创建不再依赖于物理设备,如公有云厂商允许用户自己创建新的网络,在kubernetes、openstack中都会使用到网络虚拟化

    1.2.3.3:桌面虚拟化

    将桌面部署为代管服务使 IT 组织能够更快地响应不断变化的工作场所需求和新出现的机会。还可以将虚拟化桌面和应用快速、轻松地交付给分支机构、外包和离岸员工以及使用 iPad 和 Android 平板电脑的移动员工。

    1.2.3.4:应用虚拟化

    将软件虚拟化,比如 office 365

    1.2.3.5:存储虚拟化

    SAN(基于磁盘)/NAS(NFS/Samba)/GlusterFS/ceph等

    1.2.3.6:库虚拟化

    在linux上运行windows 程序使用 wine,在mac系统运行windows程序使用CrossOver等

    1.2.3.7:容器虚技术

    被称为下一代虚拟化技术,典型的就是docker、Linux Container(LXC)、pouch

1.2.4:虚拟化技术分类

模拟器:

在一个host之上通过虚拟化模拟器软件,模拟出一个硬件或者多个硬件环境,每个环境都是一个独立的虚拟机,CPU、
IO、内存等都是模拟出来的,可以在宿主机模拟出不同于当前物理机CPU指令集的虚拟机,比如可以在Windows 模拟
出mac OS、unix系统,比较出名的模拟器有:pearpc、QEMU、Bochs。

全虚拟机化 full virtualization / 准虚拟化 native virtualization:

全虚拟化/准虚拟化不做CPU和内存模拟,只对CPU和内存做相应的分配等操作,全虚拟化需要物理硬件的支持,
比如需要CPU必须支持并且打开虚拟化功能,例如Intel 的 Intel VT-X/EPT,AMD的AMD-V/RVI,以在CPU 层面支
持虚拟化功能和内存虚拟化技术,因此完全虚拟化也是基于硬件辅助的虚拟化技术。

#全虚拟化软件(硬件辅助全虚拟化):
vmware workstation #https://www.vmware.com/cn/products/workstation-pro.html
vmware esxi
paralles desktop
KVM
Microsoft Hyper-V
VirtualBox

KVM 是硬件辅助的虚拟化技术,主要负责 比较繁琐的 CPU 和内存虚拟化,而 Qemu 则负责 I/O 虚拟化,两者合作各自发挥自身的优势

image.png

半虚拟化 para virtualization:

  • 半虚拟化要求guest OS 的内核是知道自己运行在虚拟化环境当中的,因此guest OS的系统架构必须和宿主机的系统
    架构相同,并且要求对guest OS的内核做相应的修改,因此半虚拟化只支持开源内核的系统,不支持闭源的系统,比
    较常见的半虚拟化就是早期版本的XEN,但是Xen 从其3.0 版本开始,可以支持利用硬件虚拟化技术的支持
    (http://www-archive.xenproject.org/files/xen_3.0_datasheet.pdf),实现了完全虚拟化,可以在其
    平台上不加修改的直接运行如Linux/Windows 等系列的操作系统,使得系统具备了更好的兼容。

  • 半虚拟化软件:
    Xen

  • Domain 0:
    Domain 0 是一个修改过的 Linux kernel,是唯一运行在 Xen Hypervisor 之上的虚拟机,它拥有访问物理I/O 资源的权限,同时和系统上运行的其他虚拟机进行交互。Domain 0 需要在其它 Domain 启动之前启动。

  • Domain U:
    运行在 Xen Hypervisor 上的所有半虚拟化(paravirtualized)虚拟机被称为“Domain U PV Guests”,其上运行着被修改过内核的操作系统,如 Linux、Solaris、FreeBSD 等其它 UNIX 操作系统。所有的全虚拟化虚拟机被称为“Domain U HVM Guests”,其上运行着不用修改内核的操作系统,如 Windows 等。

KVM与XEN对比

XEN KVM
世时间 2003年 2007年
持企业 Citrix、Novell、Oracle、Sun、Ret Hat(RHEL5)和Virtual Iron Redhat、Ubuntu等
持的虚 化技术 全虚拟化、半虚拟化 全虚拟化
持架构 x86、IA64和AMD、Fujitsu、IBM、Sun等公司的ARM,以及 x86/64 CPU商家和Intel嵌入式的支持 支持虚拟化的CPU
持操作 统 UNIX、Linux和Microsoft Windows UNIX Microsoft 、Linux Windo 和 ws
态迁移 支持 支持(以前不支持)
核支持 需要对内核打补丁 内置在内核中

各虚拟化技术性能对比

虚拟机 名称 开发厂商及其简介 虚拟类型 执行 效率 GuestOS 以跨平台 是否可 许可证类 型
Xen http://www.xensource.com/ 半虚拟化、完 全虚拟化 非常 高 可以 GPL
Vmware http://www.vmware.com/ 完全虚拟化 较高 可以 私有
KVM http://www.linux-kvm.org/pa ge/Main_Page 完全虚拟化 较高 可以 GPL
QEMU http://www.qemu.com/ 模拟 较低 可以 LGPL/GPL

1.2.5:Hypervisor类型

Hypervisor是一种运行在基础物理服务器和操作系统之间的中间软件层,其可以允许多个操作系统和应用共享底层
的内存、CPU、磁盘等物理硬件,也可叫做VMM( virtual machine monitor ),即虚拟机监视器。

Hypervisor是所有虚拟化技术的核心,非中断地支持多工作负载迁移的能力是Hypervisor的基本功能,当服务器启
动并执行Hypervisor时,它会给每一台虚拟机分配适量的内存、CPU、网络和磁盘,并加载所有虚拟机的客户操作系
统。

直接运行到物理机

vmware esxi
rhev hypervisor

需要运行到操作系统

KVM,XEN
vmware workstation
paralles desktop
Microsoft Hyper-V
VirtualBox

常见的hypervisor类型

类型I-裸机型:直接运行在硬件设备上的,这种架构搭建的虚拟化环境称为裸机虚拟化环境(Bare-Metal Hardware Virtualization),比如:VMware ESXI
类型II-主机托管型,运行在具有虚拟化功能的操作系统上的,构建的是主机虚拟化环境(Hosted Virtualization),比如:VMware Workstation、VirtualBox

#Redhat将KVM划分到类型I即裸机型:
https://www.redhat.com/zh/topics/virtualization/what-is-KVM

1.2.6:虚拟化技术厂商

  • 1.2.6.1:软件技术厂商

    image.png
  • 1.2.6.2:硬件技术厂商:
    https://www.intel.cn/content/www/cn/zh/virtualization/virtualization-technology/intel-virtualization-technology.html
    Intel从2005年开始支持在CPU中加入硬件虚拟化的支持,intel virtualazation tochnology,简称intel VT,IntelVT虚拟化技术包括分别针对CPU的增强虚拟化技术IntelVT-x、I/O虚拟化的IntelVT-d、网络虚拟化的IntelVT-c技术:

    1.2.6.2.1:Intel VT-x
    Intel VT-x 可以让一个CPU工作起来像多个CPU在并行运行,从而使得在一台物理服务器内可以同时运行多个操作
    系统,能够降低(甚至消除)多个虚拟机操作系统之间的资源争夺和限制,从硬件上极大地改善虚拟机的安全性和
    性能,有助于提高基于软件的虚拟化解决方案的灵活性与稳定性,此外,IntelVT-x具备的虚拟机迁移特性还可为IT
    投资提供有力保护,并进一步提高故障切换、负载均衡、灾难恢复和维护的灵活性。

    Intel VT Flex Priority(灵活优先级):当处理器执行任务时,往往会收到其它设备或应用发出的请求或“中断”命令。为了最大程度减少对性能的影响,处理器内的一个寄存器专用来监控任务优先级,只有优先级高于当前运行任务的请求或“中断”才被及时处理。
    
    Intel VT Flex Migration(灵活迁移):虚拟化能够在无需停机的情况下,将运行中的虚拟机在物理服务器之间进行迁移,借助此项技术,管理程序能够在迁移池内的所有服务器中建立一套一致的指令,实现工作负载的无缝迁移
    
    Intel VT Extended Page Tables(EPT,扩展页表):为了降低实现内存虚拟化的难度和提升内存虚拟化的性
    能,Extended Page Tables直接在硬件上支持虚拟机内存的逻辑地址->虚拟机内存的物理地址->物理服务器内存的
    物理地址的两次转换。
    

    1.2.6.2.2:IntelVT-d技术:
    Intel VT-d技术支持直接I/O访问,虚拟机创建好之后,数据即可直接在虚拟机与为其分配的I/O设备之间进行传输,
    这样就加快了I/O的流动,减少VMM活动及服务器处理器的负载。

    1.2.6.2.3:Intel VT-c:
    Intel VT-c技术:支持网络连接的Intel虚拟化技术,包括虚拟机设备队列(VMDq)、虚拟机直接互连(VMDc)。

    虚拟机设备队列(VMDq),最大限度提高I/O吞吐率,Intel VT-c可将网络I/O吞吐量提高一倍以上,使虚拟化应用
    达到接近物理服务器的吞吐率。
    
    虚拟机直接互连(VMDc):大幅提升虚拟化性能。VMDc支持虚拟机直接访问网络I/O硬件,从而显著提升虚拟机性能,
    这些通信链路直接绕过了VMM交换机,进一步提升了I/O性能并减少服务器处理器的负载。
    

1.2.7:云计算

云计算(Cloud Computing)是概念最早是由Google 前首席执行官 埃里克•施密特(Eric Schmidt)在2006 年8 月9日的搜索引擎大会上首次提出的一种构想,而“云计算”就是这种构想的代名词,云计算以虚拟化为基础,以网络为中心,为用户提供安全、快速、便捷的数据存储和网络计算服务,包括所需要的硬件、平台、软件及服务等资源,而提供资源的网络就被称为“云”。

https://www.redhat.com/zh/topics/cloud-computing/cloud-vs-virtualization #虚拟化与云计算区别

以下为虚拟化和云计算的对比

项目 虚拟化
定义 技术 方法
目的 从 1 个物理硬件系统创建多个模拟环境 汇聚并自动化分配虚拟资源以供按需使用
用途 针对具体用途为特定用户提供打包资源 针对多种用途为用户群组提供不同资源
配置 基于镜像 基于模板
成本 资本支出(CAPEX)高、运营支出 (OPEX)低 私有云:CAPEX 高、OPEX 低 公共云:CAPEX 低、 OPEX 高
可扩展 性 纵向扩展 横向扩展
使用场 景 少量服务器的环境 众多服务器的大环境
  • 1.2.7.1:云计算分类

    公有云:比如阿里云/aws、azure、金山云、腾讯云等都属于公有云,每个人都可以付费使用,不需要自己关心底层硬件,但是数据安全需要考利。
    私有云:在自己公司内部或IDC自建Openstack、VMware等环境
    混合云:既要使用公有云,又要使用私有云,即自己的私有云的部分业务和公有云有交接,这部分称为混合云

    1.2.7.2:云计算分层

    传统IDC:直接在物理机运行服务,不能快速对业务横向扩容。
    IaaS:基础设施服务,Infrastructure as a service #自检机房(openstack)、阿里云ECS。 PaaS:平台服务,Platform-as-a-service #公有云上的Redis、RDS、Docker等服务。 SaaS:软件服务,Software-as-a-service #企业邮箱、OA系统等可以通过浏览器直接访问。

二:虚拟化技术之KVM

KVM 是Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中,KVM目前已成为学术界的主流 VMM (virtual machine monitor,虚拟机监视器,也称为hypervisor)之一

KVM (for Kernel-based Virtual Machine) is a full virtualization solution for Linux on x86 hardware 
containing virtualization extensions (Intel VT or AMD-V). It consists of a loadable kernel module, 
kvm.ko, that provides the core virtualization infrastructure and a processor specific module, 
kvm-intel.ko or kvm-amd.ko.

KVM(基于内核的虚拟机)是针对Linux的完全虚拟化解决方案,它在x86硬件上包含虚拟化扩展(Intel VT或AMDV)。 它由提供核心虚拟化基础架构的可加载内核模块kvm.ko和处理器特定模块kvm-intel.ko或kvm-amd.ko组成。
#kvm定义
https://www.redhat.com/zh/topics/virtualization/what-is-KVM
#红帽基于KVM对虚拟机的最大资源支持及限制
https://access.redhat.com/articles/rhel-kvm-limits
#红帽虚拟化入门指南
https://access.redhat.com/documentation/zhcn/red_hat_enterprise_linux/7/html/virtualization_getting_started_guide/index
#KVM 官网
https://www.linux-kvm.org/page/Virtio
#libvirt
https://libvirt.org/

RedHat创建虚拟机数量限制

image.png

KVM结构图

[图片上传失败...(image-c81f20-1592055751522)]

目前在各大公有云厂商新购买的虚拟机基本运行在KVM环境下,就连早期一直使用Xen的AWS也在2017年开始逐渐转换到KVM环境,以下是AWS基于KVM技术提供的最新示例部分性能

Instance Name vCPUs RAM EBS Bandwidth Network Bandwidth
c5.large 2 4 GiB Up to 2.25 Gbps Up to 10 Gbps
c5.xlarge 4 8 GiB Up to 2.25 Gbps Up to 10 Gbps
c5.2xlarge 8 16 GiB Up to 2.25 Gbps Up to 10 Gbps
c5.4xlarge 16 32 GiB 2.25 Gbps Up to 10 Gbps
c5.9xlarge 36 72 GiB 4.5 Gbps 10 Gbps
c5.18xlarge 72 144 GiB 9 Gbps 25 Gbps

KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术),是基于硬件的完全虚拟化,而Xen早期则是基于软件模拟的半虚拟化,新版本则是支持基于硬件支持的完全虚拟化,但Xen本身有自己的进程调度器,存储管理模块等,所以代码较为庞大,广为流传的商业系统虚拟化软件VMware ESXI系列是Full-Virtualization,IBM文档:http://www.ibm.com/developerworks/cn/linux/l-using-kvm/

Guest:客户机系统,包括CPU(vCPU)、内存、驱动(Console、网卡、I/O 设备驱动等),被KVM置于一种受限制的CPU模式下运行。

KVM:运行在内核空间,提供 CPU 和内存的虚级化,以及客户机的 I/O拦截,Guest的部分I/O被KVM拦截后,交给QEMU处理。

Qemu:纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备,我们最熟悉的就是能够模拟一台能够独立运行操作系统的虚拟机,虚拟机认为自己和硬件打交道,但其实是和 Qemu 模拟出来的硬件打交道,Qemu 将这些指令转译给真正的硬件,正因为 Qemu 是纯软件实现的,所有的指令都要经 Qemu 过一手,性能非常低,所以,在生产环境中,大多数的做法都是配合 KVM 来完成虚拟化工作,KVM完成复杂及要求比较高的设备虚拟化,而Qemu完成像鼠标、键盘等设备的虚拟化
2.1:宿主机环境准备

KVM需要宿主机CPU必须支持虚拟化功能,因此如果是在vmware workstation上使用虚拟机做宿主机,那么必须要在虚拟机配置界面的处理器选项中开启虚拟机化功能

  • 2.1.1:CPU开启虚拟化

    image.png

    2.1.2:CPU指令集

    2.1.2.1:X86/x86_64 架构

    主导桌面与服务器芯片市场

    1968年Intel成立,x86架构就是Intel研发的,并且在后来授权给AMD使用。
    2003年AMD推出64位处理器,并授权给Intel使用。
    

    2.1.2.2:ARM 架构

    手机:华为 小米 三星 苹果
    pad:华为 小米 三星 苹果
    机顶盒:各电视机顶盒
    华为泰山服务器-鲲鹏系列CPU
    

    2.1.2.3:POWER 架构

    由IBM设计,POWER系列微处理器在不少IBM服务器、超级计算机、小型计算机及工作站中,广泛使用
    

    2.1.2.4:RISC-V 架构

    https://riscv.org/
    当前CPU的两大架构是CISC(复杂指令集)和RISC(精简指令集),x86是CISC的代表架构,占领了95%以上的桌
    面计算机和服务器市场。Arm作为RISC的一种,在智能手机、可穿戴设备等移动处理器市场占领主要地位,针对物
    联网、5G、AI新兴领域的应用,RISC-V和MIPS两大精简指令集架构再次登上历史舞台

    RISC-V:1980年加州大学伯克利分校(Berkeley)的David Patterson(大卫·帕特森)教授主导了Berkeley
    RISC项目并设计了其第一代的处理器RISC I,2010年,Krste Asanovic(克斯特·阿萨诺维奇)教授带领的团队大约
    花了四年时间,设计和开发了一套完整的新的指令集,这个新的指令集叫做RISC-V,这是Berkeley从RISC I开始设计
    的第五代指令集架构,V还代表了变化(variation)和向量(vectors),RISC-V架构使用BSD开源协议给予使用者很
    大自由,允许使用者修改和重新发布开源代码,也允许基于开源代码开发商业软件发布和销售。
    
    MIPS是一种RISC处理器,它最早是在80年代初期由斯坦福(Stanford)大学John L. Hennessy(约翰·亨利斯)教授
    领导的研究小组研制出来的,MIPS是出现最早的商业RISC架构芯片之一,2018年3月21日美国计算机协会(ACM)宣布
    将2017年度的图灵奖颁给了芯片界的两位大师:曾任斯坦福大学校长的John L. Hennessy和曾任加州大学伯克利分
    校教授的David A. Patterson。
    
    MIPS计算机系统公司创建于1984年,最初的目的是将斯坦福大学MIPS CPU小组的研究成功商业化,商用MIPS CPU
    增强了内存管理硬件,并于1985年末作为R2000面世,其后又相继推出了R3000、R4000、R10000等多款处理器。
    

    2.1.2.5:RISC-V 架构参与企业

    • 2.1.2.5.1:阿里巴巴集团

      2.1.2.5.2:华米科技等

      2.1.2.5.4:阿里云玄铁RISC-V

    2.1.2.5:验证开启虚拟化

    [root@s1 ~]# grep -E "vmx|svm" /proc/cpuinfo | wc -l
    2
    
    2.1.3:安装KVM工具包

    Ubuntu 18.04:
    https://ubuntu.com/server/docs/virtualization-libvirt

    apt install qemu-kvm virt-manager libvirt-daemon-system
    kvm-ok #验证是否支持kvm
    INFO: /dev/kvm exists
    KVM acceleration can be used
    

    CentOS 7.X

    yum install qemu-kvm qemu-kvm-tools libvirt libvirt-client virt-manager virt-install
    systemctl start libvirtd
    systemctl enable libvirtd
    
    ifconfig virbr0 #验证是否生成NAT网卡virbr0
    virbr0: flags=4099 mtu 1500
    inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
    ether 52:54:00:89:c5:75 txqueuelen 1000 (Ethernet)
    RX packets 0 bytes 0 (0.0 B)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 0 bytes 0 (0.0 B)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    
    grep "192.168.122.1" /etc/libvirt/ -R
    /etc/libvirt/qemu/networks/autostart/default.xml: 
    /etc/libvirt/qemu/networks/default.xml: 
    
2.2:创建NAT网络虚拟机

KVM管理工具

libvirt
使用最多的KVM虚拟化管理工具和应用程序接口,即通过libvirt调用KVM创建虚拟机,libvirt是KVM通用的访问API,其不但能管理KVM,还能管理VMware、Xen、Hyper-V、virtualBox等虚拟化方案。

virsh:
是一个常用的管理KVM虚拟化的命令行工具,常用语管理运行在单个宿主机上的虚拟机,virsh是一个使用C语言编写调用libvirt API的虚拟化管理命令行工具。

virt-manager:
virt-manager是一个虚拟化管理图形软件,其底层也是调用libvirt API来完成对虚拟机的操作,包括虚拟机的创建、删除、启动、停止以及一些简单的监控功能等。

openstack:
openstack是一个开源的虚拟化编排工具,常用于构建大规模的虚拟化环境,用语管理成千上万虚拟机的创建、启动、删除等整个生命周期。
2.2.1:创建磁盘
ll /var/lib/libvirt/images/ #默认保存虚拟机磁盘的路径
total 0

#创建一个格式为raw大小为10G的裸磁盘
qemu-img create -f raw /var/lib/libvirt/images/CentOS-7-x86_64.raw 10G
Formatting '/var/lib/libvirt/images/CentOS-7-x86_64.raw', fmt=raw size=10737418240

ll -h /var/lib/libvirt/images/CentOS-7-x86_64.raw
-rw-r--r-- 1 root root 10G Jun 15 2019 /var/lib/libvirt/images/CentOS-7-x86_64.raw

#创建一个格式为raw大小为10G的稀疏格式磁盘
qemu-img create -f qcow2 /var/lib/libvirt/images/centos.qcow2 10G
Formatting '/var/lib/libvirt/images/centos.qcow2', fmt=qcow2 size=10737418240
encryption=off cluster_size=65536 lazy_refcounts=off

ll -h /var/lib/libvirt/images/centos.qcow2
-rw-r--r-- 1 root root 193K Jun 14 16:36 /var/lib/libvirt/images/centos.qcow2
2.2.2:virsh-install命令使用帮助
# virt-install --help
usage: virt-install --name NAME --ram RAM STORAGE INSTALL [options]

使用指定安装介质新建虚拟机。
optional arguments:
-h, --help show this help message and exit
--version show program's version number and exit
--connect URI 使用 libvirt URI 连接到 hypervisor
通用选项:
-n NAME, --name NAME 客户端事件名称
--memory MEMORY 配置虚拟机内存分配。例如:
--memory 1024 (in MiB)
--memory 512,maxmemory=1024
--vcpus VCPUS 为虚拟机配置的 vcpus 数。例如:
--vcpus 5
--vcpus 5,maxcpus=10,cpuset=1-4,6,8
--vcpus sockets=2,cores=4,threads=2,
--cpu CPU CPU 型号及功能。例如:
--cpu coreduo,+x2apic
--cpu host
--metadata METADATA 配置虚拟机元数据。例如:
--metadata name=foo,title="My pretty title",uuid=...
--metadata description="My nice long description"
安装方法选项:
--cdrom CDROM 光驱安装介质
-l LOCATION, --location LOCATION
安装源(例如:nfs:host:/path、http://host/path
ftp://host/path)
--pxe 使用 PXE 协议从网络引导
--import 在磁盘映像中构建虚拟机
--livecd 将光驱介质视为 Live CD
-x EXTRA_ARGS, --extra-args EXTRA_ARGS
附加到使用 --location 引导的内核的参数
--initrd-inject INITRD_INJECT
使用 --location 为 initrd 的 root
添加给定文件--os-variant DISTRO_VARIANT
在其中安装 OS 变体的虚拟机,比如
'fedora18'、'rhel6'、'winxp' 等等。
--boot BOOT 配置虚拟机引导设置。例如:
--boot hd,cdrom,menu=on
--boot init=/sbin/init (for containers)
--idmap IDMAP 为 LXC 容器启用用户名称空间。例如:
--idmap uid_start=0,uid_target=1000,uid_count=10
设备选项:
--disk DISK 使用不同选项指定存储。例如:
--disk size=10 (new 10GiB image in default location)
--disk /my/existing/disk,cache=none
--disk device=cdrom,bus=scsi
--disk=?
-w NETWORK, --network NETWORK
配置虚拟机网络接口。例如:
--network bridge=mybr0
--network network=my_libvirt_virtual_net
--network network=mynet,model=virtio,mac=00:11...
--network none
--network help
--graphics GRAPHICS 配置虚拟机显示设置。例如:
--graphics vnc
--graphics spice,port=5901,tlsport=5902
--graphics none
--graphics vnc,password=foobar,port=5910,keymap=ja
--controller CONTROLLER
配置虚拟机控制程序设备。例如:
--controller type=usb,model=ich9-ehci1
--input INPUT 配置虚拟机输入设备。例如:
--input tablet
--input keyboard,bus=usb
--serial SERIAL 配置虚拟机串口设备
--parallel PARALLEL 配置虚拟机并口设备
--channel CHANNEL 配置虚拟机沟通频道
--console CONSOLE 配置虚拟机与主机之间的文本控制台连接
--hostdev HOSTDEV 将物理 USB/PCI/etc
主机设备配置为与虚拟机共享
--filesystem FILESYSTEM
将主机目录传递给虚拟机。例如:
--filesystem /my/source/dir,/dir/in/guest
--filesystem template_name,/,type=template
--sound [SOUND] 配置虚拟机声音设备模拟
--watchdog WATCHDOG 配置虚拟机 watchdog 设备
--video VIDEO 配置虚拟机视频硬件。
--smartcard SMARTCARD
配置虚拟机智能卡设备。例如:
--smartcard mode=passthrough
--redirdev REDIRDEV 配置虚拟机重定向设备。例如:
--redirdev usb,type=tcp,server=192.168.1.1:4000
--memballoon MEMBALLOON
配置虚拟机 memballoon 设备。例如:--memballoon model=virtio
--tpm TPM 配置虚拟机 TPM 设备。例如:
--tpm /dev/tpm
--rng RNG 配置虚拟机 RNG 设备。例如:
--rng /dev/random
--panic PANIC 配置虚拟机 panic 设备。例如:
--panic default
虚拟机配置选项:
--security SECURITY 设定域安全驱动器配置。
--numatune NUMATUNE 为域进程调整 NUMA 策略。
--memtune MEMTUNE 为域进程调整内粗策略。
--blkiotune BLKIOTUNE
为域进程调整 blkio 策略。
--memorybacking MEMORYBACKING
为域进程设置内存后备策略。例如:
--memorybacking hugepages=on
--features FEATURES 设置域  XML。例如:
--features acpi=off
--features apic=on,eoi=on
--clock CLOCK 设置域  XML。例如:
--clock offset=localtime,rtc_tickpolicy=catchup
--pm PM 配置 VM 电源管理功能
--events EVENTS 配置 VM 生命周期管理策略
--resource RESOURCE 配置 VM 资源分区(cgroups)
虚拟化平台选项:
-v, --hvm 客户端应该是一个全虚拟客户端
-p, --paravirt 这个客户端一个是一个半虚拟客户端
--container 这台虚拟机需要一个容器客户端
--virt-type HV_TYPE 要使用的管理程序名称(kvm、qemu、xen
等等)
--arch ARCH 模拟的 CPU 构架
--machine MACHINE 要模拟的机器类型
其它选项:
--autostart 引导主机时自动启动域。
--wait WAIT 等待安装完成的分钟数。
--noautoconsole 不要自动尝试连接到客户端控制台
--noreboot 完成安装后不要引导虚拟机。
--print-xml [XMLONLY]
输出所生成域 XML,而不是创建虚拟机。
--dry-run 完成安装步骤,但不要创建设备或者定义
虚拟机。
--check CHECK 启用或禁用验证检查。例如:
--check path_in_use=off
--check all=off
-q, --quiet 禁止无错误输出
-d, --debug 输入故障排除信息
使用 '--option=?' 或者 '--option help' 查看可用子选项
有关示例及完整选项语法,请查看 man page。

#小笔记:
virt-install --virt-type kvm --name centos7 --ram 1024 --vcpus 2 --cdrom=/usr/local/src/Centos7.iso --disk path=/var/lib/libvirt/images/centos.qcow2 --network network=default --graphicsvnc,listen=0.0.0.0 --noautoconsole --autostart
2.2.3:创建NAT网络虚拟机:

创建一台虚拟机,并使用默认的NAT网络,可以使虚拟机连接外网

  • 2.2.3.1:上传镜像并安装Centos 7.X虚拟机

    ll /usr/local/src/CentOS-7-x86_64-Minimal-1908.iso #提前上传安装镜像
    -rw-r--r-- 1 root root 987758592 Nov 20 12:03 /usr/local/src/CentOS-7-x86_64-Minimal-
    1908.iso
    qemu-img create -f qcow2 /var/lib/libvirt/images/centos.qcow2 10G #创建qcow2格式磁盘
    
    # 创建默认网络虚拟机
    virt-install --virt-type kvm --name centos7 --ram 1024 --vcpus 2 --cdrom=/usr/local/src/CentOS-7-x86_64-Minimal-1908.iso --disk path=/var/lib/libvirt/images/centos.qcow2 --network network=default --graphicsvnc,listen=0.0.0.0 --noautoconsole
    

    2.2.3.2:通过VNC客户端连并安装虚拟机

    vnc连接安装:172.18.200.101:5900

    image.png

    2.2.3.3:开始安装

    image.png
    image.png

    [图片上传失败...(image-dc6dde-1592055751522)]

    vmlinuz initrd=initrd.img ... #追加 net.ifnames=0 biosdevname=0
    
    [root@s1 ~]# virsh list --all #第一次需要手动开启虚拟机
    Id Name State
    ----------------------------------------------------
    - centos7 shut off
    [root@s1 ~]# virsh start centos7
    Domain centos7 started
    

    2.2.3.4:登录到虚拟机

    image.png

    2.2.3.5:通过virt-manager管理虚拟机

    [root@s1 ~]# virt-manager
    
    image.png

    2.2.3.6:虚拟机查看详情

    image.png

    2.2.3.7:配置虚拟机网卡

    image.png

    2.2.3.8:验证IP地址

    安装net-tools命令,并查看本机的当前IP地址是多少,目前自动获取到的IP地址是NAT分配的192.168.122.x地址段,此ip地址可以从出外网访问但是无法从外网主从访问到此虚拟机上的相关服务

    image.png

    2.2.3.9:在宿主机验证虚拟机进程

    image.png
2.2.4:创建bridge网络虚拟机

桥接网络可以让运行在宿主机上的虚拟机使用和宿主机同网段IP,并且可以从外部直接访问到虚拟机,目前企业中大部分场景都使用桥接网络。

2.2.4.1:创建br0桥接网卡

Ubuntu 18.04创建桥接网卡

cat /etc/netplan/01-netcfg.yaml
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no

  bridges:
    br0:
      dhcp4: no
      dhcp6: no
      addresses: [172.18.0.20/16]
      gateway4: 172.18.0.1
      nameservers:
        addresses: [223.6.6.6]
      interfaces:
        - eth0

netplan apply     #刷新网卡信息

Centos 7.X创建桥接网卡

pwd
/etc/sysconfig/network-scripts

vim ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=172.18.200.101
NETMASK=255.255.0.0
GATEWAY=172.18.0.1
DNS1=172.18.0.1

vim ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0

systemctl restart network

2.2.4.2:上传镜像并安装虚拟机

ll /usr/local/src/CentOS-7-x86_64-Minimal-1908.iso
-rw-r--r-- 1 libvirt-qemu kvm 987758592 Nov 20 12:03 /usr/local/src/CentOS-7-x86_64-
Minimal-1908.iso

#创建系统磁盘:
qemu-img create -f qcow2 /var/lib/libvirt/images/centos7-bridge.qcow2 10G
Formatting '/var/lib/libvirt/images/centos7-bridge.qcow2', fmt=qcow2 size=10737418240
cluster_size=65536 lazy_refcounts=off refcount_bi
ts=16

#创建基于桥接网络的虚拟机
virt-install --virt-type kvm --name centos7-bridge --ram 1024 --vcpus 2 --cdrom=/usr/local/src/CentOS-7-x86_64-Minimal-1908.iso --disk path=/var/lib/libvirt/images/centos7-bridge.qcow2 --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole

2.2.4.3:验证虚拟机桥接网络通信

ping www.baidu.com

2.2.4.4:从外部ssh虚拟机

ssh 172.18.144.43
[root@localhost ~]# yum install pciutils #查看PCI设备
[root@localhost ~]# lspci
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
00:02.0 VGA compatible controller: Cirrus Logic GD 5446
00:03.0 Ethernet controller: Red Hat, Inc. Virtio network device
00:04.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #1
(rev 03)
00:04.1 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #2
(rev 03)
00:04.2 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #3
(rev 03)
00:04.7 USB controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #1
(rev 03)
00:05.0 Communication controller: Red Hat, Inc. Virtio console #virtio为半虚拟化驱动
00:06.0 SCSI storage controller: Red Hat, Inc. Virtio block device
00:07.0 Unclassified device [00ff]: Red Hat, Inc. Virtio memory balloon
00:08.0 Unclassified device [00ff]: Red Hat, Inc. Virtio RNG
小笔记:虚拟机复制
#宿主机A
scp /var/lib/libvirt/images/centos7-bridge.qcow2 [email protected]:/var/lib/libvirt/images/centos7-bridge-template.qcow2

#宿主机B
cd /var/lib/libvirt/images
cp centos7-bridge-template.qcow2 centos7-bridge-template-web1.qcow2
virt-manager    #图形工具
new vm --> import existing disk image
#命令行
virt-install --virt-type kvm --name centos7-web1 --ram 1024 --vcpus 2 --cdrom=/usr/local/src/CentOS-7-x86_64-Minimal-1908.iso --disk path=/var/lib/libvirt/images/centos7-bridge-template-web1.qcow2 --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole --boot hd
小笔记:配置2块网卡
# eth0:桥接 eth1:仅主机

#ubuntu18
cat /etc/netplan/01-netcfg.yaml
  network:
    version: 2
    renderer: networkd
    ethernets:
      eth0:
        dhcp4: no
        dhcp6: no
      eth1:
        dhcp4: no
        dhcp6: no

    bridges:
      br0:
        dhcp4: no
        dhcp6: no
        addresses: [172.20.0.101/16]
        gateway4: 172.20.0.1
        nameservers:
          addresses: [223.6.6.6,223.5.5.5]
        interfaces:
          - eth0
      br1:
        dhcp4: no
        dhcp6: no
        addresses: [10.20.0.101/16]
        interfaces:
          - eth1
 
 netplan apply
 
#centos7
cd /etc/sysconfig/network-script
vim ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0

vim ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=172.20.0.101
NETMASK=255.255.0.0

vim ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=static
NAME=eth1
DEVICE=eth1
ONBOOT=yes
BRIDGE=br1

vim ifcfg-br1
TYPE=Bridge
BOOTPROTO=static
NAME=br1
DEVICE=br1
ONBOOT=yes
IPADDR=10.20.0.101
NETMASK=255.255.0.0

systemctl restart netowrk
2.2.5:安装Windows Server虚拟机
  • virtio 是一种 I/O 半虚拟化解决方案,是一套通用 I/O 设备虚拟化的程序,是对半虚拟化 Hypervisor 中的一组通用I/O 设备的抽象,提供了一套上层应用与各 Hypervisor 虚拟化设备(KVM,Xen,VMware等)之间的通信框架和编程接口,减少跨平台所带来的兼容性问题,大大提高驱动程序开发效率,windows 系统需要单独安装virtio驱动,linux系统自带virtio驱动。

  • Virtio 使用 virtqueue 来实现 I/O 机制,每个 virtqueue 就是一个承载大量数据的队列,具体使用多少个队列
    取决于需求,例如,virtio网络驱动程序(virtio-net)使用两个队列(一个用于接受,另一个用于发送),而
    virtio块驱动程序(virtio-blk)仅使用一个队列。

  • 实现IO虚拟化主要有三种方式:全虚拟化、半虚拟化和透传,全虚拟化Guest OS不会感知到自己是虚拟机,也无需修改Guest OS,但是它的效率比较低,半虚拟化Guest OS知道自己是虚拟机,通过rontend/Backend驱动模拟实现IO虚拟化,透传就是直接分配物理设备给VM用,但是需要解决单个硬件在多个虚拟机共享使用的问题

    # 创建windows 虚拟机:
    # virtio下载地址:
    https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/
    qemu-img create -f qcow2 /var/lib/libvirt/images/Windows-2008_r2-x86_64.qcow2 200G
    
    #创建Windows磁盘
    virt-install --virt-type kvm --name Win_2008_r2-x86_64 --ram 3072 --vcpus=2 --stype=windows --cdrom=/usr/local/src/windows_server_2008_r2.iso --disk path=/var/lib/libvirt/images/Windows-2008_r2-x86_64.qcow2,format=qcow2,bus=virtio --disk path=/usr/local/src/virtio-win-0.1.141_amd64.vfd,device=floppy --network bridge=br0,model=virtio --graphics vnc,listen=0.0.0.0 --noautoconsole
    

    2.2.5.1:安装windows server 2008

    #验证镜像
    tree /usr/local/src/
    /usr/local/src/
    ├── CentOS-7-x86_64-Minimal-1908.iso
    ├── cn_windows_server_2008_r2.iso
    └──virtio-win-0.1.141_amd64.vfd
    0 directories, 3 files
    
    #创建磁盘
    qemu-img create -f qcow2 /var/lib/libvirt/images/Windows-2008_r2-x86_64.qcow2 200G
    Formatting '/var/lib/libvirt/images/Windows-2008_r2-x86_64.qcow2', fmt=qcow2
    size=214748364800 cluster_size=65536 lazy_refcounts=off refcount_bits=16
    
    #开始安装
    virt-install --virt-type kvm --name Win_2008_r2-x86_64 --ram 1024 --vcpus=2 --ostype=windows --cdrom=/usr/local/src/cn_windows_server_2008_r2.iso --disk path=/var/lib/libvirt/images/Windows-2008_r2-x86_64.qcow2,format=qcow2,bus=virtio --disk path=/usr/local/src/virtio-win-0.1.141_amd64.vfd,device=floppy --network bridge=br0,model=virtio --graphics vnc,listen=0.0.0.0 --noautoconsole
    
    Starting install...
    Domain installation still in progress. You can reconnect to
    the console to complete the installation process.
    
2.2.6:安装Windows win10虚拟机
virt-install --virt-type kvm --name Win10 --ram 1024 --vcpus=2 --ostype=windows --cdrom=/usr/local/src/cn_windows_10_consumer_editions_version_1909_x64_dvd_76365bf8.iso --disk path=/var/lib/libvirt/images/Win10.qcow2,format=qcow2,bus=virtio --disk path=/usr/local/src/virtio-win-0.1.173_amd64.vfd,device=floppy --network ridge=br0,model=virtio --graphics vnc,listen=0.0.0.0 --noautoconsole
2.2.7:虚拟机管理命令virsh
virsh list #列出当前开机的
virsh list --inactive #列出关闭的虚拟机
virsh list --all #列出所有
virsh shutdown CentOS-7-x86_64 #正常关机
virsh start CentOS-7-x86_64 #正常开机
virsh destroy centos7 #强制停止/关机
virsh undefine Win_2008_r2-x86_64 #强制删除
virsh autostart centos7 #设置当前虚拟机开机自启动

2.2.8:快速创建虚拟机

通过copy虚拟机磁盘文件,可以快速创建虚拟机

[root@s2 ~]# cd /var/lib/libvirt/images/
cp centos1.qcow2 centos1-bak.qcow2
cp centos1-bak.qcow2 centos2.qcow2
virt-install --virt-type kvm \
--name centos2 \
--ram 1024 \
--vcpus 2 \
--cdrom=/usr/local/src/CentOS-7-x86_64-Minimal-1908.iso \
--disk path=/var/lib/libvirt/images/centos2.qcow2 \
--network bridge=br0 \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole #虚拟机不要开始安装过程,即虚拟机启动后立即强制关系重新启动即可进入到虚拟机系统

2.2.9:调整虚拟机配置:
日常运维主要涉及调整内存大小、vCPU数量,网卡和磁盘配置等操作。

小笔记:迁移虚拟机
#环境:2台机器:kvm,nfs-server

#nfs-server
yum install nfs-utils
vim /etc/exports
/data/kvmdata 192.168.37.0/24(rw no_root_squash)
mkdir /data/kvmdata
systecmtl start nfs-server

#kvm
yum install qemu-kvm qemu-kvm-tools libvirt libvirt-client virt-manager virt-install
systemctl start libvirt
showmount -e 192.168.37.27
mv /var/lib/libvirt/images/* /opt       #先备份原有磁盘文件,没有的话不用执行
virt-manager    #图形挂载nfs-server
    edit-->connection details-->storage-->add(+号)-->name:kvmdata,type:netfs-->forward
    target path:/var/lib/libvirt/images
    host name:192.168.37.27
    source path:/data/kvmdata
    finish
mv /opt/* /var/lib/libvirt/images
#yum install openssh-askpass        #迁移使用

#迁移
virt-manager
    file-->add connection:
    hypervisor:qemu/kvm
    connect to remote host
    method:ssh
    username:root
    hostname:192.168.37.17
    autoconnect
#虚拟机上右键-->migrate
    new host:迁移到的目标服务器
    mode:direct
    address:192.168.37.7
    port:49152
    advanced options
    allow unsafe

三:kvm实战案例

实现一个内外网隔离的web环境

image.png

你可能感兴趣的:(36-虚拟化)