我不完全确定我想做的事情是否可行。我想将 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 上进行参数化,这是这里的最佳选择。
进一步阅读
- “VBoxHeadless,远程桌面服务器”。Oracle VM VirtualBox® 用户手册:远程虚拟机。 2004 年。甲骨文公司。
- “使用服务启动虚拟机”。虚拟盒子。 Arch Linux 维基。
- 乔纳森·德博因·波拉德 (2001)。 ”不要为了“将守护进程置于后台”而使用 fork()。”。 设计 Unix 守护程序时要避免的错误。经常给出的答案。