diff options
| author | Mike Vink <mike@pionative.com> | 2024-06-25 11:33:40 +0200 |
|---|---|---|
| committer | Mike Vink <mike@pionative.com> | 2024-06-25 11:33:40 +0200 |
| commit | c7cb36d521a8d2b9a2f87cc02ed5f8ba9df39656 (patch) | |
| tree | b132f7b2d31ec5c8ddb71b0a9bd91fa78ce32eed /profiles/vmware-guest.nix | |
| parent | bb0cb5b43f4c709bde7d4ea1c5a090a071b77d54 (diff) | |
first version with arm vm
Diffstat (limited to 'profiles/vmware-guest.nix')
| -rw-r--r-- | profiles/vmware-guest.nix | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/profiles/vmware-guest.nix b/profiles/vmware-guest.nix new file mode 100644 index 0000000..7dc8ef2 --- /dev/null +++ b/profiles/vmware-guest.nix @@ -0,0 +1,91 @@ +# This is based on the official vmware-guest module, but modified +# for aarch64 to disable certain features and add support. I'm unsure +# how to upstream this because I just don't use certain features... maybe +# making them toggle-able? I'm not sure. + +{ config, lib, pkgs, ... }: + +with lib; + +let + cfg = config.virtualisation.vmware.guest; + open-vm-tools = if cfg.headless then pkgs.open-vm-tools-headless else pkgs.open-vm-tools; +in +{ + imports = [ + (mkRenamedOptionModule [ "services" "vmwareGuest" ] [ "virtualisation" "vmware" "guest" ]) + ]; + + options.virtualisation.vmware.guest = { + enable = mkEnableOption "VMWare Guest Support"; + headless = mkOption { + type = types.bool; + default = false; + description = "Whether to disable X11-related features."; + }; + }; + + config = mkIf cfg.enable { + assertions = [ { + assertion = pkgs.stdenv.isi686 || pkgs.stdenv.isx86_64 || pkgs.stdenv.isAarch64; + message = "VMWare guest is not currently supported on ${pkgs.stdenv.hostPlatform.system}"; + } ]; + + boot.initrd.availableKernelModules = [ "mptspi" ]; + # boot.initrd.kernelModules = [ "vmw_pvscsi" ]; + + environment.systemPackages = [ open-vm-tools ]; + + systemd.services.vmware = + { description = "VMWare Guest Service"; + wantedBy = [ "multi-user.target" ]; + after = [ "display-manager.service" ]; + unitConfig.ConditionVirtualization = "vmware"; + serviceConfig.ExecStart = "${open-vm-tools}/bin/vmtoolsd"; + }; + + # Mount the vmblock for drag-and-drop and copy-and-paste. + systemd.mounts = [ + { + description = "VMware vmblock fuse mount"; + documentation = [ "https://github.com/vmware/open-vm-tools/blob/master/open-vm-tools/vmblock-fuse/design.txt" ]; + unitConfig.ConditionVirtualization = "vmware"; + what = "${open-vm-tools}/bin/vmware-vmblock-fuse"; + where = "/run/vmblock-fuse"; + type = "fuse"; + options = "subtype=vmware-vmblock,default_permissions,allow_other"; + wantedBy = [ "multi-user.target" ]; + } + ]; + + security.wrappers.vmware-user-suid-wrapper = + { setuid = true; + owner = "root"; + group = "root"; + source = "${open-vm-tools}/bin/vmware-user-suid-wrapper"; + }; + + environment.etc.vmware-tools.source = "${open-vm-tools}/etc/vmware-tools/*"; + + services.xserver = { + # TODO: does not build on aarch64 + # modules = [ xf86inputvmmouse ]; + + config = '' + Section "InputClass" + Identifier "VMMouse" + MatchDevicePath "/dev/input/event*" + MatchProduct "ImPS/2 Generic Wheel Mouse" + Driver "vmmouse" + EndSection + ''; + + displayManager.sessionCommands = '' + ${open-vm-tools}/bin/vmware-user-suid-wrapper + ''; + }; + + services.udev.packages = [ open-vm-tools ]; + }; +} + |
