diff options
Diffstat (limited to 'nixpkgs/nixos/modules/virtualisation/virtualbox-guest.nix')
-rw-r--r-- | nixpkgs/nixos/modules/virtualisation/virtualbox-guest.nix | 120 |
1 files changed, 71 insertions, 49 deletions
diff --git a/nixpkgs/nixos/modules/virtualisation/virtualbox-guest.nix b/nixpkgs/nixos/modules/virtualisation/virtualbox-guest.nix index 94f70c65436c..c2606968d3be 100644 --- a/nixpkgs/nixos/modules/virtualisation/virtualbox-guest.nix +++ b/nixpkgs/nixos/modules/virtualisation/virtualbox-guest.nix @@ -5,14 +5,32 @@ with lib; let - cfg = config.virtualisation.virtualbox.guest; kernel = config.boot.kernelPackages; -in + mkVirtualBoxUserService = serviceArgs: { + description = "VirtualBox Guest User Services ${serviceArgs}"; -{ + wantedBy = [ "graphical-session.target" ]; + partOf = [ "graphical-session.target" ]; + + # The graphical session may not be ready when starting the service + # Hence, check if the DISPLAY env var is set, otherwise fail, wait and retry again + startLimitBurst = 20; + + unitConfig.ConditionVirtualization = "oracle"; + # Check if the display environment is ready, otherwise fail + preStart = "${pkgs.bash}/bin/bash -c \"if [ -z $DISPLAY ]; then exit 1; fi\""; + serviceConfig = { + ExecStart = "@${kernel.virtualboxGuestAdditions}/bin/VBoxClient --foreground ${serviceArgs}"; + # Wait after a failure, hoping that the display environment is ready after waiting + RestartSec = 2; + Restart = "always"; + }; + }; +in +{ ###### interface options.virtualisation.virtualbox.guest = { @@ -22,32 +40,45 @@ in description = lib.mdDoc "Whether to enable the VirtualBox service and other guest additions."; }; - x11 = mkOption { + clipboard = mkOption { default = true; type = types.bool; - description = lib.mdDoc "Whether to enable x11 graphics"; + description = lib.mdDoc "Whether to enable clipboard support."; + }; + + seamless = mkOption { + default = true; + type = types.bool; + description = lib.mdDoc "Whether to enable seamless mode. When activated windows from the guest appear next to the windows of the host."; + }; + + draganddrop = mkOption { + default = true; + type = types.bool; + description = lib.mdDoc "Whether to enable drag and drop support."; }; }; ###### implementation - config = mkIf cfg.enable (mkMerge [{ - assertions = [{ - assertion = pkgs.stdenv.hostPlatform.isx86; - message = "Virtualbox not currently supported on ${pkgs.stdenv.hostPlatform.system}"; - }]; + config = mkIf cfg.enable (mkMerge [ + { + assertions = [{ + assertion = pkgs.stdenv.hostPlatform.isx86; + message = "Virtualbox not currently supported on ${pkgs.stdenv.hostPlatform.system}"; + }]; - environment.systemPackages = [ kernel.virtualboxGuestAdditions ]; + environment.systemPackages = [ kernel.virtualboxGuestAdditions ]; - boot.extraModulePackages = [ kernel.virtualboxGuestAdditions ]; + boot.extraModulePackages = [ kernel.virtualboxGuestAdditions ]; - boot.supportedFilesystems = [ "vboxsf" ]; - boot.initrd.supportedFilesystems = [ "vboxsf" ]; + boot.supportedFilesystems = [ "vboxsf" ]; + boot.initrd.supportedFilesystems = [ "vboxsf" ]; - users.groups.vboxsf.gid = config.ids.gids.vboxsf; + users.groups.vboxsf.gid = config.ids.gids.vboxsf; - systemd.services.virtualbox = - { description = "VirtualBox Guest Services"; + systemd.services.virtualbox = { + description = "VirtualBox Guest Services"; wantedBy = [ "multi-user.target" ]; requires = [ "dev-vboxguest.device" ]; @@ -58,36 +89,27 @@ in serviceConfig.ExecStart = "@${kernel.virtualboxGuestAdditions}/bin/VBoxService VBoxService --foreground"; }; - 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" - - # Allow systemd dependencies on vboxguest. - SUBSYSTEM=="misc", KERNEL=="vboxguest", TAG+="systemd" - ''; - } (mkIf cfg.x11 { - services.xserver.videoDrivers = [ "vmware" "virtualbox" "modesetting" ]; - - services.xserver.config = - '' - Section "InputDevice" - Identifier "VBoxMouse" - Driver "vboxmouse" - EndSection - ''; - - services.xserver.serverLayoutSection = - '' - InputDevice "VBoxMouse" - ''; - - services.xserver.displayManager.sessionCommands = - '' - PATH=${makeBinPath [ pkgs.gnugrep pkgs.which pkgs.xorg.xorgserver.out ]}:$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" + + # Allow systemd dependencies on vboxguest. + SUBSYSTEM=="misc", KERNEL=="vboxguest", TAG+="systemd" + ''; + + systemd.user.services.virtualboxClientVmsvga = mkVirtualBoxUserService "--vmsvga-session"; + } + ( + mkIf cfg.clipboard { + systemd.user.services.virtualboxClientClipboard = mkVirtualBoxUserService "--clipboard"; + } + ) + ( + mkIf cfg.seamless { + systemd.user.services.virtualboxClientSeamless = mkVirtualBoxUserService "--seamless"; + } + ) + ]); } |