1# Module for VirtualBox guests.
2
3{ config, lib, pkgs, ... }:
4
5with lib;
6
7let
8
9 cfg = config.virtualisation.virtualbox.guest;
10 kernel = config.boot.kernelPackages;
11
12in
13
14{
15
16 ###### interface
17
18 options.virtualisation.virtualbox.guest.enable = mkOption {
19 default = false;
20 description = "Whether to enable the VirtualBox service and other guest additions.";
21 };
22
23 ###### implementation
24
25 config = mkIf cfg.enable {
26 assertions = [ {
27 assertion = pkgs.stdenv.isi686 || pkgs.stdenv.isx86_64;
28 message = "Virtualbox not currently supported on ${pkgs.stdenv.system}";
29 } ];
30
31 environment.systemPackages = [ kernel.virtualboxGuestAdditions ];
32
33 boot.extraModulePackages = [ kernel.virtualboxGuestAdditions ];
34
35 boot.kernelModules = [ "vboxsf" ];
36
37 users.extraGroups.vboxsf.gid = config.ids.gids.vboxsf;
38
39 systemd.services.virtualbox =
40 { description = "VirtualBox Guest Services";
41
42 wantedBy = [ "multi-user.target" ];
43 requires = [ "dev-vboxguest.device" ];
44 after = [ "dev-vboxguest.device" ];
45
46 unitConfig.ConditionVirtualization = "oracle";
47
48 serviceConfig.ExecStart = "@${kernel.virtualboxGuestAdditions}/bin/VBoxService VBoxService --foreground";
49 };
50
51 services.xserver.videoDrivers = mkOverride 50 [ "virtualbox" ];
52
53 services.xserver.config =
54 ''
55 Section "InputDevice"
56 Identifier "VBoxMouse"
57 Driver "vboxmouse"
58 EndSection
59 '';
60
61 services.xserver.serverLayoutSection =
62 ''
63 InputDevice "VBoxMouse"
64 '';
65
66 services.xserver.displayManager.sessionCommands =
67 ''
68 PATH=${makeSearchPath "bin" [ pkgs.gnugrep pkgs.which pkgs.xorg.xorgserver ]}:$PATH \
69 ${kernel.virtualboxGuestAdditions}/bin/VBoxClient-all
70 '';
71
72 services.udev.extraRules =
73 ''
74 # /dev/vboxuser is necessary for VBoxClient to work. Maybe we
75 # should restrict this to logged-in users.
76 KERNEL=="vboxuser", OWNER="root", GROUP="root", MODE="0666"
77
78 # Allow systemd dependencies on vboxguest.
79 KERNEL=="vboxguest", TAG+="systemd"
80 '';
81 };
82
83}