내가 하려는 일이 가능한지 완전히 확신할 수 없습니다. 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의 후속 게시물, 왜냐하면 Anonymous가 거기서 만든 철자 실수를 복사했기 때문입니다. 정확한 철자는 입니다. 2년 반이 지난 지금도(2170 조회수) 발견되지 않았습니다. 의심할 바 없이 이것이 귀하의 다음 질문이기도 합니다.WantedBy=multi-user.target
Arch Linux 위키의 템플릿 서비스 단위는 가상 머신의 UUID에 매개변수화되어 있으며, 이는 여기서 가장 좋은 선택입니다.
추가 읽기
- "VBoxHeadless, 원격 데스크톱 서버".Oracle VM VirtualBox® 사용자 설명서: 원격 가상 머신. 2004년. 오라클 주식회사.
- "서비스를 사용하여 가상 머신 시작".가상 상자. 아치 리눅스 위키.
- 조나단 드보인 폴라드(2001). "단지 "데몬을 배경에 놓기" 위해서만 fork()를 사용하지 마세요.". Unix 데몬을 설계할 때 피해야 할 실수. 자주 주어지는 답변입니다.