通过 systemd 套接字连接到 VNC 端口后如何启动 KVM-QEMU 虚拟机?

问题描述 投票:0回答:1

我试图将我的虚拟机保持在非启动状态,直到需要它们为止。然后保持它们打开,直到用户或我将它们关闭。 我正在尝试自动触发与端口 5900 中的 VNC 服务器的连接。(示例#1)或将其通过管道传输到稍后代理到端口 5900 的另一个端口(示例#2)。 现在我有 Cloudfare 隧道,可以直接在浏览器上呈现 VNC。我尝试了两种不同的方法:

第一个想法 kvm1.socket(端口 5900) kvm1.service(在端口 5900 中使用 VNC 启动虚拟机)

第二个想法: kvm1-proxy.socket(端口 5888) kvm1-proxy.service(传输到5900端口) kvm1.service(在端口 5900 中使用 VNC 启动虚拟机)

第一个想法的配置文件 kvm1.socket

[Unit]
Description=KVM1 VM socket

[Socket]
ListenStream=5900
NoDelay=true
DeferAcceptSec=15
[Install]
WantedBy=sockets.target
     

kvm1.服务

[Unit]
Description = kvm1
After=network.target
[Service]
Type=notify
ExecStart=virsh start ubuntu23.10-kvm1
#ExecStartPost=/usr/local/bin/waitport 127.0.0.1 5900 #This is somewhat a script to do "sleep every 0.1 until port is open"
#ExecStop=virsh shutdown ubuntu23.10-kvm1

[Install]
WantedBy=multi-user.target

结果来自: $ sudo systemctl 启用 kvm1.socket $ sudo systemctl 启动 kvm1.socket

socket监听5900端口 一旦我连接到它:

Feb 26 00:16:46 hostname systemd[1]: Listening on kvm1.socket - KVM1 VM socket. Feb 26 00:17:53 hostname systemd[1]: kvm1.socket: Failed with result 'service-start-limit-hit'.
Feb 26 00:17:52 hostname systemd[1]: Starting kvm1.service - kvm1...
Feb 26 00:17:53 hostname virsh[2120685]: error: Failed to start domain 'ubuntu23.10-kvm1' Feb 26 00:17:53 hostname virsh[2120685]: error: internal error: QEMU unexpectedly closed the monitor (vm='ubuntu23.>
Feb 26 00:17:53 hostname systemd[1]: kvm1.service: Main process exited, code=exited, status=1/FAILURE Feb 26 00:17:53 hostname
systemd[1]: kvm1.service: Failed with result 'exit-code'. 
Feb 26 00:17:53 hostname systemd[1]: Failed to start kvm1.service - kvm1. 
Feb 26 00:17:53 hostname systemd[1]: kvm1.service: Start request repeated too quickly.
Feb 26 00:17:53 hostname systemd[1]: kvm1.service: Failed with result 'exit-code'.    
Feb 26 00:17:53 hostname systemd[1]: Failed to start kvm1.service - kvm1.

我可以在使用相同端口的同时进行套接字启动 KVM 吗?

测试第二个想法连接到5888(通过浏览器中的cloudflare)并将其代理到端口5900。

kvm1-proxy.socket

[Unit]
Description=KVM1 VM socket

[Socket]
ListenStream=5888
NoDelay=true
DeferAcceptSec=15
[Install]
WantedBy=sockets.target

kvm1-proxy.service

[Unit]
Requires=kvm1.service
After=kvm1.service

[Service]
ExecStart=/lib/systemd/systemd-socket-proxyd 127.0.0.1:5900

kvm1.服务

[Unit]
Description=kvm1

[Service]
ExecStart=virsh start ubuntu23.10-kvm1
ExecStartPost=/bin/sleep 1
ExecStop=virsh shutdown ubuntu23.10-kvm1

[Install]
WantedBy=multi-user.target

结果来自: $ sudo systemctl 启用 kvm1-proxy.socket $ sudo systemctl 启动 kvm1-proxy.socket

$ sudo systemctl 状态 kvm1-proxy.socket

Active: active (listening) since Mon 2024-02-26 00:28:13 CST; 1min 48s ago    
Triggers: ● kvm1-proxy.service
Listen: [::]:5888 (Stream)

Feb 26 00:28:13 hostname systemd[1]: Listening on kvm1-proxy.socket - KVM1 VM socket.

KVM1.service启动,虚拟机工作。

现在,如何在关闭虚拟机时使 kvm1-proxy.socket 停用? 基本上,就像这样它永远保持活跃状态。

kvm1-proxy.service  Loaded: loaded (/etc/systemd/system/kvm1-proxy.service; static)  Active: active (running) since Mon 2024-02-26 00:31:39 CST; 4min 12s ago  TriggeredBy: ● kvm1-proxy.socket    Main PID: 2138322 (systemd-socket-)  Tasks: 2 (limit: 154233)  Memory: 1.0M    CPU: 6ms  CGroup: /system.slice/kvm1-proxy.service
       └─2138322 /lib/systemd/systemd-socket-proxyd 127.0.0.1:5900

Feb 26 00:31:39 hostname systemd[1]: Started kvm1-proxy.service.   
Feb 26 00:31:39 hostname systemd-socket-proxyd[2138322]: Failed to connect to remote host: Connection refused

其想法是它保持打开状态,直到用户将其关闭(在虚拟机关闭或使用 virsh shutdown ubuntu23.10-kvm1 中)。 systemd status 看到它处于非活动状态(无论是运行还是关闭)。因此 kvm1-proxy.service 保持“活动”并且永远不会在另一个周期启动机器。有什么方法可以让 systemd 知道虚拟机何时关闭并且 proxy.service 何时关闭?

kvm1.service - kvm1
  Loaded: loaded (/etc/systemd/system/kvm1.service; disabled; preset: enabled)
  Active: inactive (dead) since Mon 2024-02-26 00:31:40 CST; 4min 37s ago    Duration: 664ms
  Process: 2138228 ExecStart=virsh start ubuntu23.10-kvm1 (code=exited, status=0/SUCCESS)
  Process: 2138229 ExecStartPost=/bin/sleep 1 (code=exited, status=0/SUCCESS)
  Process: 2138370 ExecStop=virsh shutdown ubuntu23.10-kvm1 (code=exited, status=0/SUCCESS)    Main PID: 2138228 (code=exited,
status=0/SUCCESS CPU: 46ms
linux qemu systemd kvm
1个回答
0
投票

只要虚拟机正在运行,您就需要保持

ExecStart=
进程的运行。

如果实际的 VM 进程是间接启动的(通过 libvirt),这意味着您需要将 ExecStart 变成启动 VM 并永远等待 VM 停止的命令。更准确地说:

  1. 发出 virsh 命令,
  2. 等待 libvirt 指示虚拟机已启动(您可以在此处使用等待端口,但连接到 libvirt 会更好)
  3. 向 systemd 的 $NOTIFY_SOCKET 发送 READY=1 消息,
  4. 永远等待 libvirt 指示虚拟机不再启动,
  5. 退出。

第3步需要

Type=notify
;它让 systemd 的依赖机制延迟 proxyd 的启动,直到虚拟机真正准备好接受连接。

© www.soinside.com 2019 - 2024. All rights reserved.