CentOS 7 - Usando o systemctl para iniciar travamentos de máquina virtual sem cabeça

3

Não tenho certeza se o que estou tentando fazer pode funcionar. Eu gostaria de executar uma máquina virtual vbox como um serviço e tê-lo habilitado na inicialização. Aqui está o meu script .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

Quando tento iniciar normalmente, o meu cli pára e não bifurca o processo. Alguém tem algum pensamento / idéia / sugestão?

status systemctl me dá isso:

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.

Obrigado!

    
por sc2bigjoe 20.06.2015 / 13:24

1 resposta

5

Você tem uma incompatibilidade de protocolo de prontidão.

O Type de um serviço é importante. Essa configuração denota o protocolo de prontidão que o sistema espera que o serviço fale. Um simple service é assumido como estando imediatamente pronto. Um forking service é levado para ficar pronto após o processo inicial bifurcar um filho e sair. Um dbus service é levado para ficar pronto quando um servidor aparecer no Desktop Bus. E assim por diante.

Se você não conseguir que o protocolo de prontidão declarado na unidade de serviço corresponda ao que o serviço faz, as coisas dão errado. As incompatibilidades do protocolo de prontidão fazem com que os serviços não sejam iniciados corretamente ou (mais comumente) sejam (mal) diagnosticados pelo systemd como defeituosos. Quando um serviço é visto como falha ao iniciar porque o protocolo de prontidão nunca aciona o systemd, ele garante que cada processo adicional órfão do serviço que pode ter sido deixado em execução como parte da falha (do seu ponto de vista) seja eliminado para trazer o serviço corretamente de volta ao estado inativo.

VBoxHeadless não (inutilmente) bifurca e sai. O doco do VirtualBox afirma isso explicitamente. Portanto, a configuração correta na sua unidade de serviço é Type=simple .

A propósito, o resto de nós pode rastrear o parentesco de sua unidade de serviço para esta postagem anônima em um ArchLinux fórum provavelmente por meio de uma postagem de acompanhamento no StackOverflow , porque você copiou o erro de ortografia que o anônimo pessoa feita lá. A ortografia correta é WantedBy=multi-user.target . Isso foi dois anos e meio (e 2170 visualizações) sem ser visto. Sem dúvida, essa também teria sido sua próxima pergunta.

A unidade de serviço de modelo do wiki do Arch Linux, que é parametrizada no UUID da máquina virtual, é o caminho a seguir, aqui.

Leitura adicional

por 21.06.2015 / 13:10