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虚拟机的常用参数解析
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 绑定物理网桥(桥接模式;桥接网卡:br0、br1(虚拟机和宿主机同网段)); 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(托管休眠快照)
- 本质:只保存虚拟机内存 / CPU / 设备运行状态 ,不备份磁盘镜像;
- 存储路径:
/var/lib/libvirt/qemu/save/VM-NAME.save,由 libvirt 托管; - 依赖条件:必须存在对应的虚拟机 XML 定义 + 原始磁盘镜像完整未改动;
- 恢复逻辑:仅当 libvirt 里还存在该虚拟机定义时,
virsh start才会自动读取.save文件恢复休眠状态。
删除虚拟机(undefine)后为什么 managedsave 失效?
1、undefine 默认会校验托管 save 文件,不加参数删不掉
虚拟机存在 managedsave 休眠状态时,直接执行:
bash
virsh undefine VM-NAME
会直接报错、删除失败,libvirt 强制要求你处理托管快照:
-
要么先清掉托管快照:
virsh managedsave-remove VM-NAME再 undefine; -
要么带参数一并清理托管快照:
bashvirsh 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 内存快照,改用磁盘快照 / 镜像拷贝。