进一步阅读

进一步阅读

我不完全确定我想做的事情是否可行。我想将 vbox 虚拟机作为服务运行并在启动时启用它。这是我的 .service 脚本:

[Unit]
Description=Virtualbox Headless VM
Wants=network-online.target
After=network-online.target

[Service]
Type=forking
ExecStart=/usr/bin/VBoxHeadless -s vbox_uuid
ExecStop=/usr/bin/VBoxManage controlvm vbox_uuid poweroff
User=myuser

[Install]
WantedBy=muti-user.target

当我尝试正常启动时,我的 cli 挂起并且不会分叉该进程。有人有什么想法/想法/建议吗?

systemctl status 给了我这个:

Jun 20 07:17:07 localhost.localdomain systemd[1]: Starting Virtualbox Headless VM...
Jun 20 07:17:09 localhost.localdomain pulseaudio[4143]: [pulseaudio] socket-server.c: bind(): Address already in use
Jun 20 07:17:09 localhost.localdomain pulseaudio[4143]: [pulseaudio] module.c: Failed to load module "module-esound-protocol-unix" (argument: ""): initialization failed.
Jun 20 07:17:09 localhost.localdomain pulseaudio[4143]: [pulseaudio] main.c: Module load failed.
Jun 20 07:17:09 localhost.localdomain pulseaudio[4143]: [pulseaudio] main.c: Failed to initialize daemon.
Jun 20 07:17:09 localhost.localdomain pulseaudio[4140]: [pulseaudio] main.c: Daemon startup failed.
Jun 20 07:18:37 localhost.localdomain systemd[1]: vboxmachines.service operation timed out. Terminating.
Jun 20 07:18:37 localhost.localdomain systemd[1]: Failed to start Virtualbox Headless VM.
Jun 20 07:18:37 localhost.localdomain systemd[1]: Unit vboxmachines.service entered failed state.

谢谢!

答案1

您的准备协议不匹配。

Type服务的重要性很重要。该设置表示 systemd 期望服务说出什么准备协议。simple假定服务立即准备就绪。服务forking在其初始进程分叉子进程然后退出后就被视为准备就绪。dbus当桌面总线上出现服务器时,服务就被视为准备就绪。等等。

如果您没有在服务单元中声明与服务功能相匹配的就绪协议,那么事情就会出错。就绪协议不匹配会导致服务无法正确启动,或者(更常见)被 systemd(错误)诊断为失败。当某个服务因就绪协议从不触发而被视为无法启动时,systemd 会确保该服务的每个孤立的附加进程(从它的角度来看)在故障期间可能一直在运行,从而被终止,以便使该服务恢复正常运行。服务正常返回非活动状态。

VBoxHeadless不会(无用地)分叉并退出。 VirtualBox doco 明确指出了这一点。因此,您的服务单位中的正确设置是Type=simple

顺便说一下,我们其他人可以追踪你们服务单位的出身ArchLinux 论坛的匿名帖子可能通过StackOverflow 上的后续帖子,因为您复制了匿名者在那里犯的拼写错误。正确的拼写是.两年半之后(观看次数达到 2170 次),却没有被发现。毫无疑问,这也是你的下一个问题。WantedBy=multi-user.target

Arch Linux wiki 中的模板服务单元在虚拟机的 UUID 上进行参数化,这是这里的最佳选择。

进一步阅读

相关内容