You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过systemd套接字触发KVM-QEMU虚拟机启动及代理服务管理

KVM-QEMU虚拟机systemd套接字触发启动问题解决

问题1:同端口套接字触发KVM启动(解决启动次数超限)

启动次数超限的核心原因是套接字监听与QEMU端口绑定冲突,加上systemd未正确识别服务就绪状态。以下是修正后的配置:

  1. 创建并配置kvm1.socket(路径:/etc/systemd/system/kvm1.socket):
[Unit]
Description=KVM VM VNC触发套接字

[Socket]
ListenStream=5900
Accept=no
SocketMode=0666

[Install]
WantedBy=sockets.target
  • Accept=no:指定单套接字模式,直接将监听的端口传递给服务进程,而非生成多个实例。
  1. 创建并配置kvm1.service(路径:/etc/systemd/system/kvm1.service):
[Unit]
Description=KVM虚拟机服务
Requires=kvm1.socket
After=network.target kvm1.socket

[Service]
Type=notify
ExecStart=/usr/bin/qemu-system-x86_64 \
    -enable-kvm \
    -m 2048 \
    -drive file=/var/lib/libvirt/images/kvm1.qcow2,format=qcow2 \
    -vnc fd:3 -display none \
    -monitor unix:/tmp/kvm1-monitor.sock,server,nowait \
    -device virtio-net-pci,netdev=net0 \
    -netdev user,id=net0,hostfwd=tcp::2222-:22
ExecStop=/usr/bin/qemu-monitor-command -h unix:/tmp/kvm1-monitor.sock 'system_powerdown'
Restart=on-failure
RestartSec=5
TimeoutStartSec=30
NotifyAccess=all

[Install]
WantedBy=multi-user.target

关键配置说明:

  • Type=notify:让QEMU向systemd发送就绪信号,避免systemd误判服务启动失败
  • -vnc fd:3:直接使用systemd传递的文件描述符3(对应socket监听的5900端口),避免端口冲突
  • TimeoutStartSec=30:延长启动超时时间,适配虚拟机启动的耗时
  1. 生效配置:
systemctl daemon-reload
systemctl enable --now kvm1.socket

问题2:代理服务随虚拟机关机自动停用

代理服务持续活跃的原因是未与虚拟机服务建立绑定关系,导致虚拟机关机后代理未被触发停止。以下是基于socat代理的修正配置:

  1. 创建并配置kvm1-proxy.socket(路径:/etc/systemd/system/kvm1-proxy.socket):
[Unit]
Description=KVM VNC代理触发套接字

[Socket]
ListenStream=5888
Accept=no
SocketMode=0666

[Install]
WantedBy=sockets.target
  1. 创建并配置kvm1-proxy.service(路径:/etc/systemd/system/kvm1-proxy.service):
[Unit]
Description=KVM VNC代理服务
Requires=kvm1-proxy.socket
Wants=kvm1.service
After=kvm1.service
BindsTo=kvm1.service

[Service]
Type=simple
ExecStart=/usr/bin/socat TCP-LISTEN:5888,reuseaddr,fork UNIX-CONNECT:/tmp/kvm1-vnc.sock
ExecStopPost=/usr/bin/systemctl stop kvm1-proxy.socket
Restart=on-abnormal
TimeoutStopSec=5

[Install]
WantedBy=multi-user.target

关键配置说明:

  • BindsTo=kvm1.service:强制绑定虚拟机服务,当kvm1.service停止时,代理服务自动终止
  • ExecStopPost=/usr/bin/systemctl stop kvm1-proxy.socket:代理停止后关闭监听套接字,确保下次连接能重新触发启动流程
  • Wants=kvm1.service:启动代理时自动触发虚拟机服务启动
  1. 生效配置:
systemctl daemon-reload
systemctl enable --now kvm1-proxy.socket

内容的提问来源于stack exchange,提问作者João Mamede

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 20:13:13