Vagrant and Virtualbox fail to run in a systemd unit

I want to autostart a vagrant/virtualbox machine when I access a port on localhost. The vagrant machine is a development environment for web development.

Until now I have

{ pkgs, ... }: {
  virtualisation.virtualbox.host.enable = true;
  users.extraGroups.vboxusers.members = [ "lucc" ];
  environment.systemPackages = [ pkgs.vagrant ];
  systemd.user.sockets.vagrant.listenStreams = [ "8880" ];
  systemd.user.services.vagrant = {
    path = with pkgs; [ vagrant virtualbox curl ];
    script = "vagrant up --provision --no-tty --no-color";
    serviceConfig.WorkingDirectory = "/bla/bla/bla";
  };
}

With the first three lines I can manage the vagrant machine manually from the shell so this is good.

The user socket also correctly triggers the service when I access http://localhost:8880, so I think this is also good.

The problem seems to be the vagrant.service, when I start it it complains that it can not find virtualbox:

...
Dec 17 11:11:21 localhost vagrant-start[574619]: ==> default: Forwarding ports...
Dec 17 11:11:21 localhost vagrant-start[574619]:     default: 80 (guest) => 8880 (host) (adapter 1)
Dec 17 11:11:21 localhost vagrant-start[574619]:     default: 22 (guest) => 2222 (host) (adapter 1)
Dec 17 11:11:22 localhost vagrant-start[574619]: ==> default: Booting VM...
Dec 17 11:11:25 localhost vagrant-start[574619]: There was an error while executing `VBoxManage`, a CLI used by Vagrant
Dec 17 11:11:25 localhost vagrant-start[574619]: for controlling VirtualBox. The command and stderr is shown below.
Dec 17 11:11:25 localhost vagrant-start[574619]: Command: ["startvm", "2242e924-0f52-4644-8c92-73d3cff567f8", "--type", "headless"]
Dec 17 11:11:25 localhost vagrant-start[574619]: Stderr: VBoxManage: error: The virtual machine 'vm-infra_default_1665474807647_70636' has terminated unexpectedly during startup with exit code 1 (0x1)
Dec 17 11:11:25 localhost vagrant-start[574619]: VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component MachineWrap, interface IMachine
Dec 17 11:11:25 localhost systemd[1718]: vagrant.service: Main process exited, code=exited, status=1/FAILURE

But when I execute the start script from the systemd unit in my shell it runs jist fine.

How can I make vagrant + virtualbox work in a systemd unit? Or alternatively how can I autostart my vagrant + virtualbox machine on a NixOS system as soon as I access the port localhost:8880?

It is probably related to security wrappers and user groups.

  1. Add /run/wrappers/bin to path
  2. Make sure the user is in the vboxusers group (seems to be already)

With

script = ''
export PATH=/run/wrappers/bin:$PATH
vagrant up --provision --no-tty --no-color
'';

the error is exactly the same.

NixOS abstraction leaks here. Why?

A workaround that worked for me:

      export PATH=/run/current-system/sw/bin:$PATH

I tried this way after I realized that my user environment uses VBoxManage different from what nix repl shows, nonetheless the structure is the same it is not wrapped.

There are many vbox tools in security wrapper dir, but VBoxManage is missing,
but ti is important for systemd service too because it can show VM status.

I tried to wrap it myself - wrapping VBoxManage with a security wrapper breaks shared library discovery!

vboxmgr list vms
/nix/store/icqjg18k1066fk83wm5rjm9xvj0wsy7z-virtualbox-7.2.6/bin/VBoxManage: error while loading shared libraries: VBoxDDU.so: cannot open shared object file: No such file or directory