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.supportedFilesystems = [ "vboxsf" ];
36 boot.initrd.supportedFilesystems = [ "vboxsf" ];
37
38 users.extraGroups.vboxsf.gid = config.ids.gids.vboxsf;
39
40 systemd.services.virtualbox =
41 { description = "VirtualBox Guest Services";
42
43 wantedBy = [ "multi-user.target" ];
44 requires = [ "dev-vboxguest.device" ];
45 after = [ "dev-vboxguest.device" ];
46
47 unitConfig.ConditionVirtualization = "oracle";
48
49 serviceConfig.ExecStart = "@${kernel.virtualboxGuestAdditions}/bin/VBoxService VBoxService --foreground";
50 };
51
52 services.xserver.videoDrivers = mkOverride 50 [ "virtualbox" ];
53
54 services.xserver.config =
55 ''
56 Section "InputDevice"
57 Identifier "VBoxMouse"
58 Driver "vboxmouse"
59 EndSection
60 '';
61
62 services.xserver.serverLayoutSection =
63 ''
64 InputDevice "VBoxMouse"
65 '';
66
67 services.xserver.displayManager.sessionCommands =
68 ''
69 PATH=${makeSearchPath "bin" [ pkgs.gnugrep pkgs.which pkgs.xorg.xorgserver ]}:$PATH \
70 ${kernel.virtualboxGuestAdditions}/bin/VBoxClient-all
71 '';
72
73 services.udev.extraRules =
74 ''
75 # /dev/vboxuser is necessary for VBoxClient to work. Maybe we
76 # should restrict this to logged-in users.
77 KERNEL=="vboxuser", OWNER="root", GROUP="root", MODE="0666"
78
79 # Allow systemd dependencies on vboxguest.
80 KERNEL=="vboxguest", TAG+="systemd"
81 '';
82 };
83
84}