麒麟系统虚拟机关闭后残留QEMU进程需手动清理:先用ps aux | grep -E "(qemu|libvirt)"确认残留,再用sudo virsh destroy精准终止或sudo pkill -f "qemu-system-"批量清除,最后释放端口、TAP网卡并重启libvirtd。

麒麟系统中虚拟机关闭后残留进程持续占用CPU、内存或端口,导致新虚拟机无法启动、网络冲突或宿主机响应迟缓,必须手动清理这些孤儿进程才能恢复虚拟化环境正常运行。
确认残留进程是否存在
打开终端,执行命令查看是否有已退出但仍在运行的QEMU/KVM相关进程:ps aux | grep -E "(qemu|libvirt)" | grep -v grep。
重点观察COMMAND列中是否包含类似 qemu-system-x86_64 或 qemu-kvm 的进程,且其STAT状态为R(运行中)或S(休眠),但对应的虚拟机在virt-manager中已显示为“关机”或根本未列出——这说明进程已脱离libvirt管理,成为残留。
若输出为空,则无残留进程,无需继续;若有输出,请记录下各进程PID,进入下一步。
强制终止残留QEMU进程
方法一:逐个kill指定PID
对上一步查出的每个PID,执行:sudo kill -9 PID号。
方法二:一键清除全部QEMU用户态进程
执行:sudo pkill -f "qemu-system-"。
【注意:此命令会终止所有匹配的qemu进程,包括正在正常运行的虚拟机,请务必先确认virt-manager中无活跃虚拟机,或仅在虚拟机全部关闭后执行】
方法三:按libvirt domain名精准清理(推荐)
先查domain名:virsh list --all,找出状态为“shut off”但实际进程仍存活的虚拟机名(如win10-test);再执行:sudo virsh destroy win10-test。该命令会向libvirt发送强制销毁指令,由libvirt内部触发对应QEMU进程清理,比直接kill更安全可靠。
释放被残留进程占用的端口与资源
第一步:检查5900–5999范围VNC端口是否被占
执行:sudo ss -tulnp | grep ':59[0-9][0-9]',若输出中COMMAND列为qemu但无对应虚拟机,说明端口未释放。
第二步:释放TAP网卡接口
残留QEMU常会遗留tap设备,执行:ip link show | grep tap,若存在如tap0@NONE类接口,且无对应libvirt网络定义,执行:sudo ip link delete tap0(将tap0替换为实际名称)。
第三步:清空libvirt状态缓存
执行:sudo systemctl restart libvirtd。该操作会重载libvirt服务,清除其内部对已销毁虚拟机的状态记忆,避免后续virsh define时报“domain already exists”错误。

















