KVM虚拟化与企业应用实践——KVM虚拟机的常用命令【创建、管理、保存与恢复】

KVM虚拟化与企业应用实践------给远端主机创建虚拟机https://blog.csdn.net/xiaochenXIHUA/article/details/162014764KVM虚拟化与企业应用实践------KVM与Qemu虚拟化详解https://blog.csdn.net/xiaochenXIHUA/article/details/161854600?spm=1001.2014.3001.5501

一、创建KVM虚拟机的常用参数解析

KVM虚拟化与企业应用实践------创建KVM虚拟机实践教程https://coffeemilk.blog.csdn.net/article/details/161932482?spm=1001.2014.3001.5502

1.1、创建KVM虚拟机的常用参数说明

bash 复制代码
#创建KVM虚拟机【BIOS模式】
virt-install \
--virt-type=kvm \
--os-variant=rhel9.3 \
--name=openeuler2403sp2 \
--description="开发使用的OpenEuler24.03-LTS-SP2服务器" \
--vcpus=2 \
--cpu host-model \
--memory 4096 \
--disk path=/data/vmdisk/openeuler2403sp2.qcow2,bus=virtio,cache=none,size=40 \
--cdrom /data/AllOS/iso/openEuler-24.03-LTS-SP2-x86_64-dvd.iso \
--network bridge=br0,model=virtio \
--noautoconsole \
--graphics vnc,port=5901,listen=0.0.0.0,password=qwer1234 \
--boot hd,menu=on
创建KVM虚拟机的常用参数 说明
--virt-type=驱动类型 virt-install / virsh create / virt-manager 等 libvirt 虚拟机创建工具的核心参数,用于指定虚拟化驱动类型,告诉 libvirt 底层用什么 hypervisor 运行虚拟机。 * --virt-type kvm (✅最常用的全虚拟化):特点是硬件辅助虚拟化(Intel VT-x / AMD-V),性能接近物理机,Windows/Linux 虚拟机通用;适用于生产环境 Windows、Linux 完整虚拟机;要求是CPU 开启虚拟化,内核加载 kvm_intel / kvm_amd。 * --virt-type qemu (❌纯 QEMU 仿真,无硬件加速)无 CPU 硬件虚拟化加速,纯软件二进制翻译仿真;性能极差,仅用于【CPU 未开启虚拟化】【交叉架构仿真(x86 主机跑 ARM、RISC-V 虚拟机)】;不建议日常生产使用。 * lxc /lxd(容器虚拟化)驱动:LXC 系统容器;特点是共享宿主机内核,轻量,不能跑不同内核系统(不能 Windows);适用与Linux 容器,替代 docker 轻量隔离。 * xen(Xen hypervisor)老牌半虚拟化 hypervisor,公有云早年大量使用;分 Domain0(宿主机)+ DomU(虚拟机),现在大部分场景被 KVM 替代。 注意:不写 --virt-type 时【virt-install 会自动探测优先级】: 1. 有 KVM 模块 → 默认 kvm 2. 无 KVM 但安装 Xen → xen 3. 都没有 → 降级 qemu
--os-variant=系统短ID 指定具体操作系统发行版版本 ID ,libvirt 会根据内置 osinfo-db 数据库自动优化虚拟机硬件配置,不写会报性能警告、硬件适配异常。 全部系统短 ID命令:osinfo-query os 也可过滤(如: osinfo-query os vendor="Microsoft Corporation" `osinfo-query os name~"CentOS
--name=虚拟机名称 或--n=虚拟机名称 指定的虚拟机名称(必须libvirt 内全局唯一,不能重复)
--description "备注" 虚拟机描述信息(讲清楚这个虚拟机是做什么用的)
--vcpus CPU 核心数,支持多核、拓扑配置; 完整语法是:--vcpus COUNT[,maxvcpus=MAX][,sockets=N][,cores=N][,threads=N] * --vcpus 2 表示分配 2 个虚拟CPU,默认拓扑:2 sockets × 1 core × 1 thread; * --vcpus 2,maxvcpus=8 表示当前2核,最多扩展到8核(运行后可在线增加 vCPU,上限由 maxvcpus 控制); * --vcpus 4,sockets=1,cores=4,threads=1 表示4 核,1 插槽 4 核心无超线程。 * --vcpus 8,sockets=2,cores=2,threads=2 表示8 核,2 插槽,每槽 2 核,2 线程(模拟超线程)。
--cpu 模式类型 指定 CPU 型号 / 特性,优化兼容性: * --cpu host-passthrough(完整透传) 把宿主机 CPU 完整型号、步进、全部指令集原样给虚拟机; 性能最优,支持嵌套虚拟化、AVX512、AES-NI 全部特性; 致命缺点 :跨不同 CPU 机型无法热迁移,迁移直接蓝屏 / 启动失败; 适用:单节点、转码、AI、数据库、嵌套虚拟化场景。 * --cpu host-model(✅平衡首选,云平台默认) 折中方案:尽可能多暴露 CPU 特性,但底层是通用标准型号; 支持同代不同步进、同系列异构 CPU 之间热迁移; 性能略低于 passthrough,但远好于默认 qemu64/kvm64; 适用:集群、需要热迁移、通用业务服务器,绝大多数生产推荐。 * custom 固定型号(如 --cpu Skylake-Client 手动指定固定 CPU 型号,特性最少,迁移兼容性最强; 性能最低,适合老旧系统、跨几代硬件大规模迁移场景。 性能 & 迁移兼容性排序 * 性能:host-passthrough > host-model > custom(qemu64) * 迁移通用性:custom > host-model > host-passthrough
--memory 虚拟机内存,默认单位 MB; 语法:--memory 分配内存[,maxmemory=最大内存][,slots=N] * --memory 4096 表示固定4G内存,不支持热扩容; * --memory 4096,maxmemory=16384,slots=4 表示当前4G,最大可扩至16G,4个内存插槽。 配套常用参数: * --memballoon 内存气球(动态回收内存)【默认自动开启,可手动指定模型】(--memory 8192 --memballoon virtio)作用:宿主机内存不足时,通过气球驱动回收虚拟机空闲内存。 * hugepage 大页内存(提升性能,数据库 / Redis 推荐)【 两种开启方式: 1. 全局宿主机配置大页,创建虚拟机时加参数:--memory 16384 --hugepages; 2. 指定大页尺寸(2M/1G) 】。 也可带单位:--memory 16G 等价 --memory 16384; 旧版 virt-install 使用 --ram,新版推荐统一 --memory,两者功能完全一致。
--disk 指定虚拟机镜像(支持新建空白盘、使用已有镜像、LVM / 分区等多种场景); 通用语法:--disk key1=value1,key2=value2,... 1. path=/xxx/xxx.img 磁盘镜像文件路径(必须是绝对路径); 2. size=XX 指定分配大小单位为G; 3. bus=TYPE 磁盘总线类型(✅优选virtio(半虚拟化,性能最优(Linux 默认推荐));还有如scsi、ide等类型); 4. cache=MODE 磁盘缓存策略(✅优选none无缓存直接落盘;还有wirteback可选); 5. device=TYPE 设备类型(disk(普通硬盘,默认)、cdrom(光盘)); 6. readonly=on 只读磁盘(挂载只读镜像使用); 7. format=TYPE 磁盘格式,分为两种qcow2(默认,精简置备、支持快照、压缩(日常首选)) / raw(裸格式,性能高、不支持快照(数据库 / 高性能场景));
--cdrom 光盘光驱 CDROM ;--cdrom iso镜像的绝对路径。
--network 配置虚拟机网卡,支持 NAT、桥接、隔离网络三大场景。 通用语法:--network key1=value1,key2=value2,... # 简写:-w 1. network=NAME 绑定 libvirt 虚拟网络名称(默认 NAT 网络:default(对应网卡 virbr0)); 2. bridge=BR_NAME 绑定物理网桥(桥接模式;桥接网卡:br0br1(虚拟机和宿主机同网段)); 3. model=TYPE 网卡型号( ``virtio:Linux 首选,高性能半虚拟化网卡; ``e1000:兼容 Windows(Windows 默认无 virtio 驱动)); 4.mac=XX:XX:XX:XX:XX:XX 手动指定固定 MAC 地址(需保证全网唯一;一般都不用设置,自动分配); 5.type=isolated 隔离网络(仅虚拟机互通,不上外网)用于测试集群内部通信。
--noautoconsole 使用该参数则表示指定不自动试图连接到客户机控制台(默认行为是调用一个VNC客户端显示图形控制台,或者运行 "virsh" "console"命令显示文本控制台)。
--graphics 图形协议 控制虚拟机输出界面(VNC/SPICE/ 纯文本),分为有图形无头服务器(无图形)。 1. VNC 远程图形(默认,端口自动分配) --graphics vnc,listen=0.0.0.0,password=123456 2. SPICE 协议(性能更好,支持剪贴板) --graphics spice,listen=0.0.0.0,password=123456 3. 无图形(纯文本控制台,服务器必备) --graphics none -serial stdio 建议1:将password=明文密码修改为:password-file=/etc/qemu/vnc.pass; bash # QEMU vnc密码文件 echo "yourStrongComplexPass@2026" > /etc/qemu/vnc.pass chmod 600 /etc/qemu/vnc.pass chown qemu:qemu /etc/qemu/vnc.pass 建议2:修改为本地监听:listen=127.0.0.1+防火墙白名单限制 bash # 仅信任内网段放行VNC默认5900端口(推荐只放办公网 / 运维 IP) iptables -A INPUT -p tcp --dport 5901 -s 192.168.1.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 5901 -j DROP 建议3:生产安全配置(SPICE加密)【生产最终安全示例(SPICE 加密版)操作】
--boot 用于配置虚拟机BIOS/UEFI 启动相关行为:启动设备优先级、一次性启动项、启动菜单、开机画面等。 语法:--boot [uefi][,order=驱动顺序][,once=一次性启动顺序][,menu=on/off][,splash=图片][,splash-time=毫秒][,reboot-timeout=毫秒] 1. order=xxx 永久启动顺序(长期生效)【定义虚拟机默认开机依次尝试的设备,重启后不变】; 2. once=xxx 单次启动顺序(仅本次开机)【仅当前开机使用该启动顺序,虚拟机重启后自动恢复 order 配置。多用于临时装系统、临时 PXE 引导】; 3. menu=on /menu=off 启动选择菜单【menu=on:开机弹出图形 / 文字启动菜单,手动选择启动设备;menu=off:不显示菜单,直接按顺序启动(默认)】; 4. splash=FILE 开机自定义图片【指定一张图片作为 BIOS 开机 Logo 画面,支持 bmp 等格式】; 5. splash-time = 毫秒 开机画面停留时长【控制 splash 图片显示多久,单位 ms,默认几秒】;

1.2、--boot的使用示例详解

老式简写参数 标准 order 等价参数 功能
hd,cdrom order=c,d 硬盘优先
cdrom,hd order=d,c 光驱优先
hd,once=cdrom order=c,once=d 单次光驱启动
net,hd order=nc 网络优先
floppy,hd order=ac 软盘优先
新标准子参数 作用 完整示例片段 单位 / 前置依赖
order=cd 永久启动顺序:硬盘 c 优先,光驱 d 次之 -boot order=cd 盘符同旧式;独立逗号分隔
once=d 仅本次启动走光驱,重启恢复 order 默认 -boot order=c,once=d 不能与 bootindex 混用
menu=on 开启 SeaBIOS 图形启动菜单 -boot order=cd,menu=on 必须开启才能用 splash
splash=bootlogo.bmp 菜单背景位图 -boot menu=on,splash=bootlogo.bmp 仅 24 位 BMP,UEFI OVMF 无效
splash-time=5000 菜单自动倒计时停留时长 splash-time=5000 毫秒 ms,5000=5 秒
reboot-timeout=10000 全部设备启动失败后等待重启时长 reboot-timeout=10000 毫秒 ms;-1 = 永不重启
strict=on 严格校验启动设备合法性 order=cd,strict=on 可选布尔开关
bash 复制代码
#禁止混用【旧、新】两种写法
#1-新装系统,优先光驱,带启动菜单
#旧写法
--boot cdrom,hd,menu=on,splash-time=6000
#新标准
--boot order=d,c,menu=on,splash-time=6000



#2-系统安装完成,日常使用,优先硬盘
#旧写法
--boot hd,cdrom,menu=on,strict=off
#新标准
--boot order=c,d,menu=on,strict=off



#3-仅本次临时从光驱启动重装,永久顺序不变
#就写法不支持
#新标准
--boot order=c,menu=on,once=d


#4-PXE 网络批量装机,先网络再硬盘
#旧写法
--boot net,hd,menu=on,splash-time=10000
#新标准
--boot order=nc,menu=on,splash-time=10000



#5-软盘 + 光驱 + 硬盘多启动设备(老旧工控系统)
#旧写法
--boot floppy,cdrom,hd,menu=off
#新标准
--boot order=adc,menu=off



#6-严格启动模式,第一设备失败直接停机,不自动跳转
#旧写法
--boot hd,cdrom,strict=on
#新标准
--boot order=c,d,strict=on



#7-自定义开机 LOGO 画面(必须搭配 menu=on)
#旧写法
--boot cdrom,hd,menu=on,splash=/opt/logo.bmp,splash-time=5000
#新标准
--boot order=d,c,menu=on,splash=/opt/logo.bmp,splash-time=5000



#8-纯无人值守,无启动菜单,自动顺序启动
#旧写法
--boot hd,cdrom,menu=off
#新标准
--boot order=c,d,menu=off



#9-单次网络 PXE 启动,平时硬盘优先
#旧写法
--boot hd,net,menu=on
#新标准
--boot order=c,once=n,menu=on



#10-重启超时自动重启(机房自动化)
#旧写法
--boot hd,cdrom,reboot-timeout=30
#新标准
--boot order=c,d,reboot-timeout=30

1.3、生产安全实例SPICE的密码文件与SSL证书

bash 复制代码
#生产最终安全示例(SPICE 加密版)【手动依次执行生成对应密码文件与SSL证书】

#1-生成 SPICE .pass 密码文件(写入高强度密码)
mkdir -p /etc/qemu
echo "qwer@2026-kvm-coffeemilk" > /etc/qemu/spice.pass

#2-生成 SPICE TLS SSL 自签证书(适配 listen 内网IP【192.168.1.22修改为自己宿主机的IP】)
#server.key 私钥(服务器使用,禁止发给 Windows 客户端);
#cert.pem 公钥证书(复制到 Windows 导入信任根证书)。
mkdir -p /etc/qemu/ssl
cd /etc/qemu/ssl
openssl req -x509 -nodes -days 3650 -newkey rsa:4096 \
-keyout server.key \
-out cert.pem \
-subj "/C=CN/ST=Local/L=Lab/O=KVM/CN=192.168.1.29"

#3-密码文件与SSL证书授权
chmod 600 /etc/qemu/*.pass /etc/qemu/ssl/*
chown qemu:qemu /etc/qemu -R


#4-生产最终安全配置【tls-port后的端口号可以:改成任意 1024~65535 未被占用端口】
--graphics spice,listen=192.168.3.20,tls-port=5930,ssl-cert=/etc/qemu/ssl/cert.pem,ssl-key=/etc/qemu/ssl/key.pem,password-file=/etc/qemu/spice_passwd
bash 复制代码
#生产最终安全示例(SPICE 加密版)【直接使用脚本一键生成SPICE密码文件与SSL证书】
#1-创建SPICE 加密版脚本【生成SPICE密码文件与SSL证书】
cat >qemu_spice_ssl_init.sh<<EOF
#!/bin/bash
set -euo pipefail

###########################################################
# KVM QEMU SPICE 密码文件 + TLS证书一键生成脚本
# 使用说明:
# 1. 修改下方 SPICE_PASSWORD、SERVER_IP 变量
# 2. chmod +x qemu_spice_ssl_init.sh
# 3. ./qemu_spice_ssl_init.sh
# 4. 将 cert.pem 拷贝至Windows客户端导入信任根证书
###########################################################

# ====================== 需手动修改配置区 ======================
SPICE_PASSWORD="qwer@2026_kvm_coffeemilk"  # SPICE远程访问密码
SERVER_IP="192.168.1.29"                    # 宿主机内网监听IP
CERT_VALID_DAYS=3650                        # 证书有效期10年
# ==========================================================

# 1. 目录初始化
mkdir -p /etc/qemu /etc/qemu/ssl
echo "[1/4] 目录创建完成 /etc/qemu /etc/qemu/ssl"

# 2. 生成SPICE密码文件
echo "\${SPICE_PASSWORD}" > /etc/qemu/spice.pass
echo "[2/4] SPICE密码文件写入完成: /etc/qemu/spice.pass"

# 3. 生成TLS自签SSL证书(修复换行转义空格问题)
cd /etc/qemu/ssl
# 修复:所有行尾 \ 紧贴行末,无任何空白字符
openssl req -x509 -nodes -newkey rsa:4096 -keyout server.key -out cert.pem \
-subj "/C=CN/ST=Local/L=Lab/O=KVM/CN=\${SERVER_IP}" \
-days \${CERT_VALID_DAYS}
echo "[3/4] SSL证书&私钥生成完成"
echo "  公钥(客户端导入): /etc/qemu/ssl/cert.pem"
echo "  私钥(仅服务端保留): /etc/qemu/ssl/server.key"

# 4. 权限加固
chmod 600 /etc/qemu/*.pass /etc/qemu/ssl/*
chown qemu:qemu /etc/qemu -R
echo "[4/4] 文件权限、属主加固完成"

# 输出配套QEMU启动参数
echo -e "\n==================== 配套QEMU图形参数 ===================="
echo "--graphics spice,listen=\${SERVER_IP},tls-port=5930,ssl-cert=/etc/qemu/ssl/cert.pem,ssl-key=/etc/qemu/ssl/server.key,password-file=/etc/qemu/spice.pass"
echo -e "==========================================================\n"
echo "操作提示:将 /etc/qemu/ssl/cert.pem 复制到Windows客户端导入根证书,使用Remote Viewer连接:spice://\${SERVER_IP}?tls-port=5930"
EOF



#2-将SPICE 加密版脚本【生成SPICE密码文件与SSL证书】授权与执行
chmod +x qemu_spice_ssl_init.sh
./qemu_spice_ssl_init.sh

二、管理KVM虚拟机的常用命令

2.1、管理KVM虚拟机的【操作】命令

bash 复制代码
#管理KVM虚拟机的常用【操作】命令
#1-启动虚拟机
#1.1-启动本地虚拟机
virsh start VM-NAME
#1.2-启动远程虚拟机
virsh -c qemu+ssh://root@HOST-IP/system start VM-NAME

#2-关闭虚拟机
#2.1-关闭本地虚拟机
virsh shutdown VM-NAME
#2.2-关闭远程虚拟机
virsh -c qemu+ssh://root@HOST-IP/system shutdown VM-NAME
virsh -c "qemu+ssh://root@HOST-IP:port/system" domstate VM-NAME

#3-强制关闭虚拟机(相当于直接销毁)
#3.1-销毁本地虚拟机
virsh destroy VM-NAME
#3.2-销毁远程虚拟机
virsh -c qemu+ssh://root@HOST-IP/system destroy VM-NAME

#4-设置虚拟机随宿主机启动
#4.1-设置本地虚拟机随宿主机启动
virsh autostart VM-NAME
#4.2-设置远程虚拟机随宿主机启动
virsh -c qemu+ssh://root@HOST-IP/system autostart VM-NAME

#5-编辑虚拟机
#virsh edit将调用vi命令编辑位于/etc/libvirt/qemu/下面的每个虚拟机配置文件。修改完成后,会校验修改是否正确,不正确会有提示,不推荐直接通过vi命令修改每个虚拟机的配置文件。
#5.1-编辑本地虚拟机
virsh edit VM-NAME
#5.2-编辑远程虚拟机
virsh edit --direct --connect qemu+ssh://root@HOST-IP/system VM-NAME

#6-删除虚拟机
#6.1-删除本地虚拟机
#【--storage:删除关联的存储卷,可以通过domblklist查看】
#【--nvram:删除nvram文件,通常是在创建基于UEFI的虚拟机时使用】
virsh undefine VM-NAME --storage STORAGE --nvram

2.2、管理KVM虚拟机的【查看】命令

bash 复制代码
#管理虚拟机的常用【查看】命令
#1-查看正在运行的虚拟机
virsh list

#2-查看所有虚拟机列表
virsh list --all

#3-查看指定虚拟机信息
virsh dominfo VM-NAME

#4-查看指定虚拟机的XML配置文件
virsh dumpxml VM-NAME

#5-查看指定虚拟机的存储
virsh domblklist --domain VM-NAME

#6-查看指定虚拟机文件系统及其挂载点
virsh domfsinfo VM-NAME

#7-查看指定虚拟机vCPU信息
virsh vcpuinfo VM-NAME

#8-查看指定虚拟机的网卡信息
virsh  domiflist VM-NAME

#9-查看指定虚拟机使用的VNC端口号
virsh vncdisplay VM-NAME

2.3、通过控制台管理虚拟机与配置

对KVM虚拟机的访问有两种方面:【vnc】和【控制台】(使用字符界面登录虚拟机控制台),对虚拟机的修改和配置非常方便,但是需要在安装好的虚拟机上做一些配置操作。

bash 复制代码
#要开启通过控制台访问KVM虚拟机,需要在安装完成的kvm虚拟机上进行如下步骤操作(以红帽系Linux发行版为例)
#1-打开/etc/default/grub文件,在文件中的GRUB_CMDLINE_LINUX项末尾添加 console=ttyS0

#2-【BIOS模式】则更新 GRUB 配置命令如下:
grub2-mkconfig -o /boot/grub2/grub.cfg

#2-【UEFI模式】则更新 GRUB 配置命令如下:
grub2-mkconfig -o /boot/efi/EFI/openEuler/grub.cfg

#3-重启虚拟机
reboot now

#4-最后再宿主机上通过【virsh console】命令即可进入虚拟机了(进入后按下【Enter】键输入账号密码即可正式进入虚拟机)
virsh console VM-NAME

#5-要退出控制台,只需在kvm虚拟机命令行执行【exit】,然后按键盘【Ctrl + ]】键即可退出控制台。

2.4、保存与恢复虚拟机

保存虚拟机会将其内存和设备状态保存到主机的磁盘中,并立即停止虚拟机进程(该操作可以保存处于运行状态或暂停状态的虚拟机,在恢复后,虚拟机将返回到停止前的状态)【类似于快照功能】。这个过程释放了主机系统中的 RAM 和 CPU 资源以交换磁盘空间,这样可提高主机系统的性能。当虚拟机被恢复时,因为不需要引导客户机操作系统,也避免使用较长的启动周期。

bash 复制代码
#保存与恢复虚拟机
#1-保存虚拟机【创建快照】(注意:保存的虚拟机文件默认位于 /var/lib/libvirt/qemu/save 目录中)
virsh managedsave VM-NAME

#2-查看已保存的所有虚拟机
virsh list --managed-save  --all

#3-恢复已保存的虚拟机
virsh start VM-NAME

执行 virsh undefine VM-NAME 删除虚拟机后,managedsave 托管快照无法直接用来恢复虚拟机:

2.4.1、virsh managedsave VM-NAME(托管休眠快照)

  1. 本质:只保存虚拟机内存 / CPU / 设备运行状态不备份磁盘镜像
  2. 存储路径:/var/lib/libvirt/qemu/save/VM-NAME.save,由 libvirt 托管;
  3. 依赖条件:必须存在对应的虚拟机 XML 定义 + 原始磁盘镜像完整未改动
  4. 恢复逻辑:仅当 libvirt 里还存在该虚拟机定义时,virsh start 才会自动读取 .save 文件恢复休眠状态。

删除虚拟机(undefine)后为什么 managedsave 失效?

1、undefine 默认会校验托管 save 文件,不加参数删不掉

虚拟机存在 managedsave 休眠状态时,直接执行:

bash 复制代码
virsh undefine VM-NAME

会直接报错、删除失败,libvirt 强制要求你处理托管快照:

  • 要么先清掉托管快照:virsh managedsave-remove VM-NAME 再 undefine;

  • 要么带参数一并清理托管快照:

    bash 复制代码
    virsh undefine VM-NAME --managed-save

    --managed-save 后,/var/lib/libvirt/qemu/save/VM-NAME.save 文件会同步被删除,快照直接消失,彻底无法恢复。

2、就算你手动绕过、保留了 .save 文件,也无法恢复

managedsave 文件绑定原虚拟机名称 / UUID/XML 硬件配置

  • undefine 后 /etc/libvirt/qemu/VM-NAME.xml 配置文件被删除;
  • libvirt 不再识别这个托管 save 文件,没有命令能单独加载 .save 文件重建虚拟机;
  • 托管快照不包含磁盘、网卡、内存大小、光驱等硬件定义,缺 XML 就无法拉起虚机。

2.4.2、virsh save VM-NAME /xxx/xxx.state(手动导出状态文件,可跨 undefine 恢复)

手动把内存状态导出到自定义路径,不受虚拟机 undefine 影响,这是和 managedsave 最核心区别。

2.4.3、托管休眠快照与手动导出状态场景对比

❌仅 managedsave,直接 undefine(带 --managed-save)

  • .save 文件被系统删除;
  • 虚拟机 XML 删除;
  • 完全无法恢复休眠快照

✅想删虚拟机、但保留休眠状态用于后续恢复(正确方案)

不能只用 managedsave,必须手动导出独立状态文件

bash 复制代码
#1-先把托管休眠导出成独立文件(脱离libvirt托管)
virsh save VM-NAME /data/backup/VM-NAME.state

#2-备份虚拟机XML文件
virsh dumpxml VM-NAME > VM-NAME.xml.bak

#3-再删除虚拟机(可加--managed-save清理旧托管save)
virsh undefine VM-NAME --managed-save
bash 复制代码
#恢复步骤
#1-重新定义虚拟机
mv VM-NAME.xml.bak VM-NAME.xml
virsh define VM-NAME.xml

#2-加载独立状态文件恢复运行
virsh restore /data/backup/VM-NAME.state

注意:所有内存状态快照(休眠快照)只存运行时内存,不备份磁盘:

  • 若你删除 / 修改 / 移动了虚拟机 qcow2/raw 磁盘镜像,就算状态文件完好,恢复后磁盘数据错乱、系统崩溃;
  • 休眠快照≠磁盘快照(snapshot-create-as),磁盘快照才能完整保存系统数据。

2.4.4、实际操作建议

  • 仅使用 managedsave 做临时休眠、宿主机重启快速恢复,不能当做备份;

  • 需要删除虚拟机后还能恢复运行状态:

    • 先用 virsh save 导出独立 state 文件;
    • 提前 dumpxml 备份虚拟机硬件 XML;
    • 磁盘镜像全程保留不删除;
  • ✅长期备份整机系统数据,不要依赖 managedsave/save 内存快照,改用磁盘快照 / 镜像拷贝。