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

【Day 80】Linux-虚拟化

一、虚拟化技术概述

  • 核心价值:通过虚拟化技术可实现物理硬件资源的动态分配、按需调度,大幅提升服务器 CPU、内存、存储等资源的利用率,减少物理设备采购与运维成本。
  • 适用性考量:需结合行业特性评估是否适用,例如:
    • 适合场景:云计算平台、开发测试环境、企业多业务隔离场景等(资源利用率优先)。
    • 谨慎场景:对实时性要求极高的工业控制系统、核心金融交易系统(需评估性能损耗)。

(一)虚拟化类型

1、按设计架构分类

(1)  基于平台(Platform)

        // 对物理硬件层进行抽象,直接在硬件上构建虚拟化层(Hypervisor),支持多个独立操作系统(如 Windows、Linux)同时运行。例:KVM、VMware ESXi

① 硬件(Hardware) 

  • 物理底层资源:包括 CPU、内存、硬盘、网卡、显卡等物理设备,是所有软件运行的基础。
  • 核心作用:提供计算、存储、网络等物理能力,被上层 OS 或虚拟化层直接调用。

② 宿主操作系统(Host OS)

  • 直接运行在物理硬件上的操作系统(如 Windows)
  • 分为两种场景:
    • 类型 1 Hypervisor(如 VMware ESXi、KVM 的内核态组件):直接运行在硬件上,本身替代了传统 Host OS,负责管理硬件并运行虚拟机
    • 类型 2 Hypervisor(如 VMware Workstation、VirtualBox):依赖传统 Host OS(如 Windows 11),Hypervisor 作为应用程序运行在 Host OS 上,通过 Host OS 间接调用硬件资源。

③ 虚拟化层(Hypervisor/VMM)

  • 位于 Host OS(或硬件)与虚拟硬件之间的核心组件,全称 “虚拟机监控器”。
  • 核心功能:
    • 抽象物理硬件,模拟出 “虚拟硬件”(如虚拟 CPU、虚拟内存、虚拟网卡等)。
    • 隔离和管理多个虚拟机(Guest OS),分配硬件资源(如 CPU 时间片、内存配额),防止虚拟机之间的资源冲突。

④ 虚拟硬件(Virtual Hardware)

  • 由 Hypervisor 模拟出的 “虚拟设备”,对 Guest OS 而言,这些设备与物理硬件的接口完全一致(如虚拟 CPU 模拟 x86 指令集、虚拟网卡模拟 Intel/Realtek 网卡驱动)。

  • 常见虚拟设备:虚拟 CPU(vCPU)、虚拟内存(从物理内存中划分)、虚拟磁盘(对应物理存储上的镜像文件)、虚拟网卡(vNIC,连接到虚拟交换机)、虚拟 BIOS/UEFI 等。

⑤ 客户机操作系统(Guest OS)

  • 运行在虚拟硬件上的操作系统,其感知到的是 “虚拟硬件”,完全不知道底层是物理机还是虚拟机。

  • 需安装 “虚拟化驱动”(如 VMware Tools、virtio 驱动)以优化虚拟硬件的性能。

⑥ 应用程序(App)

  • 运行在 Guest OS 上的各类软件(如 Web 服务器、数据库、办公软件等),与在物理机上运行无差异,完全依赖 Guest OS 提供的运行环境。
(2) 基于操作系统(OS)

        // 在单一操作系统内核上通过隔离技术(如命名空间、资源限制)创建多个独立的虚拟执行环境,共享底层 OS 内核。例:Docker 容器(容器化本质是轻量级 OS 虚拟化)、Solaris Zones

① 硬件(Hardware)

  • 物理基础:CPU、内存、硬盘、网卡等物理设备,仅能执行机器指令,是所有软件(包括宿主 OS、Docker)的底层载体。

  • 核心支撑:需开启虚拟化相关特性(如 Intel VT-x、AMD-V),但 Docker 依赖的是 Linux 内核的 Namespace、Cgroups 等技术(轻量级虚拟化,非硬件辅助虚拟化),硬件需为这些内核功能提供支持。

② 宿主操作系统(Host OS)

  • 必须是 Linux 系统(Docker 核心依赖 Linux 内核特性;Windows/macOS 下的 Docker 实际是通过虚拟机模拟 Linux 环境)。

  • 核心作用:

    • 提供 Docker 运行的基础环境(Docker 引擎作为进程运行在 Host OS 上)。

    • 通过内核的 Namespace 实现容器的 “资源隔离”(如 PID、网络、文件系统隔离),通过 Cgroups 实现 “资源限制”(如限制容器的 CPU、内存配额)。

  • 宿主 OS 自身也有 bin/lib 目录(如 /bin/bash/lib/libc.so),但仅支撑宿主系统和 Docker 引擎,不直接支撑容器内的 App。

③ Docker 引擎(Docker Engine)

  • 运行在 Host OS 上的核心组件(包含 Docker Daemon、CLI 工具等),是 “容器的管理者”。

  • 核心功能:

    • 解析 Dockerfile 或镜像,创建 / 启动 / 停止容器。

    • 将容器与 Host OS 隔离(如为容器分配独立的网络命名空间、挂载独立的文件系统)。

    • 管理容器的资源分配。

④ 容器(Container)及内部的 bin/lib

  • 容器是 Docker 创建的 “轻量级虚拟环境”,本质是 Host OS 上的一个特殊进程,但其内部包含独立的 “根文件系统”(来自 Docker 镜像)。

  • 容器内部的 bin/lib

    • 来自 Docker 镜像,是容器内 App 运行的 “基础依赖”。

    • 与宿主 OS 的 bin/lib 完全隔离,仅服务于容器内的 App。

    • 作用:提供容器内的基础工具(如 bin 下的命令行工具)和代码依赖(如 lib 下的动态链接库),支撑 App 指令的执行。

⑤ 应用指令(Application Instructions)

  • 容器内 App 运行时产生的指令,分为两类:

    • 用户态指令:App 内部逻辑(如计算、数据处理),依赖容器内的 lib 库,最终编译为容器内 CPU 可执行的指令。

    • 系统调用指令:App 需访问资源(如读写文件、网络通信)时,通过容器内的 lib 库触发系统调用,但这些调用会被 Docker 隔离后,由 Host OS 内核统一处理(如容器内的 write() 调用,实际是操作 Host OS 分配的虚拟文件系统)。

⑥ 应用程序(App)

  • 运行在容器内的软件(如 Nginx、MySQL、Python 服务),是用户实际使用的业务载体。

  • 特点:App 感知不到自己在容器内运行,以为自己处于一个独立的 Linux 系统中,所有依赖(bin 工具、lib 库)都来自容器内的根文件系统。

(3)对比
对比维度基于平台的虚拟化(硬件辅助)基于操作系统的虚拟化(轻量级)
Guest OS 独立性每个 Guest OS 是完整的操作系统(如 Win11、Ubuntu),拥有独立内核,与 Host OS 无关容器共享 Host OS 内核,仅隔离用户态环境,无法运行与 Host OS 内核不兼容的系统(如 Linux Host 无法运行 Windows 容器)
硬件依赖必须依赖 CPU 的硬件虚拟化特性(VT-x/AMD-V)不依赖硬件虚拟化,仅依赖 Host OS 内核特性(如 Linux Namespace)
资源占用与性能资源占用高(每个 Guest OS 需独立分配 CPU、内存、磁盘),性能损耗约 5%-15%(需模拟硬件)资源占用极低(共享内核,仅分配必要资源),性能损耗 < 5%(接近原生)
隔离强度强隔离(Guest OS 之间完全独立,一个崩溃不影响其他)弱隔离(共享内核,内核漏洞可能导致容器逃逸,影响 Host OS)
启动速度慢(需启动完整操作系统),分钟级快(仅启动容器内应用),秒级甚至毫秒级
适用场景需运行不同内核的操作系统(如 Windows+Linux 共存)、对隔离性要求高的场景(如服务器虚拟化、测试环境)微服务部署、应用打包分发(如 Docker 镜像)、轻量级隔离场景(如开发环境)

补充:虚拟化产品介绍

产品名称所属厂商 / 类型核心技术架构适用场景
VMware WorkstationVMware / 桌面虚拟化类型 2 Hypervisor(依赖 Host OS)个人开发测试、学习虚拟化技术、小型演示
VMware ESXiVMware / 服务器虚拟化类型 1 Hypervisor(裸机部署)企业生产环境、核心业务服务器、私有云底座
Citrix HypervisorCitrix / 服务器虚拟化基于 Xen(类型 1 Hypervisor)企业 VDI 桌面云、中端服务器虚拟化
Xen开源社区 / 服务器虚拟化类型 1 Hypervisor早期云平台(如 AWS 曾用)、特定遗留系统
Microsoft Hyper-V微软 / 服务器虚拟化类型 1/2 混合(Windows 集成)Windows 环境企业、混合云(对接 Azure)
VirtualBoxOracle / 桌面虚拟化类型 2 Hypervisor(跨平台)个人学习、低成本开发测试、教学演示
KVM开源社区 / 服务器虚拟化Linux 内核模块(硬件辅助虚拟化)云平台底座(OpenStack/AWS)、Linux 企业
Red Hat Virtualization (RHV)红帽 / 企业虚拟化基于 KVMLinux 企业环境、混合云衔接
OpenShift红帽 / 容器平台(PaaS)基于 Kubernetes云原生应用、微服务架构、DevOps 团队
华为 FusionCompute华为 / 服务器虚拟化自研 Hypervisor(兼容 KVM)政企、金融、能源等国产化需求场景
深信服 aCloud深信服 / 超融合(HCI)基于 KVM(计算 + 存储 + 网络集成)教育、医疗、中小企业、分支办公
浪潮 InCloud浪潮 / 云计算解决方案基于 KVM(含虚拟化 + 云管理)政务云、企业私有云、行业云
云宏云宏 / 国产化虚拟化自研 Hypervisor(兼容 KVM)政企国产化项目、关键业务替代国外产品

2、按 Hypervisor 部署方式分类

  • 原生虚拟化(裸金属虚拟化)

    • 特点:Hypervisor 直接安装在物理机硬件上,不依赖宿主操作系统,性能接近物理机。
    • 适用场景:企业级生产环境,追求稳定性和高性能。
    • 代表产品:VMware ESXi、KVM(严格来说 KVM 依赖 Linux 内核,但可视为接近原生的虚拟化)、Xen。
  • 寄居虚拟化(宿主虚拟化)

    • 特点:Hypervisor 安装在现有操作系统(如 Windows、Linux)之上,依赖宿主 OS 管理硬件资源。
    • 适用场景:个人开发测试、临时虚拟环境。
    • 代表产品:VMware Workstation、VirtualBox、Parallels Desktop。

3、按实现技术分类

  • 软件虚拟化

    • 完全通过软件模拟硬件(如 CPU、内存、IO 设备),无需硬件支持,但性能损耗较大。例:早期的 QEMU 纯软件模拟模式

  • 半虚拟化(Para-virtualization)

    • 特点:修改 Guest OS 内核,使其感知虚拟化环境,跳过虚拟硬件,减少硬件模拟开销,提升 IO 性能(如磁盘、网络)。
    • 关键技术:通过半虚拟化驱动实现 Guest 与 Hypervisor 的高效交互,如:
      • RedHat/CentOS:virtio(网络、块设备驱动)
      • VMware:VMware Tools
      • 华为:UVP Tools
  • 硬件辅助虚拟化

    • 特点:通过 CPU 硬件指令集支持虚拟化,减少软件模拟开销,Guest OS 无需修改即可运行。
    • 硬件要求:物理 CPU 必须开启虚拟化功能:
      • Intel CPU:VT-x(处理器虚拟化)、VT-d(IO 虚拟化)
      • AMD CPU:AMD-V(处理器虚拟化)、AMD-Vi(IO 虚拟化)

二、KVM 虚拟化环境安装与验证

1、检查 CPU 虚拟化支持

目的:确认物理 CPU 是否开启硬件辅助虚拟化(KVM 依赖此功能)。

  •  通过任务管理器查看
    • 右键点击任务栏,选择 "任务管理器",或者直接按快捷键 "Ctrl+Shift+Esc" 打开任务管理器。
    • 切换到 "性能" 选项卡,选择左侧的 "CPU"。
    • 在右侧的 CPU 信息栏中,查找 "虚拟化" 相关内容,若显示为 "已启用",则说明虚拟化功能已开启,反之则未开启。

        

  • lscpu

        

  • 注意:若无输出,需进入 BIOS/UEFI 开启虚拟化功能(通常在 "Security" 或 "CPU Configuration" 中设置)。

2、安装 KVM 相关软件

# CentOS/RHEL系统(yum)
yum install -y qemu-kvm qemu-img libvirt virt-install virt-manager libvirt-python libvirt-client virt-viewer

核心组件说明

  • qemu-kvm:KVM 核心组件,提供硬件模拟功能。
  • libvirt:虚拟化管理工具集(API、守护进程、命令行工具)。
  • virt-install:命令行创建虚拟机的工具。
  • virt-manager:图形化虚拟机管理工具(可选)。
  • virt-viewer:虚拟机图形控制台工具。

    3、启动并验证 libvirtd 服务

    // libvirtd是管理虚拟化平台的守护进程,负责虚拟机生命周期、网络、存储等管理。

    # 启动服务并设置开机自启
    systemctl start libvirtd
    systemctl enable libvirtd# 检查服务状态(Active: running表示正常)
    systemctl status libvirtd
    

    4、验证 KVM 模块加载

    // KVM 通过 Linux 内核模块工作(kvm为核心模块,kvm_intel/kvm_amd为 CPU 架构驱动)。

    # 检查KVM相关内核模块是否已加载,以此验证 KVM 虚拟化功能是否正常启用。
    lsmod | grep kvm
    

    正常输出示例

    kvm_intel             188740  0   # Intel CPU的KVM驱动,(若为 AMD 处理器,会显示 kvm_amd)
    kvm                   637289  1 kvm_intel  # KVM核心模块
    irqbypass              13503  1 kvm  # 中断优化模块,表示系统加载了 irqbypass 内核模块,且该模块被 kvm 模块所依赖
    

    5、KVM 默认网络配置验证

            libvirt 默认创建default虚拟网络,采用 NAT 模式,为虚拟机提供上网能力。

    (1)网卡、ip

    ① virbr0

    // virbr0 是一个 软件虚拟网卡,相当于虚拟机网络的 “交换机”,主要功能是:

    • 连接物理机与所有接入该网桥的虚拟机,实现虚拟机之间、虚拟机与物理机的网络互通。

    • 作为虚拟机的默认网关(通常分配 192.168.122.1/24 网段),配合 NAT 规则让虚拟机访问外部网络(如互联网)。

    • 默认自动创建:安装 libvirt 后,会自动创建 virbr0 网桥及配套的 DHCP 服务(为虚拟机分配 192.168.122.2-254 范围内的 IP)。

    • 状态查看:通过 ip addr show virbr0 可查看其 IP 地址和状态,正常情况下应显示 UP(即使无虚拟机运行,网桥本身也会处于启用状态)。

    ② virbr0-nic

    // virbr0-nic 是 virbr0 网桥的 虚拟网卡接口,相当于网桥的 “物理端口”,主要功能是:

    • 为 virbr0 网桥提供一个虚拟的 MAC 地址(硬件标识),使其能像物理网卡一样参与网络通信。

    • 作为网桥与物理机内核网络栈的交互入口,实现网桥数据与物理机网络的转发。

    • 依赖 virbr0 存在:virbr0-nic 是 virbr0 的附属设备,若删除 virbr0,virbr0-nic 也会自动消失。

    • 默认 “不可见” 的活跃:通过 ip addr 查看时,virbr0-nic 通常显示 LOWER_UP(链路已通),但本身不分配 IP 地址(IP 由 virbr0 网桥统一管理)。

    二者关系与工作流程

    //  “交换机 + 网口” 的物理网络类比理解:

    • virbr0 = 虚拟交换机,负责连接所有虚拟机的 “虚拟网卡”(如 vnet0、vnet1)。

    • virbr0-nic = 交换机上的一个 “上行网口”,负责将交换机的流量接入物理机的网络栈,再通过物理机的真实网卡(如 eth0、ens33)实现 NAT 上网。

    数据转发流程示例(虚拟机访问互联网):

    1. 虚拟机通过自身的虚拟网卡(如 vnet0)连接到 virbr0 网桥。

    2. 数据从 virbr0 传递到 virbr0-nic,进入物理机内核网络。

    3. 物理机通过 iptables 的 NAT 规则(由 libvirt 自动配置),将虚拟机的私有 IP 转换为物理机的公网 IP,实现对外访问。

    (2)虚拟网络

            这是KVM 环境中默认创建的虚拟网络,通常用于为虚拟机提供网络连接(默认采用 NAT 模式,虚拟机可以通过宿主机访问外部网络)。

    • 关闭默认网络:virsh net-destroy default

    • 启动默认网络:virsh net-start default

    • 禁用开机自启:virsh net-autostart --disable default

    • 启用开机自启:virsh net-autostart default

    • 查看网络详情(如 IP 段、网关等):virsh net-dumpxml default

    <network><name>default</name><forward mode='nat'/>  <!-- 网络模式:NAT --><bridge name='virbr0' stp='on' delay='0'/>  <!-- 绑定的虚拟网桥 --><ip address='192.168.122.1' netmask='255.255.255.0'>  <!-- 网关IP --><dhcp><range start='192.168.122.2' end='192.168.122.254'/>  <!-- 虚拟机DHCP地址池 --></dhcp></ip>
    </network>
    
    (3)路由转发功能

    (4)NAT 规则
      • MASQUERADE:对192.168.122.0/24网段(虚拟机网段)的流量进行地址转换,使其能通过物理机网卡访问外部网络。
      • 目的:能和外界通信

      6、创建第一个 KVM 虚拟机

       补:如果使用Xshell需要下载Xmanager,或者直接使用VMware图形化工具

      Xmanager 下载 - NetSarang Website

      (1)方法1:图形化方式

      virt-manager

      (1)

      (2)

      (2)方法2:命令行方式

      使用virt-install命令创建虚拟机(以 CentOS 为例):

      virt-install \--name kvm_cenos_002 \--graphics vnc,listen=0.0.0.0,port=-1,keymap=en_us \--memory 1024,maxmemory=3096 \--vcpus 1,maxvcpus=4 \--disk path=/var/lib/libvirt/images/vm1_centos002.qcow2,size=8,format=qcow2 \--bridge=virbr0 \--cdrom=/opt/iso/CentOS-7.9-x86_64-Everything-2009.iso \--autostart

      此时就能正常连接到内层虚拟机的图形界面了。

       (3)连接KVM虚拟机

       若是显示协议vnc服务器类型不是vnc服务器 ,ps -elf 是不显示vnc的

      虚拟机的 VNC 配置为 vnc 0.0.0.0:0(进程信息中可见),表示 VNC 端口是 5900(5900 + 0)

      连接KVM虚拟机方式:

      1) 编辑 XML 修改 VNC 配置
      # 编辑虚拟机XML
      virsh edit test_diff
      # 找到 <graphics> 标签,修改为上述正确配置(删除错误的 protocol 属性,确保 type='vnc')。
      type='vnc':明确指定为 VNC 服务器类型(必须正确)。
      port='-1' + autoport='yes':自动分配未占用的 VNC 端口(避免端口冲突)。
      listen='0.0.0.0':允许所有 IP 访问(方便本地 / 远程连接)。virsh dumpxml test_diff | grep -A 5 "<graphics"
      # 错误1:type不是vnc(如误写为vncs或spice)
      <graphics type='vncs' port='5901' autoport='yes'/>
      # 错误2:协议指定错误(KVM VNC不支持非标准协议)
      <graphics type='vnc' protocol='rdp' port='5901'/>
      # 正确配置示例:
      <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'><listen type='address' address='0.0.0.0'/>
      </graphics>
      [root@sul ~] virsh list --all
      #打开KVM虚拟机
      [root@sul ~] virsh start kvm_cenos_002# 连接kvm虚拟机的方法
      (1)方法1
      [root@sul ~] virt-viewer --connect qemu:///system kvm_cenos_002
      (2)方法2 VNC
      [root@sul ~] yum install -y vnc# 编辑虚拟机XML
      [root@sul ~]# virsh edit generic
      # 找到 <graphics> 标签
      type='vnc':明确指定为 VNC 服务器类型。
      port='-1' + autoport='yes':自动分配未占用的 VNC 端口(避免端口冲突)。
      listen='0.0.0.0':允许所有 IP 访问(方便本地 / 远程连接)
      # 若不指定 listen 参数,KVM 默认监听 127.0.0.1(本地回环),此时仅允许 宿主机本地 连接 VNC(远程主机无法访问)。[root@sul ~]# virsh dumpxml generic | grep  "graphics"<graphics type='vnc' port='5900' autoport='yes' listen='127.0.0.1' keymap='en-us'></graphics># 查看KVM虚拟机的 VNC 实际端口
      [root@sul ~]# virsh vncdisplay generic 
      # 127.0.0.1:0[root@sul ~]# vncviewer 127.0.0.1:0(3)方法2 ssh方式
      # 在布置了内置虚拟机的虚拟机环境里
      [root@sul ~]# ssh root@192.168.122.150   #ip是kvm虚拟机的ip(4)如果想在本地机子里连接虚拟机里的KVM虚拟机,需要做一个映射
      # 添加 DNAT 规则(将宿主机 22222 端口转发到KVM虚拟机 192.168.122.150:22)
      [root@sul ~] iptables -t nat -A PREROUTING -d 192.168.140.111 -p tcp --dport 22222 -j DNAT --to-destination 192.168.122.150:22
      # 格式:ssh -p 端口 用户名@宿主机IP
      [C:\~]$ ssh -p 22222 root@192.168.140.111

         

        正常安装系统即可

        7、kvm虚拟机相关的文件

        • 配置文件, /etc/libvirt/qemu/xxxx.xml
        • 磁盘文件, 默认存放目录/var/lib/libvirt/images
        // 查看配置文件
        # virsh dumpxml 虚拟机名称// 设置虚拟机开机自启动, /etc/libvirt/qemu/autostart有对应配置文件的软链接
        # virsh autostart 虚拟机名称 // 修改配置文件 
        # virsh edit 虚拟机名称

        操作方式

        安全性

        生效方式

        适用场景

        virsh edit 虚拟机名

        高(带校验)

        自动生效(通知 libvirtd)

        日常配置修改

        virsh dumpxml 虚拟机名

        只读(无风险)

        仅导出,不修改配置

        查看 / 备份配置、迁移虚拟机

        直接编辑 XML 文件

        低(无校验)

        需手动加载配置才生效

        特殊应急场景

        • 当在 autostart 目录中创建虚拟机配置文件(/etc/libvirt/qemu/xxxx.xml)的软链接时,libvirtd 服务会识别该链接,在宿主机开机或 libvirtd 服务启动时,自动启动对应的虚拟机。

        • /var/lib/libvirt/images/ 是 KVM 默认的存储池路径,里面的 vm1_centos002.qcow2 就是虚拟机的磁盘映像文件

        8、删除虚拟机

        # 强制关闭虚拟机(若运行中)
        [root@sul ~] virsh destroy kvm_cenos_001  # 等效于“断电关机”,确保虚拟机停止运行
        # 域 kvm_cenos_001 被删除
        [root@sul ~] virsh undefine kvm_cenos_001  # 删除XML配置文件和autostart软链接,不删磁盘# 若需完全删除虚拟机(含数据),需手动删除对应的磁盘文件(可选):
        # 先确认磁盘文件路径
        [root@sul ~] virsh dumpxml generic |grep "source file"
        # <source file='/var/lib/libvirt/images/generic.qcow2'/>
        # <source file='/opt/iso/CentOS-7.9-x86_64-Everything-2009.iso'/>
        [root@sul ~] virsh dumpxml kvm_cenos_001 |grep "source file"
        # <source file='/var/lib/libvirt/images/vm1_centos001.qcow2'/>
        # 安装过程中同时存在两个 <source file> 是 正常状态,对应安装的核心流程:
        # generic.qcow2(虚拟磁盘):是系统安装的「目标盘」,安装程序会把 CentOS 7.9 的系统文件、内核、配置等写入这个磁盘,安装完成后虚拟机就靠它启动。
        # CentOS-7.9.iso(镜像文件):是系统安装的「安装介质」,相当于虚拟机的 “光驱”,安装程序会从这里读取安装包、引导文件,指导整个安装过程(比如选择分区、设置密码等)。[root@sul ~] rm -rf /var/lib/libvirt/images/kvm_cenos_001.qcow2# 同理:可创建 “增量镜像”(基于原磁盘的写时复制镜像),新虚拟机的修改会单独存储,不影响原磁盘文件,可同时运行。
        # 语法:qemu-img create -f qcow2 -b 父镜像路径 差量镜像路径 [可选大小]
        [root@sul ~] qemu-img create -f qcow2 -b /var/lib/libvirt/images/generic.qcow2 # /var/lib/libvirt/images/test_diff.qcow2
        # Formatting '/var/lib/libvirt/images/test_diff.qcow2', fmt=qcow2 size=21474836480 backing_file='/var/lib/libvirt/images/generic.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off [root@sul ~] qemu-img info /var/lib/libvirt/images/test_diff.qcow2
        # image: /var/lib/libvirt/images/test_diff.qcow2
        # file format: qcow2
        # virtual size: 20G (21474836480 bytes)
        # disk size: 196K
        # cluster_size: 65536backing file: /var/lib/libvirt/images/generic.qcow2    #已正确关联父镜像
        # Format specific information:
        #   compat: 1.1
        #   lazy refcounts: false将父镜像设为只读,防止意外修改导致差量镜像失效:
        [root@sul ~]# chmod 444 /var/lib/libvirt/images/generic.qcow2# 克隆后的新虚拟机需修改唯一标识(避免网络冲突):
        Linux:修改 /etc/hostname、/etc/sysconfig/network-scripts/ifcfg-eth0(IP 地址、MAC 地址)。
        Windows:通过 sysprep 工具重置系统 ID(SID),避免域环境冲突。

        // 磁盘文件若是不删除可以当作下一个虚拟机的映像文件,或创建增量镜像,修改磁盘路径为差量镜像,即可快速部署新虚拟机(参考之前的 “差量镜像创建虚拟机” 步骤)。

        新虚拟机的硬件配置需满足操作系统的兼容性要求:

        • CPU:若新虚拟机的 CPU 核心数超过原磁盘中操作系统的支持上限,可能导致启动失败。
        • 内存:新虚拟机的内存不小于操作系统的最低要求
        • 网卡 / 磁盘控制器:若新虚拟机使用原磁盘不支持的硬件(如原磁盘是 IDE 控制器,新虚拟机强制用 virtio 且未安装驱动),可能导致磁盘或网络不可用(但可通过调整配置或安装驱动解决)。

        三、kvm资源查看和调整

        [root@sul ~]# virt-manager 
        

        1、cpu热添加

        前提:①  创建时需要定义当前vcpu数量以及最大vcpu数量 ② 操作系统支持 CPU 热添加

        • Linux 虚拟机:主流发行版(CentOS 7+、Ubuntu 16.04+)默认支持,内核已集成 CPU 热插拔功能(需确认 acpi 和 cpu-hotplug 相关模块加载)。
        • Windows 虚拟机:仅 Windows Server 系统(如 2012+)和 Windows 10/11 专业版 / 企业版支持,家庭版不支持;且需在虚拟机配置中启用 “CPU 热添加”(通过 virsh edit 修改 XML,确保 <vcpu ... hotpluggable='yes'>)。

        • CONFIG_HOTPLUG_CPU=y,说明内核支持CPU 热添加

        注意:不支持在线缩减,只支持在线添加

        1、查看运行时CPU(实时生效,如热添加后的3核)
        [root@sul ~] virsh dominfo kvm_cenos_002 
        # Id:             1
        # 名称:       kvm_cenos_002
        # UUID:           114b35ad-2338-4421-816f-2003e79d657b
        # OS 类型:    hvm
        # 状态:       running
        # CPU:          1
        # CPU 时间:   52.4s
        # 最大内存: 4194304 KiB
        # 使用的内存: 1048576 KiB
        # 持久:       是
        # 自动启动: 启用
        # 管理的保存: 否
        # 安全性模式: selinux
        # 安全性 DOI: 0
        # 安全性标签: system_u:system_r:svirt_t:s0:c656,c851 (enforcing)2、查看初始CPU和最大CPU(配置文件中的值)
        [root@sul ~] virsh dumpxml kvm_cenos_002 | grep "<vcpu"
        #  <vcpu placement='static' current='1'>4</vcpu># 热添加操作:virsh setvcpus 虚拟机名 数量 
        # 无参数(默认):
        # 若虚拟机正在运行:等效于 --live(立即热生效,不修改配置文件)。
        # 只要虚拟机处于运行中,热添加的 3 核就会一直生效;
        # 但一旦重启虚拟机,会重新读取配置文件的current 值
        # 如果想让这次调整永久生效,需要补充 --config。
        # 若虚拟机已关闭:等效于 --config(仅修改配置文件,下次启动生效)。1、修改运行CPU
        [root@sul ~] virsh setvcpus kvm_cenos_002  3  # 初始和最大 VCPU 是虚拟机的底层资源上限,不支持运行时动态调整,都要重启后修改
        2、修改初始CPU
        方法1:
        [root@sul ~] virsh setvcpus kvm_cenos_002 3 --config  # 将初始CPU从1核改为3核,下次启动生效
        [root@sul ~] virsh edit kvm_cenos_002
        方法2:编辑XML,重启后生效
        [root@sul ~] virsh shutdown kvm_cenos_002
        # 找到并修改:<vcpu placement='static' current='3' max='4'>4</vcpu>3、修改最大CPU
        方法1:
        [root@sul ~] virsh setvcpus kvm_cenos_002 8 --config --maxvcpus  # --maxvcpus 表示修改上限
        方法2:编辑XML,重启后生效
        [root@sul ~] virsh shutdown kvm_cenos_002
        找到虚拟机 XML 配置中的 <vcpu> 标签,标签内的 4 即为当前的最大 VCPU 上限验证 CPU 热添加是否生效
        # Linux:lscpu/nproc 查看 CPU 核心数是否增加
        # Windows:任务管理器 “性能” 标签页查看 CPU 核心数变化。

        2、内存气球

        前提:① 需同时指定当前内存和最大内存② 需安装 virtio-balloon 驱动( virtio 驱动的一部分)

        • Linux 虚拟机:主流发行版(CentOS 7+、Ubuntu 16.04+)内核已集成该驱动,无需手动安装。
        • Windows 虚拟机:需在安装 virtio 驱动时,勾选 “Balloon Driver” 组件(驱动包中通常包含,如 virtio-win-0.1.240.iso 的 Balloon 目录)
        [root@sul ~] grep -i "CONFIG_MEMORY_HOTPLUG" /boot/config-$(uname -r)
        # 输出 CONFIG_MEMORY_HOTPLUG=y 表示支持内存在线扩容
        [root@sul ~] grep -i "CONFIG_MEMORY_HOTREMOVE" /boot/config-$(uname -r)
        # 输出 CONFIG_MEMORY_HOTREMOVE=y 表示支持内存在线缩容# 查看配置文件,验证虚拟机是否启用了 VirtIO Balloon(内存气球)驱动
        [root@sul ~] virsh dumpxml kvm_cenos_002 |grep -i memballoon
        #    <memballoon model='virtio'>
        #    </memballoon># Linux 虚拟机:
        lsmod | grep virtio_balloon  # 输出类似 "virtio_balloon 20480 0" 表示加载成功
        # Windows 虚拟机:设备管理器中查看 “系统设备”,若存在 “VirtIO Balloon Driver” 则说明安装成功。
        

        1、修改运行内存(对当前运行中的虚拟机立即生效,无需重启)
        [root@martin-host ~] virsh qemu-monitor-command vm01_centos79 --hmp  balloon 2048
        # 调整的是运行时内存,运行时内存可以在线修改。
        # 不会同步到 XML。XML 中记录的是 maxmem(最大内存)和初始内存,运行时调整不改变这些值。
        # 验证
        [root@martin-host ~] virsh qemu-monitor-command vm01_centos79 --hmp info balloon
        # balloon: actual=20482、 修改初始内存(下次启动生效)
        方法1:
        [root@sul ~] virsh shutdown kvm_cenos_002
        [root@sul ~] virsh setmem kvm_cenos_002 1024M --config
        方法2:
        # 域 kvm_cenos_002 被关闭
        [root@sul ~] virsh edit kvm_cenos_002
        找到并修改:<currentMemory unit='KiB'>1572864</currentMemory>
        # 编辑了域 kvm_cenos_002 XML 配置。
        [root@sul ~] virsh start kvm_cenos_002
        # 域 kvm_cenos_002 已开始# 验证初始内存(currentMemory)
        virsh dumpxml kvm_cenos_002 | grep "currentMemory"3、修改最大可用内存
        方法1:
        [root@sul ~] virsh setmaxmem kvm_cenos_002 4G --config
        [root@sul ~] virsh dumpxml kvm_cenos_002 | grep "<memory"
        #  <memory unit='KiB'>4194304</memory>
        方法2: 同理关闭KVM虚拟机,edit 配置
        找到并修改:<memory unit='KiB'>4194304</memory> 
        # 验证最大内存(memory)
        virsh dumpxml kvm_cenos_002 | grep "memory unit"# Linux虚拟机内部执行
        free -h  # 查看可用内存是否与balloon设置值一致

        注意:

        • 执行 virsh setmem 或 setmaxmem 时,若指定 M/G 单位,需确保与 XML 中的 KiB 换算一致(例:2GiB=2097152KiB),避免因单位混淆导致配置偏差。
        • 用 balloon 命令调整运行时内存时,最小值不能低于虚拟机操作系统的最低内存需求(如 CentOS 7 不低于 512MiB),否则可能导致虚拟机卡顿或崩溃。

        3、离线迁移/冷迁移

                离线迁移(冷迁移)是指在迁移过程中,源设备或系统必须下线,无法对外提供正常服务。所有数据的读取、传输和写入操作,都在源系统停止业务后进行。

                虚拟机关机、将对应的配置文件、磁盘文件拷贝到新服务器

        [root@sul ~] virsh destroy --domain kvm_cenos_002[root@sul ~] scp /var/lib/libvirt/images/vm1_centos002.qcow2  root@192.168.140.10:/var/lib/libvirt/images/
        [root@sul ~] scp /etc/libvirt/qemu/kvm_cenos_002.xml root@192.168.140.10:/etc/libvirt/qemu# 将指定的 XML 配置文件重新定义为 KVM 虚拟机
        [root@su2 ~]# virsh define /etc/libvirt/qemu/kvm_cenos_002.xml 
        定义域 kvm_cenos_002(从 /etc/libvirt/qemu/kvm_cenos_002.xml)[root@su2 ~]# virsh list --all Id    名称                         状态
        -----------------------------------------------------     kvm_cenos_002                  关闭[root@su2 ~]# virsh start kvm_cenos_002 [root@su2 ~]# virsh autostart kvm_cenos_002 
        域 kvm_cenos_002标记为自动开始
        

        http://www.dtcms.com/a/507341.html

        相关文章:

      • 建设厅官方网站网站主题的分类
      • 广州营销网站建设公司php网站开发实例项目
      • Kubernetes 核心概念解析与集群部署实战(基于 Docker+Flannel)
      • 【课堂笔记】复变函数-6
      • OpenBMC: BmcWeb处理WebScoket1 判断是否为WebSocket
      • 操作系统学习 进程(1)进程的概念与状态
      • Genie Envisioner--智元机器人--世界模型框架--2025.8.7
      • 权威网站有哪些wordpress分类目录浏览权限
      • Vue 缓存之坑,变量赋值方式和响应式数据
      • AWS CloudFormation —— 自动化部署的“云中脚本大师”
      • 响应式网站下载长沙排名推广
      • 【软考备考】 安全协议:SSL/TLS, IPSec 详解
      • 在 HarmonyOS 中平滑切换“点状粒子”与“图片粒子”(含可运行 ArkTS 示例)
      • 海门市规划建设局网站会考网页制作视频教程全集
      • 4-ARM-PEG-Pyrene(2)/Biotin(2),多功能化聚乙二醇修饰荧光标记生物分子的设计与应用探索
      • 做三折页宣传册 网站昆明网上房地产官网
      • redis-7.4.6部署安装
      • CSS学习笔记(五):CSS媒体查询入门指南
      • Redis多线程架构深度解析-从单线程到I/O Threading
      • 掌握 iOS 26 App 性能监控,多工具组合流程与实战指南
      • Spring定时任务中数据未持久化的深度排查指南:从autoCommit到事务管理的终极解法
      • BAT 大厂 java高频面试题汇总:JVM+Spring+ 分布式 +tomcat+MyBatis
      • 宸建设计网站想注册一个做网站的公司好
      • ThingsBoard开源物联网平台实践:从环境搭建到数据可视化
      • 第二章 线性表——课后习题解练【数据结构(c语言版 第2版)】
      • 成都网站建设开发公选择好的软件开发培训班
      • 待学习--中间件
      • Avalonia vs UniApp 全面对比分析
      • 策略模式优化多重判断
      • ios云打包证书申请不需要苹果电脑也是可以的