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}