【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 Workstation | VMware / 桌面虚拟化 | 类型 2 Hypervisor(依赖 Host OS) | 个人开发测试、学习虚拟化技术、小型演示 |
VMware ESXi | VMware / 服务器虚拟化 | 类型 1 Hypervisor(裸机部署) | 企业生产环境、核心业务服务器、私有云底座 |
Citrix Hypervisor | Citrix / 服务器虚拟化 | 基于 Xen(类型 1 Hypervisor) | 企业 VDI 桌面云、中端服务器虚拟化 |
Xen | 开源社区 / 服务器虚拟化 | 类型 1 Hypervisor | 早期云平台(如 AWS 曾用)、特定遗留系统 |
Microsoft Hyper-V | 微软 / 服务器虚拟化 | 类型 1/2 混合(Windows 集成) | Windows 环境企业、混合云(对接 Azure) |
VirtualBox | Oracle / 桌面虚拟化 | 类型 2 Hypervisor(跨平台) | 个人学习、低成本开发测试、教学演示 |
KVM | 开源社区 / 服务器虚拟化 | Linux 内核模块(硬件辅助虚拟化) | 云平台底座(OpenStack/AWS)、Linux 企业 |
Red Hat Virtualization (RHV) | 红帽 / 企业虚拟化 | 基于 KVM | Linux 企业环境、混合云衔接 |
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 上网。
数据转发流程示例(虚拟机访问互联网):
-
虚拟机通过自身的虚拟网卡(如 vnet0)连接到 virbr0 网桥。
-
数据从 virbr0 传递到 virbr0-nic,进入物理机内核网络。
-
物理机通过 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标记为自动开始