Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
aarch64: vmmouse and vmware video driver not yet working, but shared folders and copy & paste do work!
diff --git a/machines/vm-arch/aarch64-linux.nix b/machines/vm-arch/aarch64-linux.nix
index 7944fbc..932ce99 100644
--- a/machines/vm-arch/aarch64-linux.nix
+++ b/machines/vm-arch/aarch64-linux.nix
@@ -9,6 +9,13 @@
'';
}];
+ # Disable the default module and import our override. We have
+ # customizations to make this work on aarch64.
+ disabledModules = [ "virtualisation/vmware-guest.nix" ];
+ imports = [
+ ../../modules/vmware-guest.nix
+ ];
+
# Interface is this on M1
networking.interfaces.ens160.useDHCP = true;
@@ -16,6 +23,20 @@
nixpkgs.config.allowUnfree = true;
nixpkgs.config.allowUnsupportedSystem = true;
- # This doesn't work yet.
- virtualisation.vmware.guest.enable = false;
+ # This works through our custom module imported above
+ virtualisation.vmware.guest.enable = true;
+
+ # Share our host filesystem
+ fileSystems."/host" = {
+ fsType = "fuse./run/current-system/sw/bin/vmhgfs-fuse";
+ device = ".host:/";
+ options = [
+ "umask=22"
+ "uid=1000"
+ "gid=1000"
+ "allow_other"
+ "auto_unmount"
+ "defaults"
+ ];
+ };
}
diff --git a/modules/vmware-guest.nix b/modules/vmware-guest.nix
new file mode 100644
index 0000000..e731b4a
--- /dev/null
+++ b/modules/vmware-guest.nix
@@ -0,0 +1,85 @@
+{ 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;
+ xf86inputvmmouse = pkgs.xorg.xf86inputvmmouse;
+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.kernelModules = [ "vmw_pvscsi" ];
+
+ environment.systemPackages = [ open-vm-tools ];
+
+ systemd.services.vmware =
+ { description = "VMWare Guest Service";
+ wantedBy = [ "multi-user.target" ];
+ 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" ];
+ before = [ "vmware.service" ];
+ wants = [ "vmware.service" ];
+ 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 = mkIf (!cfg.headless) {
+ # TODO: these don't compile yet
+ #videoDrivers = mkOverride 50 [ "vmware" ];
+ #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 ];
+ };
+}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment