summaryrefslogtreecommitdiff
path: root/profiles/vmware-guest.nix
diff options
context:
space:
mode:
authorMike Vink <mike@pionative.com>2024-06-25 11:33:40 +0200
committerMike Vink <mike@pionative.com>2024-06-25 11:33:40 +0200
commitc7cb36d521a8d2b9a2f87cc02ed5f8ba9df39656 (patch)
treeb132f7b2d31ec5c8ddb71b0a9bd91fa78ce32eed /profiles/vmware-guest.nix
parentbb0cb5b43f4c709bde7d4ea1c5a090a071b77d54 (diff)
first version with arm vm
Diffstat (limited to 'profiles/vmware-guest.nix')
-rw-r--r--profiles/vmware-guest.nix91
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 ];
+ };
+}
+