我试图将我的虚拟机保持在非启动状态,直到需要它们为止。然后保持它们打开,直到用户或我将它们关闭。 我正在尝试自动触发与端口 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
只要虚拟机正在运行,您就需要保持
ExecStart=
进程的运行。
如果实际的 VM 进程是间接启动的(通过 libvirt),这意味着您需要将 ExecStart 变成启动 VM 并永远等待 VM 停止的命令。更准确地说:
第3步需要
Type=notify
;它让 systemd 的依赖机制延迟 proxyd 的启动,直到虚拟机真正准备好接受连接。