服务器与大带宽专家 · 持牌IDC/CDN/ISP服务商
简米科技官网JIANMI TECH
资讯 2026-10-10 更新于 2026-10-10 简米科技 3,512 字 8 分钟阅读

如何彻底关闭KVM虚拟机并释放所有资源?,KVM怎么彻底关闭

导读彻底关闭KVM虚拟机并释放所有资源,核心动作是:先优雅关机、再强制销毁、接着删除定义、最后清理存储和网络残留, 只执行 virsh shutdown 或 virsh destroy 远远不够,残留的进程、镜像文件、iptables规则和租约记录仍会悄悄占用宿主机资源,kvm虚拟机怎么彻底关闭?先分清shutdo……

彻底关闭KVM虚拟机并释放所有资源,核心动作是:先优雅关机、再强制销毁、接着删除定义、最后清理存储和网络残留。 只执行 virsh shutdown 或 virsh destroy 远远不够,残留的进程、镜像文件、iptables规则和租约记录仍会悄悄占用宿主机资源。

kvm虚拟机怎么彻底关闭?先分清shutdown和destroy

很多人问过kvm虚拟机怎么彻底关闭,第一步其实不是乱删命令,而是搞清楚两条关闭命令的差异。

  • virsh shutdown:向虚拟机发送ACPI关机信号,让客户机内的系统正常关机,适合处理有业务的虚拟机,但如果客户机内核卡死、驱动异常,这条命令可能一直等不到响应。
  • virsh destroy:强制切断电源,相当于直接拔掉服务器电源线,虚拟机立刻进入关闭状态,适合故障机、测试机或需要快速回收的场景。
命令 行为 适用场景 资源释放情况
virsh shutdown 软关机 业务可短时中断的虚拟机 虚拟机内释放应用资源,但宿主机部分内存页和缓存不会立即归还
virsh destroy 硬断电 故障虚拟机、开发测试机 进程退出较快,但镜像文件、网络规则仍然占用

行业共识认为,两条命令只完成了“关闭”这一半,后续的清理动作才决定宿主机资源是否真正归还,接下来把剩下的流程补齐。

生产环境下的kvm虚拟机释放内存资源操作

这个板块对应“kvm虚拟机释放内存资源”这个高频搜索词,很多运维只看到虚拟机状态变成“关闭”,但宿主机上执行 free -h 时发现可用内存在减少,这通常意味着有残留进程或缓存没被回收。

  • 先确认qemu进程是否还在,执行 ps aux | grep qemu,如果找到同名进程,说明虚拟机没死透。
  • 如何彻底关闭KVM虚拟机并释放所有资源?,KVM怎么彻底关闭

  • 用 virsh dominfo 虚拟机名 查看当前状态,必要时用 kill -9 配合PID强制清理,但动命令之前要先确认没有正在写入的快照任务。
  • 如果出现僵尸进程,查看 /proc/<pid>/status 里的State字段,状态为Z时需要由init进程回收,多数情况下,重启libvirtd服务就能触发一次全面清理:systemctl restart libvirtd。

业内专家指出,KVM虚拟机的内存由宿主机内核与cgroup共同管理,虚拟机销毁后,相关cgroup目录如果没同步刷新,会占住部分页缓存。如果内存占用异常,可以在宿主机执行 sync && echo 3 > /proc/sys/vm/drop_caches,但生产环境要先确认业务影响,避免磁盘读写抖动。

如何判断内存真的回归了?

  • 执行 virsh list --all,确认目标虚拟机不在列表内。
  • 执行 free -h,观察可用内存是否回到预期水位。
  • 执行 ps aux | grep qemu,确认没有同名进程残留。
  • 如果仍然偏高,可能是页缓存增加,可以对照 /proc/meminfo 中的Cached和SwapCached字段进行判断。

kvm虚拟机删除后磁盘空间不释放?镜像文件要这样清理

“kvm虚拟机删除后磁盘空间不释放”是另一个高频搜索词,磁盘问题通常出在镜像文件和数据卷没有手工清除上。

  • 虚拟机镜像默认路径在 /var/lib/libvirt/images/,文件名常为 <虚拟机名>.qcow2。
  • 删除虚拟机前,先用 virsh vol-list --pool default 查看当前存储卷,记录需要清理的卷名。
  • 在undefine之后,手动删除镜像文件:rm -f /var/lib/libvirt/images/你的虚拟机.qcow2。
  • 如果使用了raw稀疏文件,单纯删文件可能不会立即释放所有块,需要用 fallocate -d 或 truncate 处理空洞。
  • 使用Ceph或NFS后端时,正确删除存储卷的命令是:virsh vol-delete --pool <存储池> <卷名>

    如何彻底关闭KVM虚拟机并释放所有资源?,KVM怎么彻底关闭

    。

检查稀疏文件的坑

执行 ls -lh 看到的是虚拟大小,执行 du -h 看到的才是实际占用,如果两者差距明显,说明这是稀疏文件,手动删除前要先确认没有其他快照仍在引用它,清理后执行 df -h /var/lib/libvirt/images,可用容量没上升就说明还有占用。

国内机房运维中,这个步骤经常被跳过,但后果很直接:宿主机磁盘被多个残留镜像慢慢填满,最后积累到需要额外扩容,相当于每年白白烧掉一台小型云主机的存储成本。

清理虚拟网卡和iptables规则,避免IP冲突

虚拟机销毁后,内部IP和MAC地址可能残留在桥接或NAT配置里,如果不清理,后续新建虚拟机可能遇到IP冲突或端口占用。

  • 先查看虚拟机有哪些网卡:virsh domiflist 虚拟机名,拿到mac地址和宿主机侧虚拟网卡名(如vnet0)。
  • 如果虚拟机已经destroy,虚拟网卡通常会自动消失,但偶尔会有残留,检查宿主机上的vnet设备:ip link show | grep vnet。
  • 对残留的vnet设备,用 ip link del vnet0 删除。
  • NAT模式下,iptables规则不会自动清理,检查 iptables -t nat -L -n,删除对应虚拟机的DNAT/SNAT规则。
  • 还要检查dnsmasq租约文件,通常位于 /var/lib/libvirt/dnsmasq/,清理废弃的IP记录。

建议每次清理虚拟机都顺手把桥接配置、dnsmasq租约文件翻一遍,防止网络配置越积越乱。

virsh undefine:让虚拟机从宿主机彻底消失

前面的操作都在状态和资源层面,最后一步是删除虚拟机定义,这一步对应“kvm虚拟机怎么彻底关闭”的收尾。

基本命令是 virsh undefine 虚拟机名,但具体场景要加参数:

  • 如果虚拟机使用UEFI引导,必须加 --nvram,否则会残留nvram文件。
  • 如果想把其管理的存储卷一并删除,使用 virsh undefine 虚拟机名 --remove-all-storage,这个参数会自动清理关联的qcow2文件,前提是你没手动删过头。
  • 如何彻底关闭KVM虚拟机并释放所有资源?,KVM怎么彻底关闭

  • 如果之前创建过快照,先执行 virsh snapshot-list 虚拟机名 确认,并逐一清理,否则undefine可能中断。

执行完后,用 virsh list --all 确认列表为空,再把存储池重新扫描一遍,检查是否遗留孤儿卷。

考虑到云平台和自建环境差异很大,实际工作里还会遇到“云服务器和kvm虚拟机资源回收对比”这类讨论,云平台通常通过API自动回收,自建KVM环境更依赖运维脚本,把上面几个步骤整理成一段bash清理函数,放到crontab定期巡检,就能避免手工操作反复踩坑。

关于彻底关闭KVM虚拟机的三个高频问题

Q1:virsh destroy和shutdown区别是什么?为什么destroy后内存仍然占用?

简单说,shutdown是让系统正常关机,destroy是模拟拔电,destroy执行后,libvirt会立即更新域状态,但宿主机内的内存页、页缓存和cgroup临时目录不一定马上释放,若内存占用异常,先检查qemu进程是否完全退出,再确认cgroup相关路径是否清理干净。

Q2:kvm虚拟机怎么彻底关闭并删除网卡信息?

先通过 virsh domiflist 虚拟机名 查看当前网卡,再执行 virsh detach-interface 虚拟机名 --type network --mac 对应地址,如果是NAT模式,还需要去宿主机删除iptables规则和dnsmasq租约记录,最后用 ip link del 清理残留的虚拟网卡设备。

Q3:删除虚拟机会影响同宿主机的其他虚拟机吗?

正常情况下不会影响,因为KVM以独立进程隔离虚拟机,但要注意,如果多台虚拟机共享同一个存储池或虚拟网桥,误删公共资源会引发连带问题,行业共识是,在没有自动化工具的情况下,每次操作前先备份关键配置,并把每台虚拟机的磁盘文件单独存放,避免交叉关联。

做到进程、存储、网络、定义四个维度都清理干净,宿主机才能真正轻装上阵,把这套流程固定成日常运维动作,比临时追查资源占用要节省大量时间。

分享本文
本文为 简米科技官网 原创,已由运维技术专家审核。转载请注明来源:原文链接
售前咨询 服务热线 售后 邮箱