41-KVM虚拟化基础和KVM管理工具使用

时间:2022-12-30 11:15:28

传统的物理机部署方案

  • IDC选择,一般可以租用第三方搭建好的服务器机房。如:联通,电信....等
  • 网络和存储规划
  • 服务器选型及采购
  • 服务器系统选择、系统安装、上架、配置网络
  • 应用规划及部署
  • 域名选择及注册,DNS配置名称解析
  • 测试外网访问

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

  • 服务器和网络设备资源利用率过低,并且无法共享,导致资源浪费。据统计大部分数据中心中的服务器和网络设备的利用率仅在24%~30%之间,有的CPU利用率、硬盘利用率都在10%以下
  • 资源分配后进行调整困难。资源分配不合理也是传统网络架构存在的问题,因为资源不能动态调配,毕竟是物理上对资源的规划,不能随意添加或删除。
  • 难以实现自动化。初始化成本高,服务器迁移和升级很繁琐,无法实现自动化
  • 成本高昂* 这是最根本的问题 - 集群环境需要大量的服务器主机,硬件投入和后期维护管理成本巨大

虚拟化技术概述

定义:

  • 虚拟化(Virtualization)是一种资源分配和管理技术,是将计算机的各种实体资源,比如CPU、内存、磁盘空间、网络适配器等,进行抽象转换后虚拟的设备,可以实现灵活地分割、组合为一个或多个计算机配置环境,并还支持重新分割、重新组合,以达到最大化合理利用物理资源的目的。
参考资料: https://www.vmware.com/cn/solutions/virtualization.html

优势:

  • 虚拟化可以提高 IT 敏捷性、灵活性和可扩展性,同时大幅节约成本。更高的工作负载移动性、更高的性能和资源可用性、自动化运维 这些都是虚拟化的优势,虚拟化技术可以使 IT 部门更轻松地进行管理以及降低拥有成本和运维成本。

虚拟化类型

  • 服务器虚拟化
服务器虚拟化支持在单个物理服务器上运行多个操作系统,每个操作系统作为虚拟机独立运行。
  • 网络虚拟化
通过软件定义网络(Software Defined Network,SDN),即网络的创建不再依赖于物理设备,如公有云厂商支持用户自己通过配置界面创建新的网络,在 KVM、docker、kubernetes、openstack等虚拟化技术中都使用到了网络虚拟化。
  • 桌面虚拟化
将桌面部署为托管的服务,使 IT 组织能够更快地响应不断变化的工作场所需求和新出现的机会。还可以将虚拟化桌面和应用快速、轻松地交付给分支机构、外包和远程员工以及使用 iPad 和 Android 平板电脑的移动员工。
*Citrix 思杰公司在云计算虚拟化、虚拟桌面和远程接入技术领域的处于优势地位
  • 应用虚拟化
将软件应用通过网络实现虚拟化,比如 office 365,钉钉,企业微信
  • 存储虚拟化
将存储用软件虚拟化实现, 如 SAN/NAS(NFS/Samba)/GlusterFS/ceph等
  • 库虚拟化
在Linux上使用 wine来运行Windows 程序,在Mac系统使用CrossOver来运行Windows程序
  • 容器虚技术
当前比较火的虚拟化技术,典型代表: Docker、Podman、Linux Container(LXC)、Pouch

虚拟机

定义:

  • 虚拟计算机称为“虚拟机”(VM,Virtual Machine),它是一种严密隔离且内含操作系统和应用的软件容器。
  • 每个虚拟机都是完全独立的。
  • 名为“hypervisor”的精简软件层可将虚拟机与主机分离开来,并根据需要为每个虚拟机动态分配计算资源。

特性:

  • 分区。可在一台物理机上运行多个操作系统
  • 隔离。可在硬件级别进行故障和安全隔离。
  • 封装。可将虚拟机的完整状态保存到文件中。
  • 独立于硬件。可将任意虚拟机调配或迁移到任意物理服务器上

Hypervisor类型:

  • Hypervisor是一种运行在基础物理服务器和操作系统之间的中间软件层,其可以允许多个操作系统和应用共享底层的内存、CPU、磁盘等物理硬件,也可叫做VMM( virtual machine monitor),即虚拟机监视器。
  • Hypervisor是所有虚拟化技术的核心,非中断地支持多工作负载迁移的能力是Hypervisor的基本功能,当服务器启动并执行Hypervisor时,它会给每一台虚拟机分配适量的内存、CPU、网络和磁盘,并加载所有虚拟机的客户操作系统。
  • Hypervisor 允许多种操作系统在相同的物理系统中运行
  • Hypervisor 控制硬件并向来宾操作系统提供访问底层硬件的途径
  • Hypervisor 向来宾操作系统提供虚拟化的硬件

x86CPU保护环

41-KVM虚拟化基础和KVM管理工具使用

CPU为了保证程序代码执行的安全性、多用户的独立性、保护OS的正常运行,提出了CPU执行状态的概念。这样能够限制不同程序之间的访问能力,避免一个程序获取另一个程序的内存数据造成数据混乱,同时也避免了程序错误的操作物理硬件**。一般CPU都会划分为用户态 和内核态 ,x86的CPU架构更是细分为了Ring3~0四种状态**。

41-KVM虚拟化基础和KVM管理工具使用


Ring3 用户态(User Mode):运行在用户态的程序代码需要受到CPU的检查,用户态程序代码只能访问内存页表项中规定能被用户态程序代码访问的页面虚拟地址(受限的内存访问),而且还只能访问任务描述符TSS中的I/O Permission Bitmap中规定能被用户态程序代码访问的端口。甚至不能直接访问外围硬件设备、不能抢占CPU。所有的应用程序都运行在用户态上。当运行在用户态的Application需要调用只能被核心态代码直接访问的硬件设备时,CPU会通过特别的接口去调用核心态的代码,以此来实现Application对硬件设备的调用。如果用户态的Application直接调用硬件设备时,就会被Host OS捕捉到并触发异常,弹出警告窗口。

Ring0 核心态(Kernel Mode):是Host OS Kernel运行的模式,运行在核心态的代码可以无限制的对系统内存、设备驱动程序、网卡接口、显卡接口等外围硬件设备进行访问。只有Host OS能够无限制的访问磁盘、键盘等外围硬件设备的数据,但是首先需要在Host OS上安装驱动程序

Hypervisor 分类

41-KVM虚拟化基础和KVM管理工具使用

类型 I : 裸金属型

直接运行到物理机的Hypervisor上,这种架构搭建的虚拟化环境称为裸机虚拟化环境(Bare-Metal Hardware)
例如:
KVM
XEN --> 这个需要修改内核级别的参数后才能支持虚拟化,比较老旧,仍然被使用
vmware esxi
rhev hypervisor
Hyper-v Server

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

类型 II : 宿主型

即需要运行在具有虚拟化功能的操作系统上的Hypervisor,构建的是主机虚拟化环境(Hosted Virtualization)
例如:
vmware workstation
Microsoft Hyper-V
VirtualBox
paralles desktop #Mac系统最强虚拟机技术

虚拟化技术分类

  • 模拟器/软件仿真
比如说安卓模拟器,在win系统上安装其他系统的模拟器虚拟出运行环境
  • 全虚拟机化 full virtualization / 本地虚拟化 native
    不需要对GuestOS操作系统软件的源代码做任何的修改,就可以运行在这样的VMM中
在全虚拟化的虚拟平台中,GuestOS并不知道自己是一台虚拟机,它会认为自己就是运行在计算机物理硬件设备上的HostOS。全虚拟化的GuestOS具有完全的物理机特性。因为全虚拟化的VMM会将一个OS所能够操作的CPU、内存、外设等物理设备逻辑抽象成为虚拟CPU、虚拟内存、虚拟外设等虚拟设备后,再交由GuestOS来操作使用。这样的GuestOS会将底层硬件平台视为自己所有的,但是实际上,这些都是VMM为GuestOS制造了这种假象。全虚拟化/本地虚拟化不做CPU和内存模拟,只对CPU和内存做相应的分配等操作

全虚拟化又分为:软件辅助的全虚拟化 & 硬件辅助的全虚拟化

  • 软件辅助的全虚拟化

41-KVM虚拟化基础和KVM管理工具使用


代表技术: Vmware Workstation,QEMU,Virtual PC
软件辅助虚拟化能够成功的将所有在GuestOS中执行的系统内核特权指令进行捕获、翻译,使之成为只能对GuestOS生效的虚拟特权指令。
之所以需要这么做的前提是因为CPU并不能准确的去判断一个特权指令到底是由GuestOS发出的还是由HostOS发出的,这样也就无法针对一个正确的OS去将这一个特权指令执行。
*由于全虚拟化VMM会频繁的捕获这些核心态的和敏感的指令,将这些指令进行转换之后,再交给CPU执行。所以经过了转换,导致其效率低,但全虚拟化VMM应用程序的好处在于其不需要对GuestOS的核心源码做修改,所以全虚拟化的VMM可以安装绝大部分的OS(暂时来说只有已Linux、open soralis、BSD等几种OS开源了内核代码)。
直到后来CPU厂商们发布了能够判断特权指令归属的标准x86 CPU之后,迎来了硬件辅助全虚拟化。
  • 硬件辅助的全虚拟化 HVM(Hardware Virtual Machine) - 现今虚拟化技术主流

41-KVM虚拟化基础和KVM管理工具使用


虚拟化CPU形成了新的CPU执行状态 Non-Root Mode 和 Root Mode .GuestOS运行在Non-Root Mode的Ring 0核心态中,这意味着GuestOS能够直接执行特权指令,而不再需要特权解除和陷入模拟机制。并且在硬件层上面紧接的就是虚拟化层的VMM,而不需要HostOS。这是因为在硬件辅助全虚拟化的VMM会以一种更具协作性的方式来实现虚拟化 —— 将虚拟化模块加载到HostOS的内核中,例如:KVM,KVM通过在HostOS内核中加载KVM Kernel Module来将HostOS转换成为一个VMM。所以此时VMM可以看作是HostOS,反之亦然。
硬件辅助全虚拟化主要使用了支持虚拟化功能的CPU进行支撑,CPU可以明确的分辨出来自GuestOS的特权指令,并针对GuestOS进行特权操作,而不会影响到HostOS。硬件辅助全虚拟化需要物理硬件的支持,比如需要CPU必须支持并且打开虚拟化功能,例如Intel 的 Intel VT-X/EPT,AMD的AMD-V/RVI,以在CPU 层面支持虚拟化功能和内存虚拟化技术
例如:
全虚拟化软件(硬件辅助全虚拟化):
vmware esxi
Xen3.0
KVM
Microsoft Hyper-V
vmware workstation #https://www.vmware.com/cn/products/workstation-pro.html
VirtualBox
paralles desktop

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

  • 半虚拟化 para virtualization

41-KVM虚拟化基础和KVM管理工具使用


半虚拟化是需要GuestOS协助的虚拟化。因为在半虚拟化VMM中运行的GuestOS,都需要将其内核源码进行都进过了特别的修改。
通过修改客户操作系统代码,将原来在物理机上执行的一些特权指令(主要是修改GuestOS指令集中的敏感指令和核心态指令),修改成可以和VMM直接交互的方式,实现操作系统的定制化。这样,就不会有捕获异常、翻译和模拟的过程,性能损耗比较少。
*比如早期CentOS5时代,如果要在VMM上加装Linux,就需要定制内核后再安装,Xen、KVM-PowerPC等虚拟化软件就是做了特别内核级别的订制实现的虚拟化。对于Linux来说定制内核并不是一件容易的事情,而且换做其他不开源的操作系统比如Windows,要做半虚拟化就更麻烦,所以流行了一段时间就被硬件辅助虚拟化技术取代

KVM概述

  • KVM( Kernel-based Virtual Machine)是一个完整的虚拟化解决方案,适用于包含虚拟化扩展(Intel VT或AMD-V)的x86硬件上的Linux。目前也支持ARM等其它硬件平台. 它由可加载的内核模块kvm.ko组成,它提供核心虚拟化基础架构和处理器特定模块,kvm-intel.ko或kvm-amd.ko,KVM的用户空间组件包含在QEMU1.3后续版本中,KVM目前已成为学术界的主流 VMM (virtual machine monitor,虚拟机监视器,也称为 hypervisor)之一

红帽 kvm 介绍

https://www.redhat.com/zh/topics/virtualization/what-is-KVM

*2007年2月,KVM内核组件收录至Linux 2.6.20及后续版本中
[root@ubuntu2204 ~]#grep -i kvm /boot/config-5.15.0-52-generic
CONFIG_KVM_GUEST=y
CONFIG_HAVE_KVM=y
CONFIG_HAVE_KVM_IRQCHIP=y
CONFIG_HAVE_KVM_IRQFD=y
CONFIG_HAVE_KVM_IRQ_ROUTING=y
CONFIG_HAVE_KVM_EVENTFD=y
CONFIG_KVM_MMIO=y
CONFIG_KVM_ASYNC_PF=y
CONFIG_HAVE_KVM_MSI=y
CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y
CONFIG_KVM_VFIO=y
CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y
CONFIG_KVM_COMPAT=y
CONFIG_HAVE_KVM_IRQ_BYPASS=y
CONFIG_HAVE_KVM_NO_POLL=y
CONFIG_KVM_XFER_TO_GUEST_WORK=y
CONFIG_HAVE_KVM_PM_NOTIFIER=y
CONFIG_KVM=m --> 模块化
CONFIG_KVM_WERROR=y
CONFIG_KVM_INTEL=m
CONFIG_X86_SGX_KVM=y
CONFIG_KVM_AMD=m
CONFIG_KVM_AMD_SEV=y
CONFIG_KVM_XEN=y
# CONFIG_KVM_MMU_AUDIT is not set
CONFIG_PTP_1588_CLOCK_KVM=m
CONFIG_DRM_I915_GVT_KVMGT=m

41-KVM虚拟化基础和KVM管理工具使用

KVM架构

  • KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案。KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;虚拟机的每个虚拟CPU 被实现为一个常规的 Linux 进程。这使得 KVM 能够使用 Linux 内核的已有功能。但是,KVM 本身不执行任何硬件模拟,需要客户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的 I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序使用QEMU。

41-KVM虚拟化基础和KVM管理工具使用


#KVM模块工作逻辑: 初始化CPU硬件,打开虚拟机模式,负责CPU,内存,中断控制器,时钟. 由内核模块kvm_xxx.ko实现,工作于hypervisor,设备/dev/kvm,是一个字符设备,在用户空间可通过ioctl()系统调用来完成VM创建、启动,为VM分配内存、读写VCPU的寄存器、向VCPU注入中断、时钟等管理功能

#QEMU进程:工作于用户空间,主要用于实现模拟IO设备,如显卡,网卡,硬盘等, qemu-kvm进程:工作于用户空间,用于实现一个虚拟机实例

#Libvirt:提供统一API,守护进程libvirtd和相关工具,如:virsh,virt-manager等

KVM 模块载入后的系统的运行模式

41-KVM虚拟化基础和KVM管理工具使用


#内核模式:HostOS执行I/O类操作,或其它的特殊指令的操作;称作内核模式

#用户模式:GuestOS的I/O类操作

#来宾模式:GuestOS非I/O类操作,称作虚拟机的用户模式更贴切

KVM 集中管理与控制

KVM是运行在单机的系统,需要其它软件实现跨主机的统一的管理。常见的虚拟化管理平台如下:

http://www.Linux-kvm.org/page/Management_Tools

oVirt
功能强大,是Redhat虚拟化管理平台RHEV的开源版本。
http://www.ovirt.org/

WebVirtMgr
https://www.webvirtmgr.net
virt-manager的Web模式的替代品

OpenStack
主流的开源虚拟化管理平台

Proxmox virtualization environment
简称PVE,是一个开源免费的基于Linux的企业级虚拟化方案,功能不输专业收费的VMware。学习成本比OpenStack低

K8s
目前最主流的开源虚拟化管理平台

案例:宿主机环境准备

41-KVM虚拟化基础和KVM管理工具使用

超分设置内存

41-KVM虚拟化基础和KVM管理工具使用

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

41-KVM虚拟化基础和KVM管理工具使用

验证开启虚拟化

#Intel CPU 对应 vmx
#AMD CPU 对应 svm
[root@ubuntu2204 ~]#
[root@ubuntu2204 ~]#grep -Em 1 "vmx|svm" /proc/cpuinfo
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc cpuid tsc_known_freq pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 xsaves arat md_clear flush_l1d arch_capabilities

#查看CPU指令集
[root@ubuntu2204 ~]#lscpu
架构: x86_64
CPU 运行模式: 32-bit, 64-bit
Address sizes: 45 bits physical, 48 bits virtual
字节序: Little Endian
CPU: 8
在线 CPU 列表: 0-7
厂商 ID: GenuineIntel
型号名称: Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz
CPU 系列: 6
型号: 94
每个核的线程数: 1
每个座的核数: 1
座: 8
步进: 3
BogoMIPS: 5184.00
标记: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmo
n nopl xtopology tsc_reliable nonstop_tsc cpuid tsc_known_freq pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer
aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi ept vpid ept_ad fsgsbas
e tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 xsaves arat md_clear flush_l1d arch_capabilities
Virtualization features:
虚拟化: VT-x
超管理器厂商: VMware
虚拟化类型: 完全
Caches (sum of all):
L1d: 256 KiB (8 instances)
L1i: 256 KiB (8 instances)
L2: 2 MiB (8 instances)
L3: 48 MiB (8 instances)
NUMA:
NUMA 节点: 1
NUMA 节点0 CPU: 0-7
Vulnerabilities:
Itlb multihit: KVM: Mitigation: VMX disabled
L1tf: Mitigation; PTE Inversion; VMX flush not necessary, SMT disabled
Mds: Mitigation; Clear CPU buffers; SMT Host state unknown
Meltdown: Mitigation; PTI
Mmio stale data: Mitigation; Clear CPU buffers; SMT Host state unknown
Retbleed: Mitigation; IBRS
Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp
Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Spectre v2: Mitigation; IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS Not affected
Srbds: Unknown: Dependent on hypervisor status
Tsx async abort: Not affected

#查看kvm虚拟化模块是否被加载
[root@ubuntu2204 ~]#lsmod |grep kvm
kvm_intel 372736 0
kvm 1028096 1 kvm_intel

#查看是否支持kvm设备
[root@ubuntu2204 ~]#ll /dev/kvm
crw-rw---- 1 root kvm 10, 232 1229 18:36 /dev/kvm

#内核开启支持虚拟化后就可以安装虚拟化软件了

KVM工具包

  • KVM 相关工具包介绍
qemu-kvm: 为kvm提供底层仿真支持
libvirt-daemon: libvirtd守护进程,管理虚拟机
libvirt-client: 用户端软件,提供客户端管理命令
libvirt-daemon-driver-qemu: libvirtd连接qemu的驱动
libvirt: 使用最多的KVM虚拟化管理工具和应用程序接口,即通过libvirt调用KVM创建虚拟机,libvirt是KVM通用的访问API,其不但能管理KVM,还能管理VMware、Xen、Hyper-V、virtualBox等虚拟化方案。
virt-manager: 图形界面管理工具,其底层也是调用libvirt API来完成对虚拟机的操作,包括虚拟机的创建、删除、启动、停止以及一些简单的监控功能等。
virt-install: 虚拟机命令行安装工具
virsh: 命令行工具是基于 libvirt API 创建的命令行工具,它可以作为图形化的 virt-manager 应用的备选工具。virsh 命令可以被用来创建虚拟化任务管理脚本,如安装、启动和停止虚拟机
virt-viewer: 通过 VNC 和 SPICE 协议显示虚拟机器图形控制台的最小工具。该工具在其同名软件包中:virtviewer
cockpit: CentOS8 专门提供的基于Web的虚拟机管理界面
  • libvirt 结构图

41-KVM虚拟化基础和KVM管理工具使用


libvirt 程序包被设计为用来构建高级管理工具和应用程序,例如 virt-manager 与 virsh 命令行管理工具。libvirt 主要的功能是管理单节点主机,并提供 API 来列举、监测和使用管理节点上的可用资源,其中包括CPU、内存、储存、网络和非一致性内存访问(NUMA)分区。管理工具可以位于独立于主机的物理机上,并通过安全协议和主机进行交流

Ubuntu 安装 KVM

#验证CPU是否支持kvm
[root@ubuntu2204 ~]#apt -y install cpu-checker
[root@ubuntu2204 ~]#kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used

#查看当前网卡情况,安装kvm工具后会生成一个网桥
[root@ubuntu2204 ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:df:99:92 brd ff:ff:ff:ff:ff:ff
altname enp2s1
altname ens33
inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fedf:9992/64 scope link
valid_lft forever preferred_lft forever

[root@ubuntu2204 ~]#apt update;apt -y install qemu-kvm virt-manager libvirt-daemon-system
[root@ubuntu2204 ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:df:99:92 brd ff:ff:ff:ff:ff:ff
altname enp2s1
altname ens33
inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fedf:9992/64 scope link
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:ab:96:2d brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever

[root@ubuntu2204 ~]#apt -y install bridge-utils
[root@ubuntu2204 ~]#brctl show --> 能够读取到网桥为virbr0
bridge name bridge id STP enabled interfaces
virbr0 8000.525400ab962d yes

使用图形化工具 virt-manager - windows pc注意提前安装xmanager

[root@ubuntu2204 ~]#virt-manager 
#如果出现乱码,设置语言
[root@ubuntu2204 ~]#localectl set-locale LANG=en_US.UTF-8;exit

41-KVM虚拟化基础和KVM管理工具使用

准备安装系统的ISO相关文件

#将需要安装的系统的ISO文件上传到宿主机
[root@ubuntu2204 ~]#ll /data/isos/ -h
total 3.1G
drwxr-xr-x 2 root root 4.0K Dec 29 21:17 ./
drwxr-xr-x 3 root root 4.0K Dec 29 20:39 ../
-rw-r--r-- 1 root root 988M Dec 29 21:10 CentOS-7-x86_64-Minimal-2207-02.iso
-rw-r--r-- 1 root root 2.2G Dec 29 21:11 Rocky-x86_64-minimal.iso

创建虚拟机

41-KVM虚拟化基础和KVM管理工具使用

41-KVM虚拟化基础和KVM管理工具使用

41-KVM虚拟化基础和KVM管理工具使用

41-KVM虚拟化基础和KVM管理工具使用

41-KVM虚拟化基础和KVM管理工具使用

41-KVM虚拟化基础和KVM管理工具使用

41-KVM虚拟化基础和KVM管理工具使用

41-KVM虚拟化基础和KVM管理工具使用

41-KVM虚拟化基础和KVM管理工具使用

41-KVM虚拟化基础和KVM管理工具使用

之后按顺序点击安装即可

41-KVM虚拟化基础和KVM管理工具使用

#查看生成文件
[root@ubuntu2204 ~]#ll /var/lib/libvirt/images/centos7-mooreyxia.qcow2 -h
-rw------- 1 libvirt-qemu kvm 11G Dec 29 21:36 /var/lib/libvirt/images/centos7-mooreyxia.qcow2
[root@ubuntu2204 ~]#du -sh /var/lib/libvirt/images/centos7-mooreyxia.qcow2
1.8M /var/lib/libvirt/images/centos7-mooreyxia.qcow2
[root@ubuntu2204 ~]#df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 1.6G 1.4M 1.6G 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 97G 8.1G 84G 9% / --> 发现并没有消耗内存,说明生成的是虚拟空间分配
tmpfs 7.8G 0 7.8G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 7.8G 0 7.8G 0% /run/qemu
/dev/sda2 2.0G 127M 1.7G 7% /boot
tmpfs 1.6G 8.0K 1.6G 1% /run/user/0

#宿主机生成新的网卡
[root@ubuntu2204 ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:df:99:92 brd ff:ff:ff:ff:ff:ff
altname enp2s1
altname ens33
inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fedf:9992/64 scope link
valid_lft forever preferred_lft forever
3: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 52:54:00:ab:96:2d brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
5: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master virbr0 state UNKNOWN group default qlen 1000
link/ether fe:54:00:18:b7:d2 brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc54:ff:fe18:b7d2/64 scope link
valid_lft forever preferred_lft forever

#宿主机访问虚拟机
[root@ubuntu2204 ~]#ssh 192.168.122.23
The authenticity of host '192.168.122.23 (192.168.122.23)' can't be established.
ED25519 key fingerprint is SHA256:lFSTaxbTs6aeBfWND/5GF/Q8iHpa/kJmfCK1v6FcwTA.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.122.23' (ED25519) to the list of known hosts.
root@192.168.122.23's password:
Last login: Thu Dec 29 22:14:55 2022
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:18:b7:d2 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.23/24 brd 192.168.122.255 scope global noprefixroute dynamic eth0
valid_lft 3379sec preferred_lft 3379sec
inet6 fe80::4d93:c57d:e5c0:9d60/64 scope link noprefixroute
valid_lft forever preferred_lft forever

#此时虚拟机可以ping外网
[root@localhost ~]# ping www.51cto.com
PING czu3my54yx6eodmg.aliyunddos1017.com (203.107.44.140) 56(84) bytes of data.
64 bytes from 203.107.44.140 (203.107.44.140): icmp_seq=1 ttl=127 time=62.8 ms
64 bytes from 203.107.44.140 (203.107.44.140): icmp_seq=2 ttl=127 time=36.3 ms
64 bytes from 203.107.44.140 (203.107.44.140): icmp_seq=3 ttl=127 time=31.5 ms
^C
--- czu3my54yx6eodmg.aliyunddos1017.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 31.565/43.594/62.873/13.772 ms

分析:

41-KVM虚拟化基础和KVM管理工具使用

#观察网络
10.0.0.200 宿主机
[root@ubuntu2204 ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:df:99:92 brd ff:ff:ff:ff:ff:ff
altname enp2s1
altname ens33
inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fedf:9992/64 scope link
valid_lft forever preferred_lft forever
3: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 52:54:00:ab:96:2d brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
5: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master virbr0 state UNKNOWN group default qlen 1000
link/ether fe:54:00:18:b7:d2 brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc54:ff:fe18:b7d2/64 scope link
valid_lft forever preferred_lft forever
---------------------------------------------------------------------------------
192.168.122.23 虚拟机
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:18:b7:d2 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.23/24 brd 192.168.122.255 scope global noprefixroute dynamic eth0
valid_lft 2837sec preferred_lft 2837sec
inet6 fe80::4d93:c57d:e5c0:9d60/64 scope link noprefixroute
valid_lft forever preferred_lft forever

#宿主机上虚拟化安装虚拟机后会先生成virbr0网桥,虚拟机安装后内部生成eth0网卡同时宿主机会生成一个vnet1网卡,这样的构成一下关系:
10.0.0.200 eth0网卡 - virbr0网桥 - vnet1虚拟网卡 - 192.168.122.23 eth0虚拟机网卡 通信,所以虚拟机可以访问外网

我是moore,大家一起加油!