# Module for VirtualBox guests. { config, pkgs, ... }: with pkgs.lib; let cfg = config.services.virtualbox; kernel = config.boot.kernelPackages; in if (pkgs.stdenv.isi686 || pkgs.stdenv.isx86_64) then { ###### interface options = { services.virtualbox = { enable = mkOption { default = false; description = "Whether to enable the VirtualBox service and other guest additions."; }; }; }; ###### implementation config = mkIf cfg.enable { environment.systemPackages = [ kernel.virtualboxGuestAdditions ]; boot.extraModulePackages = [ kernel.virtualboxGuestAdditions ]; users.extraGroups = singleton { name = "vboxsf"; }; jobs.virtualbox = { description = "VirtualBox service"; startOn = "started udev"; exec = "${kernel.virtualboxGuestAdditions}/sbin/VBoxService --foreground"; }; services.xserver.videoDrivers = mkOverride 50 [ "virtualbox" ]; services.xserver.config = '' Section "InputDevice" Identifier "VBoxMouse" Driver "vboxmouse" EndSection ''; services.xserver.serverLayoutSection = '' InputDevice "VBoxMouse" ''; services.xserver.displayManager.sessionCommands = '' PATH=${makeSearchPath "bin" [ pkgs.gnugrep pkgs.which pkgs.xorg.xorgserver ]}:$PATH \ ${kernel.virtualboxGuestAdditions}/bin/VBoxClient-all ''; services.udev.extraRules = '' # /dev/vboxuser is necessary for VBoxClient to work. Maybe we # should restrict this to logged-in users. KERNEL=="vboxuser", OWNER="root", GROUP="root", MODE="0666" ''; # Make the ACPI Shutdown command to do the right thing. services.acpid.enable = true; services.acpid.powerEventCommands = "poweroff"; }; } else {}