当前位置: 首页 > news >正文

KVM虚拟化技术介绍

文章目录

  • 目录

    前言

     一.虚拟化概述

    虚拟化特点 

     虚拟化优势

    内存虚拟化

    CPU 虚拟化 

    I/O流虚拟化 

     二.KVM概述

    QEMU工作原理 

    总结


前言

虚拟化技术是云计算的基础,什么是虚拟化?虚拟化技术的本质是什么?主流的虚拟化技术有哪些?本章将为您揭晓


 一.虚拟化概述

虚拟化是一种将计算机资源(例如cpu、内存、存储等)进行抽象和隔离的技术。它可以将一台物理计算机划分为多个虚拟计算机,每个虚拟计算机可以运行独立的操作系统和应用程序。

虚拟化特点 

特点概述
分区虚拟化层为每个虚拟机划分服务器资源,每个虚拟机可以运行单独的操作系统且每个操作系统只能看到虚拟化层为其提供的“虚拟硬件(虚拟网卡,cpu,内存等)”,使得操作系统认为运行在自己的专用服务器上。
隔离

每台虚拟机互相隔离,单台虚拟机中毒或崩溃不会影响其它虚拟机;

虚拟化环境通常涉及共享物理资源,如CPU、内存和存储。可以为每台虚拟机指定最大或最小资源,防止一个虚拟机消耗过多资源导致其他虚拟机性能下降。

封装虚拟化技术将虚拟单元的所有环境存放在一个单独的文件中,这种封装性使得整个磁盘分区被存储为一个文件,从而易于备份、转移和拷贝
相对于硬件独立虚拟机只能看见虚拟层为其提供的虚拟硬件,而虚拟硬件与物理硬件相互独立

 虚拟化优势

利用虚拟化技术可以防止资源浪费,同时虚拟机的隔离性可以防止多个服务安装在同一个操作系统中时,操作系统出问题,所有服务都会出问题,此外虚拟化的克隆,快照功能使得备份更加容易。

内存虚拟化

内存虚拟化将物理内存抽象成虚拟地址空间,使得每个虚拟机(VM)拥有独立的、连续的内存地址空间。

Hypervisor维护了一个地址映射表(页表),用于记录虚拟地址(HPA)到物理地址(GPA)的映射关系。当虚拟机中的程序需要执行时,它首先会被加载到虚拟机的虚拟内存中,然后被映射到物理内存中。

CPU 虚拟化 

CPU虚拟化允许单个物理CPU模拟出多个虚拟CPU(vCPU),同时在物理CPU和虚拟机之间引入一个虚拟机管理程序(Hypervisor),每个虚拟机被分配至少一个vCPU,这些vCPU由Hypervisor映射到物理CPU上。

在理想情况下,每个物理线程可以被映射为一个vCPU。因此,对于一颗8核双线程CPU,其理论上可以映射出16个vCPU(8个核心 x 2个线程/核心 = 16个线程/vCPU)

当虚拟机运行程序时,虚拟CPU会生成内存地址,虚拟CPU通过地址总线发送该内存地址到内存芯片,内存芯片根据该内存地址找到存储程序的存储单元,存储单元通过地址总线返回给虚拟CPU,而Hypervisor将虚拟内存地转换为物理内存地址,vCPU执行物理存储单元返回的程序。

I/O流虚拟化 

Hypervisor在物理硬件上抽象出一个虚拟化层,这个虚拟化层负责将物理设备(如键盘)抽象成多个虚拟设备,供多个虚拟机共享。对于键盘等输入设备,VMM会截获虚拟机对设备的访问请求,并进行相应的处理和模拟,以确保输入数据能够正确地传递给虚拟机。

  1. 输入切换机制

    • 在使用物理机键盘对虚拟机进行输入时,需要在物理机和虚拟机之间进行输入切换。这通常通过特定的按键组合(如Ctrl+Alt)或鼠标点击来实现。
    • 当输入对象切换到虚拟机时,所有键盘输入都会被虚拟机捕获并处理;当输入对象切换回物理机时,键盘输入则会被物理机捕获。
  2. 中断处理与数据传输

    • 当虚拟机接收到键盘输入时,会产生中断信号。VMM负责截获这些中断信号,并将其转发给虚拟机中的设备模拟器(如QEMU)。
    • 设备模拟器或驱动程序会处理这些输入数据,并将其传递给虚拟机中的应用程序或操作系统。

 二.KVM概述

KVM本质是Linux内核中的虚拟化模块kvm.ko,KVM运行在内核空间中提供CPU和内存虚拟化,而IO设备虚拟化由运行在用户空间中的QEMU负责。

QEMU工作原理 

  1. 硬件虚拟化初始化

    • 当运行QEMU-KVM时,KVM会加载到Linux内核中,并提供了对CPU和内存虚拟化的支持。
  2. 虚拟机创建与配置

    • 用户通过QEMU提供的工具或界面来创建和配置虚拟机。这些配置信息包括虚拟机的名称、CPU类型、内存大小、磁盘大小等。
    • QEMU将这些配置信息传递给KVM,KVM利用这些信息来创建一个虚拟机实例,并为虚拟机分配必要的资源。
  3. 指令翻译与执行

    • 当客户机操作系统开始运行时,它会发出一系列的指令。这些指令首先被QEMU接收。
    • QEMU使用动态二进制翻译(DBT)技术将这些指令翻译成宿主机能够理解的指令。然后,宿主机的处理器执行这些指令,并将结果返回给虚拟机。
  4. IO设备模拟与交互

    • 虚拟机中的客户机操作系统与IO设备的交互是通过QEMU模拟器来实现的。
    • 当虚拟机中的客户机操作系统请求访问IO设备时,QEMU模拟器会将这些请求转发到宿主机的IO设备。然后,宿主机的IO设备处理这些请求,并将结果返回给虚拟机。

三.KVM部署

  • 虚拟机管理工具:libvirt
  • 虚拟机安装/克隆工具:virt
  • 虚拟机硬盘管理:qemu-kvm
  • virt-manager:KVM图形化管理工具和Vmware功能相同
  • libguestfs-tools:虚拟机系统管理工具

准备工作:开启VMware虚拟化功能 

命令行查看虚拟化功能是否开启(开启则会显示)
[root@localhost ~]# lsmod |grep -i kvm
kvm_intel             385024  0
kvm                  1105920  1 kvm_intel
irqbypass              16384  1 kvm

准备工作:安装远程控制软件 --->远程控制软件地址

准备工作:安装yum源

配置yum源(这里使用阿里源)
[root@timeserver yum.repos.d]# vim /etc/yum.repos.d/wangluo.repo
#写入如下内容
[wangluo-app]
name=wanluo-app
baseurl=https://mirrors.aliyun.com/centos-stream/9-stream/AppStream/x86_64/os/
gpgcheck=0
[wangluo-base]
name=wangluo-base
baseurl=https://mirrors.aliyun.com/centos-stream/9-stream/BaseOS/x86_64/os/
gpgcheck=0#安装软件包
[root@timeserver yum.repos.d]# yum install vim bash-completion -y
#出现完毕字样代表成功安装

 第二步:安装上述三种工具并上传虚拟机所用镜像文件

[root@localhost ~]# yum install -y libvirt virt-install qemu-kvm virt-manager libguestfs-tools
#启动虚拟机管理工具
[root@localhost ~]# systemctl start libvirtd.service
[root@localhost ~]# systemctl status libvirtd.service
#上传镜像文件
[root@localhost ~]# ls -lh /opt
总用量 8.5G
-rw-r--r--. 1 root root 8.5G 10月  7 17:23 rhel-baseos-9.1-x86_64-dvd.iso

 第三步:安装虚拟机

#启动KVM图形化管理工具
[root@localhost ~]# virt-manager
#取消开机自启
[root@localhost qemu]# virsh autostart --disable kvm_1

命令行安装方式可参考如下 -->VNC下载链接

--virt-type kvm                                 虚拟化的类型(gemu)--os-type=linux                                系统类型
--os-variant rhel7                              系统版本 
--name centos7                                  虚拟机的名字
--memory 1024                                   虚拟机的内存
--vcpus 1                                       虚拟cpu的核数
--disk /opt/centos2.raw, format=raw, size=10    虚拟机安装路径,虚拟磁盘格式,磁盘大小
--cdrom /opt/CentOS-7-x86 64-DVD-1708.iso       虚拟机镜像    
--network network=default                       虚拟机网络(默认NAT)
--graphics vnc,listen=0.0.0.0                   设置虚拟机的显示器使用vnc连接(默认开5900口)
--noautoconsole

KVM-Virsh日常管理命令

#查看KVM虚拟机状态
[root@localhost ~]# virsh list --allId   名称      状态
----------------------1    rhel9.1   运行#开启虚拟机
[root@localhost images]# virsh start rhel9.1
域 'rhel9.1' 已启动#关闭KVM虚拟机
[root@localhost ~]# virsh shutdown rhel9.1
域 'rhel9.1' 正在关闭[root@localhost ~]# virsh undefine rhel9.1
domain 'rhel9.1' 已被解除定义#更改虚拟机配置文件
[root@localhost ~]# virsh edit rhel9.1
域 'rhel9.1' XML 配置没有改变。#虚拟机重命名
[root@localhost ~]# virsh domrename rhel9.1 kvm_1
Domain successfully renamed#查看指定虚拟机VNC连接端口
[root@localhost qemu]# virsh vncdisplay kvm_1
127.0.0.1:0 (5900缩写为0)

KVM虚拟机备份

 当需要将KVM虚拟机备份并发送给对方时,只需备份并发送虚拟机的磁盘文件+配置文件

#查看虚拟机xml信息(包括存储信息/配置文件信息)
[root@localhost images]# virsh dumpxml rhel9.1(虚拟机名称)
  •  配置文件:上述命令输出信息中含有配置文件信息,只需备份到新建文件即可
[root@localhost images]# virsh dumpxml rhel9.1 > /var/lib/libvirt/images/rehl9.1.xml
  •  磁盘文件:在输出的XML配置文件中,查找 <disk> 标签有关于磁盘文件的路径信息
<disk type='file' device='disk'><driver name='qemu' type='qcow2' discard='unmap'/>#配置文件路径信息<source file='/var/lib/libvirt/images/rhel9.1.qcow2' index='2'/><backingStore/><target dev='vda' bus='virtio'/><alias name='virtio-disk0'/><address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/></disk>
[root@localhost ~]# ls -lh /var/lib/libvirt/images/
总用量 4.9G
-rw-r--r--. 1 root root 8.4K 10月  8 16:33 rehl9.1.xml
-rw-------. 1 qemu qemu  21G 10月  8 16:31 rhel9.1.qcow2

 KVM虚拟机恢复

#导入配置文件(注意要和磁盘文件处于同一个路径下)
[root@localhost images]# virsh define /var/lib/libvirt/images/rehl9.1.xml
从 rhel9.1 定义的域 '/var/lib/libvirt/images/rehl9.1.xml'#再次查看虚拟机状态(此时已恢复)
[root@localhost images]# virsh list --allId   名称      状态
-----------------------    rhel9.1   关闭

KVM挂起/恢复 

[root@localhost qemu]# virsh suspend kvm_1
域 'kvm_1' 已挂起[root@localhost qemu]# virsh resume kvm_1
域 'kvm_1' 已恢复

KVM开机自启 :启动libvirtd.service会自动开启KVM虚拟机

[root@localhost qemu]# virsh autostart kvm_1
域 'kvm_1' 标记为自动启动#设置开机自启后会出现autostart目录并显示设备开机自启的虚拟机
[root@localhost ~]# ls /etc/libvirt/qemu
autostart  kvm_1.xml  networks
[root@localhost ~]# ls /etc/libvirt/qemu/autostart/
kvm_1.xml#关闭开机自启
[root@localhost ~]# virsh autostart --disable kvm_1

 KVM-Console登录

下图中,如果北京地区的主机想要访问虚拟机是无法通过VNC实现(VNC仅支持直连访问),而在KVM虚拟化环境中,配置console登录的作用是允许用户通过跳板机访问到虚拟机。

注意:虚拟机安装时无法通过跳板机ssh连接

#备份内核文件
[root@localhost ~]# cp /etc/grub2.cfg /etc/grub2.cfg_backup
#插入内核配置
[root@localhost ~]# grubby --update-kernel=ALL --args="console=ttyS0,115200n8"
#比对新旧内核配置文件不同
[root@localhost ~]# diff /etc/grub2.cfg /etc/grub2.cfg_backup

#重启虚拟机后就可以通过console连接虚拟机
[root@localhost ~]# virsh console kvm_1
连接到域 'kvm_1'
转义字符是 ^] (Ctrl + ])kvm1 login: root
密码:
上次登录:Wed Oct  9 18:27:57 from 192.168.122.1
[root@kvm1 ~]#使用ctrl+]从虚拟机界面跳转到主机界面

 KVM-磁盘管理/快照管理

KVM磁盘格式

  1. raw格式:raw格式是最简单和通用的磁盘格式。他静态分配磁盘空间,即便50G磁盘中文件只用20G,也会分配50G空间,因此占用空间大。

  2. qcow2格式:qcow2是一种高级的磁盘格式,支持特性如动态分配空间、快照和压缩。它可以节省磁盘空间,与raw格式相反,他根据文件大小动态分配磁盘空间。

常用命令 

#查看磁盘信息
[root@localhost images]# qemu-img info rhel9.1.qcow2
image: rhel9.1.qcow2
file format: qcow2
virtual size: 20 GiB (21474836480 bytes)
disk size: 4.88 GiB
cluster_size: 65536
Format specific information:compat: 1.1compression type: zliblazy refcounts: truerefcount bits: 16corrupt: falseextended l2: false
Child node '/file':filename: rhel9.1.qcow2protocol type: filefile length: 20 GiB (21478375424 bytes)disk size: 4.88 GiBFormat specific information:extent size hint: 1048576#创建虚拟磁盘文件
[root@localhost images]# qemu-img create -f(指定磁盘格式) qcow2 test.qcwo2 5G(指定大小)

总结


http://www.mrgr.cn/news/46742.html

相关文章:

  • 为mysql开启error日志 - phpstudy的数据库启动失败
  • Windows配置adb
  • Java-数据结构-栈与队列(常考面试题与单调栈)
  • 【人工智能】大语言模型的微调:让模型更贴近你的业务需求
  • 2025华数杯国际赛A题完整论文讲解(含每一问python代码+数据+可视化图)
  • Python自学 - 类进阶(让类像列表和字典那样工作)
  • ESP32-C3实现ADC
  • 代码随想录算法训练营第五六天| 99. 岛屿数量 100. 岛屿的最大面积
  • 搜维尔科技:Haption远程操作项目模拟项目
  • 动态内存分配 VS 静态内存分配
  • 【虚拟化】内核级虚拟化技术KVM介绍,全/半虚拟化的区别,使用libvirt搭建虚拟化平台(go/java/c++)
  • 这个问题做项目的时给某些客户普及过,这里再给你普及一下
  • FireFox简单设置设置
  • 创建osd加入集群
  • linux基础-----基础命令+较新替代命令汇总详解
  • CF E. Money Buys Happiness
  • 【动态规划】
  • Http 协议和 RPC 协议有什么区别?
  • JavaEE: HTTPS的魅力与优势揭秘
  • 1. Keepalived概念和作用
  • 代码随想录算法训练营第二十九天|93.复原IP地址 78.子集 90.子集II
  • PostgreSQL的学习心得和知识总结(一百五十三)|[performance]将 OR 子句转换为 ANY 表达式
  • 苹果电脑磁盘满了怎么清理内存?必看清理秘籍
  • maven加载依赖成功但是引入import不了包,注解报错
  • ★ 算法OJ题 ★ 二分查找算法
  • 网络安全产品类型