qgroundcontrol: 4.4.2 -> 4.4.3 (#360956)
[NixPkgs.git] / nixos / modules / virtualisation / virtualbox-guest.nix
blob48eb4528a232f475b387f3e81a16b77cf230c372
1 # Module for VirtualBox guests.
3   config,
4   lib,
5   pkgs,
6   ...
7 }:
8 let
9   cfg = config.virtualisation.virtualbox.guest;
10   kernel = config.boot.kernelPackages;
12   mkVirtualBoxUserService = serviceArgs: {
13     description = "VirtualBox Guest User Services ${serviceArgs}";
15     wantedBy = [ "graphical-session.target" ];
16     partOf = [ "graphical-session.target" ];
18     # The graphical session may not be ready when starting the service
19     # Hence, check if the DISPLAY env var is set, otherwise fail, wait and retry again
20     startLimitBurst = 20;
22     unitConfig.ConditionVirtualization = "oracle";
24     # Check if the display environment is ready, otherwise fail
25     preStart = "${pkgs.bash}/bin/bash -c \"if [ -z $DISPLAY ]; then exit 1; fi\"";
26     serviceConfig = {
27       ExecStart = "@${kernel.virtualboxGuestAdditions}/bin/VBoxClient --foreground ${serviceArgs}";
28       # Wait after a failure, hoping that the display environment is ready after waiting
29       RestartSec = 2;
30       Restart = "always";
31     };
32   };
35   imports = [
36     (lib.mkRenamedOptionModule
37       [
38         "virtualisation"
39         "virtualbox"
40         "guest"
41         "draganddrop"
42       ]
43       [
44         "virtualisation"
45         "virtualbox"
46         "guest"
47         "dragAndDrop"
48       ]
49     )
50   ];
52   options.virtualisation.virtualbox.guest = {
53     enable = lib.mkOption {
54       default = false;
55       type = lib.types.bool;
56       description = "Whether to enable the VirtualBox service and other guest additions.";
57     };
59     clipboard = lib.mkOption {
60       default = true;
61       type = lib.types.bool;
62       description = "Whether to enable clipboard support.";
63     };
65     seamless = lib.mkOption {
66       default = true;
67       type = lib.types.bool;
68       description = "Whether to enable seamless mode. When activated windows from the guest appear next to the windows of the host.";
69     };
71     dragAndDrop = lib.mkOption {
72       default = true;
73       type = lib.types.bool;
74       description = "Whether to enable drag and drop support.";
75     };
76   };
78   ###### implementation
80   config = lib.mkIf cfg.enable (
81     lib.mkMerge [
82       {
83         assertions = [
84           {
85             assertion = pkgs.stdenv.hostPlatform.isx86;
86             message = "Virtualbox not currently supported on ${pkgs.stdenv.hostPlatform.system}";
87           }
88         ];
90         environment.systemPackages = [ kernel.virtualboxGuestAdditions ];
92         boot.extraModulePackages = [ kernel.virtualboxGuestAdditions ];
94         boot.supportedFilesystems = [ "vboxsf" ];
95         boot.initrd.supportedFilesystems = [ "vboxsf" ];
97         users.groups.vboxsf.gid = config.ids.gids.vboxsf;
99         systemd.services.virtualbox = {
100           description = "VirtualBox Guest Services";
102           wantedBy = [ "multi-user.target" ];
103           requires = [ "dev-vboxguest.device" ];
104           after = [ "dev-vboxguest.device" ];
106           unitConfig.ConditionVirtualization = "oracle";
108           serviceConfig.ExecStart = "@${kernel.virtualboxGuestAdditions}/bin/VBoxService VBoxService --foreground";
109         };
111         services.udev.extraRules = ''
112           # /dev/vboxuser is necessary for VBoxClient to work.  Maybe we
113           # should restrict this to logged-in users.
114           KERNEL=="vboxuser",  OWNER="root", GROUP="root", MODE="0666"
116           # Allow systemd dependencies on vboxguest.
117           SUBSYSTEM=="misc", KERNEL=="vboxguest", TAG+="systemd"
118         '';
120         systemd.user.services.virtualboxClientVmsvga = mkVirtualBoxUserService "--vmsvga-session";
121       }
122       (lib.mkIf cfg.clipboard {
123         systemd.user.services.virtualboxClientClipboard = mkVirtualBoxUserService "--clipboard";
124       })
125       (lib.mkIf cfg.seamless {
126         systemd.user.services.virtualboxClientSeamless = mkVirtualBoxUserService "--seamless";
127       })
128       (lib.mkIf cfg.dragAndDrop {
129         systemd.user.services.virtualboxClientDragAndDrop = mkVirtualBoxUserService "--draganddrop";
130       })
131     ]
132   );