about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSandro <sandro.jaeckel@gmail.com>2022-05-04 14:13:12 +0200
committerGitHub <noreply@github.com>2022-05-04 14:13:12 +0200
commitaacb7ef4a6bcc963a1c340eb3c831d9180e5fa3b (patch)
tree366b7410c49bf72ab5318fbb47e65145bcb5e743
parent9b3cfba4ba88b79d0fc91ba76938ea1df8c87460 (diff)
parent3e8e52bb91d0da2a06c24ae70975f8ba309eb214 (diff)
Merge pull request #169966 from deinferno/vmware-host
-rw-r--r--maintainers/maintainer-list.nix6
-rw-r--r--nixos/modules/module-list.nix1
-rw-r--r--nixos/modules/virtualisation/vmware-host.nix166
-rwxr-xr-xpkgs/applications/virtualization/vmware-workstation/default.nix341
-rw-r--r--pkgs/applications/virtualization/vmware-workstation/vmware-bootstrap11
-rw-r--r--pkgs/applications/virtualization/vmware-workstation/vmware-config21
-rw-r--r--pkgs/applications/virtualization/vmware-workstation/vmware-installer-bootstrap5
-rw-r--r--pkgs/applications/virtualization/vmware-workstation/vmware-modconfig8
-rw-r--r--pkgs/os-specific/linux/vmware/default.nix47
-rw-r--r--pkgs/top-level/all-packages.nix2
-rw-r--r--pkgs/top-level/linux-kernels.nix2
11 files changed, 610 insertions, 0 deletions
diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix
index 4fe7333b08fb6..526d5e779d50d 100644
--- a/maintainers/maintainer-list.nix
+++ b/maintainers/maintainer-list.nix
@@ -14205,6 +14205,12 @@
     github = "deifactor";
     githubId = 30192992;
   };
+  deinferno = {
+    name = "deinferno";
+    email = "14363193+deinferno@users.noreply.github.com";
+    github = "deinferno";
+    githubId = 14363193;
+  };
   fzakaria = {
     name = "Farid Zakaria";
     email = "farid.m.zakaria@gmail.com";
diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index d1cda0d84e96b..9d9f2e9057cc0 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -1256,6 +1256,7 @@
   ./virtualisation/virtualbox-guest.nix
   ./virtualisation/virtualbox-host.nix
   ./virtualisation/vmware-guest.nix
+  ./virtualisation/vmware-host.nix
   ./virtualisation/waydroid.nix
   ./virtualisation/xen-dom0.nix
   ./virtualisation/xe-guest-utilities.nix
diff --git a/nixos/modules/virtualisation/vmware-host.nix b/nixos/modules/virtualisation/vmware-host.nix
new file mode 100644
index 0000000000000..faa0d455c9d6b
--- /dev/null
+++ b/nixos/modules/virtualisation/vmware-host.nix
@@ -0,0 +1,166 @@
+{ config, pkgs, lib, ... }:
+
+let
+  cfg = config.virtualisation.vmware.host;
+  wrapperDir = "/run/vmware/bin"; # Perfectly fits as /usr/local/bin
+  parentWrapperDir = dirOf wrapperDir;
+  vmwareWrappers = # Needed as hardcoded paths workaround
+    let mkVmwareSymlink =
+      program:
+      ''
+        ln -s "${config.security.wrapperDir}/${program}" $wrapperDir/${program}
+      '';
+    in
+    [
+      (mkVmwareSymlink "pkexec")
+      (mkVmwareSymlink "mount")
+      (mkVmwareSymlink "umount")
+    ];
+in
+{
+  options = with lib; {
+    virtualisation.vmware.host = {
+      enable = mkEnableOption "VMware" // {
+        description = ''
+          This enables VMware host virtualisation for running VMs.
+
+          <important><para>
+          <literal>vmware-vmx</literal> will cause kcompactd0 due to
+          <literal>Transparent Hugepages</literal> feature in kernel.
+          Apply <literal>[ "transparent_hugepage=never" ]</literal> in
+          option <option>boot.kernelParams</option> to disable them.
+          </para></important>
+
+          <note><para>
+          If that didn't work disable <literal>TRANSPARENT_HUGEPAGE</literal>,
+          <literal>COMPACTION</literal> configs and recompile kernel.
+          </para></note>
+        '';
+      };
+      package = mkOption {
+        type = types.package;
+        default = pkgs.vmware-workstation;
+        defaultText = literalExpression "pkgs.vmware-workstation";
+        description = "VMware host virtualisation package to use";
+      };
+      extraPackages = mkOption {
+        type = with types; listOf package;
+        default = with pkgs; [ ];
+        description = "Extra packages to be used with VMware host.";
+        example = "with pkgs; [ ntfs3g ]";
+      };
+      extraConfig = mkOption {
+        type = types.lines;
+        default = "";
+        description = "Add extra config to /etc/vmware/config";
+        example = ''
+          # Allow unsupported device's OpenGL and Vulkan acceleration for guest vGPU
+          mks.gl.allowUnsupportedDrivers = "TRUE"
+          mks.vk.allowUnsupportedDevices = "TRUE"
+        '';
+      };
+    };
+  };
+
+  config = lib.mkIf cfg.enable {
+    boot.extraModulePackages = [ config.boot.kernelPackages.vmware ];
+    boot.extraModprobeConfig = "alias char-major-10-229 fuse";
+    boot.kernelModules = [ "vmw_pvscsi" "vmw_vmci" "vmmon" "vmnet" "fuse" ];
+
+    environment.systemPackages = [ cfg.package ] ++ cfg.extraPackages;
+    services.printing.drivers = [ cfg.package ];
+
+    environment.etc."vmware/config".text = ''
+      ${builtins.readFile "${cfg.package}/etc/vmware/config"}
+      ${cfg.extraConfig}
+    '';
+
+    environment.etc."vmware/bootstrap".source = "${cfg.package}/etc/vmware/bootstrap";
+    environment.etc."vmware/icu".source = "${cfg.package}/etc/vmware/icu";
+    environment.etc."vmware-installer".source = "${cfg.package}/etc/vmware-installer";
+
+    # SUID wrappers
+
+    security.wrappers = {
+      vmware-vmx = {
+        setuid = true;
+        owner = "root";
+        group = "root";
+        source = "${cfg.package}/lib/vmware/bin/.vmware-vmx-wrapped";
+      };
+    };
+
+    ###### wrappers activation script
+
+    system.activationScripts.vmwareWrappers =
+      lib.stringAfter [ "specialfs" "users" ]
+        ''
+          mkdir -p "${parentWrapperDir}"
+          chmod 755 "${parentWrapperDir}"
+          # We want to place the tmpdirs for the wrappers to the parent dir.
+          wrapperDir=$(mktemp --directory --tmpdir="${parentWrapperDir}" wrappers.XXXXXXXXXX)
+          chmod a+rx "$wrapperDir"
+          ${lib.concatStringsSep "\n" (vmwareWrappers)}
+          if [ -L ${wrapperDir} ]; then
+            # Atomically replace the symlink
+            # See https://axialcorps.com/2013/07/03/atomically-replacing-files-and-directories/
+            old=$(readlink -f ${wrapperDir})
+            if [ -e "${wrapperDir}-tmp" ]; then
+              rm --force --recursive "${wrapperDir}-tmp"
+            fi
+            ln --symbolic --force --no-dereference "$wrapperDir" "${wrapperDir}-tmp"
+            mv --no-target-directory "${wrapperDir}-tmp" "${wrapperDir}"
+            rm --force --recursive "$old"
+          else
+            # For initial setup
+            ln --symbolic "$wrapperDir" "${wrapperDir}"
+          fi
+        '';
+
+    # Services
+
+    systemd.services."vmware-authdlauncher" = {
+      description = "VMware Authentification Daemon";
+      serviceConfig = {
+        Type = "forking";
+        ExecStart = [ "${cfg.package}/bin/vmware-authdlauncher" ];
+      };
+      wantedBy = [ "multi-user.target" ];
+    };
+
+    systemd.services."vmware-networks-configuration" = {
+      description = "VMware Networks Configuration Generation";
+      unitConfig.ConditionPathExists = "!/etc/vmware/networking";
+      serviceConfig = {
+        UMask = "0077";
+        ExecStart = [
+          "${cfg.package}/bin/vmware-networks --postinstall vmware-player,0,1"
+        ];
+        Type = "oneshot";
+        RemainAfterExit = "yes";
+      };
+      wantedBy = [ "multi-user.target" ];
+    };
+
+    systemd.services."vmware-networks" = {
+      description = "VMware Networks";
+      after = [ "vmware-networks-configuration.service" ];
+      requires = [ "vmware-networks-configuration.service" ];
+      serviceConfig = {
+        Type = "forking";
+        ExecCondition = [ "${pkgs.kmod}/bin/modprobe vmnet" ];
+        ExecStart = [ "${cfg.package}/bin/vmware-networks --start" ];
+        ExecStop = [ "${cfg.package}/bin/vmware-networks --stop" ];
+      };
+      wantedBy = [ "multi-user.target" ];
+    };
+
+    systemd.services."vmware-usbarbitrator" = {
+      description = "VMware USB Arbitrator";
+      serviceConfig = {
+        ExecStart = [ "${cfg.package}/bin/vmware-usbarbitrator -f" ];
+      };
+      wantedBy = [ "multi-user.target" ];
+    };
+  };
+}
diff --git a/pkgs/applications/virtualization/vmware-workstation/default.nix b/pkgs/applications/virtualization/vmware-workstation/default.nix
new file mode 100755
index 0000000000000..58cd4092a95d5
--- /dev/null
+++ b/pkgs/applications/virtualization/vmware-workstation/default.nix
@@ -0,0 +1,341 @@
+{ stdenv
+, buildFHSUserEnv
+, fetchurl
+, lib
+, zlib
+, gdbm
+, bzip2
+, libxslt
+, libxml2
+, libuuid
+, readline
+, xz
+, cups
+, glibc
+, libaio
+, vulkan-loader
+, alsa-lib
+, libpulseaudio
+, libGL
+, numactl
+, libX11
+, libXi
+, kmod
+, python3
+, autoPatchelfHook
+, makeWrapper
+, sqlite
+, enableInstaller ? false
+}:
+
+let
+  vmware-unpack-env = buildFHSUserEnv rec {
+    name = "vmware-unpack-env";
+    targetPkgs = pkgs: [ zlib ];
+  };
+  gdbm3 = gdbm.overrideAttrs (old: rec {
+    version = "1.8.3";
+
+    src = fetchurl {
+      url = "mirror://gnu/gdbm/gdbm-${version}.tar.gz";
+      sha256 = "sha256-zDQDOKLii0AFirnrU1SiHVP4ihWC6iG6C7GFw3ooHck=";
+    };
+
+    installPhase = ''
+      mkdir -p $out/lib
+      cp .libs/libgdbm*.so* $out/lib/
+    '';
+  });
+in
+stdenv.mkDerivation rec {
+  pname = "vmware-workstation";
+  version = "16.2.3";
+  build = "19376536";
+
+  buildInputs = [
+    libxslt
+    libxml2
+    libuuid
+    gdbm3
+    readline
+    xz
+    cups
+    glibc
+    libaio
+    vulkan-loader
+    alsa-lib
+    libpulseaudio
+    libGL
+    numactl
+    libX11
+    libXi
+    kmod
+  ];
+
+  nativeBuildInputs = [ python3 vmware-unpack-env autoPatchelfHook makeWrapper ]
+    ++ lib.optionals enableInstaller [ sqlite bzip2 ];
+
+  src = fetchurl {
+    url = "https://download3.vmware.com/software/WKST-1623-LX-New/VMware-Workstation-Full-${version}-${build}.x86_64.bundle";
+    sha256 = "sha256-+JE1KnRfawcaBannIyEr1TNZTF7YXRYYaFMVq0/erbM=";
+  };
+
+  unpackPhase = ''
+    ${vmware-unpack-env}/bin/vmware-unpack-env -c "sh ${src} --extract unpacked"
+  '';
+
+  installPhase = ''
+    mkdir -p \
+      $out/bin \
+      $out/etc/vmware \
+      $out/etc/init.d \
+      $out/lib/vmware \
+      $out/share/doc
+
+    #### Replicate vmware-installer's order but VMX first because of appLoader
+    ${lib.optionalString enableInstaller ''
+      ## VMware installer
+      echo "Installing VMware Installer"
+      unpacked="unpacked/vmware-installer"
+      vmware_installer_version=$(cat "unpacked/vmware-installer/manifest.xml" | grep -oPm1 "(?<=<version>)[^<]+")
+      dest="$out/lib/vmware-installer/$vmware_installer_version"
+
+      mkdir -p $dest
+      cp -r $unpacked/vmis* $dest/
+      cp -r $unpacked/sopython $dest/
+      cp -r $unpacked/python $dest/
+      cp -r $unpacked/cdsHelper $dest/
+      cp -r $unpacked/vmware* $dest/
+      cp -r $unpacked/bin $dest/
+      cp -r $unpacked/lib $dest/
+
+      chmod +x $dest/vmis-launcher $dest/sopython/* $dest/python/init.sh $dest/vmware-*
+      ln -s $dest/vmware-installer $out/bin/vmware-installer
+
+      mkdir -p $out/etc/vmware-installer
+      cp ${./vmware-installer-bootstrap} $out/etc/vmware-installer/bootstrap
+      sed -i -e "s,@@INSTALLERDIR@@,$dest," $out/etc/vmware-installer/bootstrap
+      sed -i -e "s,@@IVERSION@@,$vmware_installer_version," $out/etc/vmware-installer/bootstrap
+      sed -i -e "s,@@BUILD@@,${build}," $out/etc/vmware-installer/bootstrap
+
+      # create database of vmware guest tools (avoids vmware fetching them later)
+      mkdir -p $out/etc/vmware-installer/components
+      database_filename=$out/etc/vmware-installer/database
+      touch $database_filename
+      sqlite3 "$database_filename" "CREATE TABLE settings(key VARCHAR PRIMARY KEY, value VARCHAR NOT NULL, component_name VARCHAR NOT NULL);"
+      sqlite3 "$database_filename" "INSERT INTO settings(key,value,component_name) VALUES('db.schemaVersion','2','vmware-installer');"
+      sqlite3 "$database_filename" "CREATE TABLE components(id INTEGER PRIMARY KEY, name VARCHAR NOT NULL, version VARCHAR NOT NULL, buildNumber INTEGER NOT NULL, component_core_id INTEGER NOT NULL, longName VARCHAR NOT NULL, description VARCHAR, type INTEGER NOT NULL);"
+      for folder in unpacked/**/.installer ; do
+        component="$(basename $(dirname $folder))"
+        component_version=$(cat unpacked/$component/manifest.xml | grep -oPm1 "(?<=<version>)[^<]+")
+        component_core_id=$([ "$component" == "vmware-installer" ] && echo "-1" || echo "1")
+        type=$([ "$component" == "vmware-workstation" ] && echo "0" || echo "1")
+        sqlite3 "$database_filename" "INSERT INTO components(name,version,buildNumber,component_core_id,longName,description,type) VALUES(\"$component\",\"$component_version\",\"${build}\",$component_core_id,\"$component\",\"$component\",$type);"
+        mkdir -p $out/etc/vmware-installer/components/$component
+        cp -r $folder/* $out/etc/vmware-installer/components/$component
+      done
+    ''}
+
+    ## VMware Bootstrap
+    echo "Installing VMware Bootstrap"
+    cp ${./vmware-bootstrap} $out/etc/vmware/bootstrap
+    sed -i -e "s,@@PREFIXDIR@@,$out," $out/etc/vmware/bootstrap
+
+    ## VMware Config
+    echo "Installing VMware Config"
+    cp ${./vmware-config} $out/etc/vmware/config
+    sed -i -e "s,@@VERSION@@,${version}," $out/etc/vmware/config
+    sed -i -e "s,@@BUILD@@,${build}," $out/etc/vmware/config
+    sed -i -e "s,@@PREFIXDIR@@,$out," $out/etc/vmware/config
+
+    ## VMware VMX
+    echo "Installing VMware VMX"
+    unpacked="unpacked/vmware-vmx"
+    cp -r $unpacked/bin/* $out/bin/
+    cp -r $unpacked/etc/modprobe.d $out/etc/
+    cp -r $unpacked/etc/init.d/* $out/etc/init.d/
+    cp -r $unpacked/roms $out/lib/vmware/
+    cp -r $unpacked/sbin/* $out/bin/
+
+    cp -r $unpacked/lib/libconf $out/lib/vmware/
+    cp -r $unpacked/lib/bin $out/lib/vmware/
+    cp -r $unpacked/lib/lib $out/lib/vmware/
+    cp -r $unpacked/lib/scripts $out/lib/vmware/
+    cp -r $unpacked/lib/icu $out/lib/vmware/
+    cp -r $unpacked/lib/share $out/lib/vmware/
+    cp -r $unpacked/lib/modules $out/lib/vmware/
+    cp -r $unpacked/lib/include $out/lib/vmware/
+
+    cp -r $unpacked/extra/checkvm $out/bin/
+    cp -r $unpacked/extra/modules.xml $out/lib/vmware/modules/
+
+    ln -s $out/lib/vmware/bin/appLoader $out/lib/vmware/bin/vmware-vmblock-fuse
+    ln -s $out/lib/vmware/icu $out/etc/vmware/icu
+
+    # Replace vmware-modconfig with simple error dialog
+    cp ${./vmware-modconfig} $out/bin/vmware-modconfig
+    sed -i -e "s,ETCDIR=/etc/vmware,ETCDIR=$out/etc/vmware," $out/bin/vmware-modconfig
+
+    # Patch dynamic libs in
+    for binary in "mksSandbox" "mksSandbox-debug" "mksSandbox-stats" "vmware-vmx" "vmware-vmx-debug" "vmware-vmx-stats"
+    do
+      patchelf \
+        --add-needed ${libaio}/lib/libaio.so.1 \
+        --add-needed ${vulkan-loader}/lib/libvulkan.so.1 \
+        --add-needed ${alsa-lib}/lib/libasound.so \
+        --add-needed ${libpulseaudio}/lib/libpulse.so.0 \
+        --add-needed ${libGL}/lib/libEGL.so.1 \
+        --add-needed ${numactl}/lib/libnuma.so.1 \
+        --add-needed ${libX11}/lib/libX11.so.6 \
+        --add-needed ${libXi}/lib/libXi.so.6 \
+        --add-needed ${libGL}/lib/libGL.so.1 \
+        $out/lib/vmware/bin/$binary
+    done
+
+    ## VMware USB Arbitrator
+    echo "Installing VMware USB Arbitrator"
+    unpacked="unpacked/vmware-usbarbitrator"
+    cp -r $unpacked/etc/init.d/* $out/etc/init.d/
+    cp -r $unpacked/bin/* $out/bin/
+    ln -s $out/lib/vmware/bin/appLoader $out/lib/vmware/bin/vmware-usbarbitrator
+
+    ## VMware Player Setup
+    echo "Installing VMware Player Setup"
+    unpacked="unpacked/vmware-player-setup"
+    mkdir -p $out/lib/vmware/setup
+    cp $unpacked/vmware-config $out/lib/vmware/setup/
+
+    ## VMware Network Editor
+    echo "Installing VMware Network Editor"
+    unpacked="unpacked/vmware-network-editor"
+    cp -r $unpacked/lib $out/lib/vmware/
+
+    ## VMware Tools + Virtual Printer
+    echo "Installing VMware Tools + Virtual Printer"
+    mkdir -p $out/lib/vmware/isoimages/
+    cp unpacked/vmware-tools-linuxPreGlibc25/linuxPreGlibc25.iso \
+       unpacked/vmware-tools-windows/windows.iso \
+       unpacked/vmware-tools-winPreVista/winPreVista.iso \
+       unpacked/vmware-virtual-printer/VirtualPrinter-Linux.iso \
+       unpacked/vmware-virtual-printer/VirtualPrinter-Windows.iso \
+       unpacked/vmware-tools-winPre2k/winPre2k.iso \
+       unpacked/vmware-tools-linux/linux.iso \
+       unpacked/vmware-tools-netware/netware.iso \
+       unpacked/vmware-tools-solaris/solaris.iso \
+       $out/lib/vmware/isoimages/
+
+    ## VMware Player Application
+    echo "Installing VMware Player Application"
+    unpacked="unpacked/vmware-player-app"
+    cp -r $unpacked/lib/* $out/lib/vmware/
+    cp -r $unpacked/etc/* $out/etc/
+    cp -r $unpacked/share/* $out/share/
+    cp -r $unpacked/bin/* $out/bin/
+    cp -r $unpacked/doc/* $out/share/doc/ # Licences
+
+    mkdir -p $out/etc/thnuclnt
+    cp -r $unpacked/extras/.thnumod $out/etc/thnuclnt/
+
+    mkdir -p $out/lib/cups/filter
+    cp -r $unpacked/extras/thnucups $out/lib/cups/filter/
+
+    for target in "vmplayer" "vmware-enter-serial" "vmware-setup-helper" "licenseTool" "vmware-mount" "vmware-fuseUI" "vmware-app-control" "vmware-zenity"
+    do
+      ln -s $out/lib/vmware/bin/appLoader $out/lib/vmware/bin/$target
+    done
+
+    ln -s $out/lib/vmware/bin/vmware-mount $out/bin/vmware-mount
+    ln -s $out/lib/vmware/bin/vmware-fuseUI $out/bin/vmware-fuseUI
+    ln -s $out/lib/vmware/bin/vmrest $out/bin/vmrest
+
+    # Patch vmplayer
+    sed -i -e "s,ETCDIR=/etc/vmware,ETCDIR=$out/etc/vmware," $out/bin/vmplayer
+    sed -i -e "s,/sbin/modprobe,${kmod}/bin/modprobe," $out/bin/vmplayer
+    sed -i -e "s,@@BINARY@@,$out/bin/vmplayer," $out/share/applications/vmware-player.desktop
+
+    ## VMware OVF Tool compoment
+    echo "Installing VMware OVF Tool for Linux"
+    unpacked="unpacked/vmware-ovftool"
+    mkdir -p $out/lib/vmware-ovftool/
+
+    cp -r $unpacked/* $out/lib/vmware-ovftool/
+    chmod 755 $out/lib/vmware-ovftool/ovftool*
+    makeWrapper "$out/lib/vmware-ovftool/ovftool.bin" "$out/bin/ovftool"
+
+    ## VMware Network Editor User Interface
+    echo "Installing VMware Network Editor User Interface"
+    unpacked="unpacked/vmware-network-editor-ui"
+    cp -r $unpacked/share/* $out/share/
+
+    ln -s $out/lib/vmware/bin/appLoader $out/lib/vmware/bin/vmware-netcfg
+    ln -s $out/lib/vmware/bin/vmware-netcfg $out/bin/vmware-netcfg
+
+    # Patch network editor ui
+
+    sed -i -e "s,@@BINARY@@,$out/bin/vmware-netcfg," $out/share/applications/vmware-netcfg.desktop
+
+    ## VMware VIX Core Library
+    echo "Installing VMware VIX Core Library"
+    unpacked="unpacked/vmware-vix-core"
+    mkdir -p $out/lib/vmware-vix
+    cp -r $unpacked/lib/* $out/lib/vmware-vix/
+    cp -r $unpacked/bin/* $out/bin/
+    cp $unpacked/*.txt $out/lib/vmware-vix/
+
+    mkdir -p $out/share/doc/vmware-vix/
+    cp -r $unpacked/doc/* $out/share/doc/vmware-vix/
+
+    mkdir -p $out/include/
+    cp -r $unpacked/include/* $out/include/
+
+    ## VMware VIX Workstation-16.0.0 Library
+    echo "Installing VMware VIX Workstation-16.0.0 Library"
+    unpacked="unpacked/vmware-vix-lib-Workstation1600"
+    cp -r $unpacked/lib/* $out/lib/vmware-vix/
+
+    ## VMware VProbes component for Linux
+    echo "Installing VMware VProbes component for Linux"
+    unpacked="unpacked/vmware-vprobe"
+    cp -r $unpacked/bin/* $out/bin/
+    cp -r $unpacked/lib/* $out/lib/vmware/
+
+    ## VMware Workstation
+    echo "Installing VMware Workstation"
+    unpacked="unpacked/vmware-workstation"
+    cp -r $unpacked/bin/* $out/bin/
+    cp -r $unpacked/lib/* $out/lib/vmware/
+    cp -r $unpacked/share/* $out/share/
+    cp -r $unpacked/man $out/share/
+    cp -r $unpacked/doc $out/share/
+
+    ln -s $out/lib/vmware/bin/appLoader $out/lib/vmware/bin/vmware
+    ln -s $out/lib/vmware/bin/appLoader $out/lib/vmware/bin/vmware-tray
+    ln -s $out/lib/vmware/bin/appLoader $out/lib/vmware/bin/vmware-vprobe
+
+    # Patch vmware
+    sed -i -e "s,ETCDIR=/etc/vmware,ETCDIR=$out/etc/vmware,g" $out/bin/vmware
+    sed -i -e "s,/sbin/modprobe,${kmod}/bin/modprobe,g" $out/bin/vmware
+    sed -i -e "s,@@BINARY@@,$out/bin/vmware," $out/share/applications/vmware-workstation.desktop
+
+    chmod +x $out/bin/* $out/lib/vmware/bin/* $out/lib/vmware/setup/*
+
+    # Harcoded pkexec hack
+    for lib in "lib/vmware/lib/libvmware-mount.so/libvmware-mount.so" "lib/vmware/lib/libvmwareui.so/libvmwareui.so" "lib/vmware/lib/libvmware-fuseUI.so/libvmware-fuseUI.so"
+    do
+      sed -i -e "s,/usr/local/sbin,/run/vmware/bin," "$out/$lib"
+    done
+
+    # SUID hack
+    wrapProgram $out/lib/vmware/bin/vmware-vmx
+    rm $out/lib/vmware/bin/vmware-vmx
+    ln -s /run/wrappers/bin/vmware-vmx $out/lib/vmware/bin/vmware-vmx
+  '';
+
+  meta = with lib; {
+    description = "Industry standard desktop hypervisor for x86-64 architecture";
+    homepage = "https://www.vmware.com/products/workstation-pro.html";
+    license = licenses.unfree;
+    platforms = [ "x86_64-linux" ];
+    maintainers = with maintainers; [ deinferno ];
+  };
+}
diff --git a/pkgs/applications/virtualization/vmware-workstation/vmware-bootstrap b/pkgs/applications/virtualization/vmware-workstation/vmware-bootstrap
new file mode 100644
index 0000000000000..93787870ec3cf
--- /dev/null
+++ b/pkgs/applications/virtualization/vmware-workstation/vmware-bootstrap
@@ -0,0 +1,11 @@
+PREFIX="@@PREFIXDIR@@"
+BINDIR="@@PREFIXDIR@@/bin"
+SBINDIR="@@PREFIXDIR@@/sbin"
+LIBDIR="@@PREFIXDIR@@/lib"
+DATADIR="@@PREFIXDIR@@/share"
+SYSCONFDIR="@@PREFIXDIR@@/etc"
+DOCDIR="@@PREFIXDIR@@/share/doc"
+MANDIR="@@PREFIXDIR@@/share/man"
+INCLUDEDIR="@@PREFIXDIR@@/include"
+INITDIR="@@PREFIXDIR@@/etc"
+INITSCRIPTDIR="@@PREFIXDIR@@/etc/init.d"
diff --git a/pkgs/applications/virtualization/vmware-workstation/vmware-config b/pkgs/applications/virtualization/vmware-workstation/vmware-config
new file mode 100644
index 0000000000000..9b3714bc3136c
--- /dev/null
+++ b/pkgs/applications/virtualization/vmware-workstation/vmware-config
@@ -0,0 +1,21 @@
+.encoding = "UTF-8"
+product.name = "VMware Workstation"
+product.version = "@@VERSION@@"
+product.buildNumber = "@@BUILD@@"
+workstation.product.version = "@@VERSION@@"
+player.product.version = "@@VERSION@@"
+vix.config.version = "1"
+bindir = "@@PREFIXDIR@@/bin"
+libdir = "@@PREFIXDIR@@/lib/vmware"
+vix.libdir = "@@PREFIXDIR@@/lib/vmware-vix"
+initscriptdir = "@@PREFIXDIR@@/lib/systemd/scripts"
+vmware.fullpath = "@@PREFIXDIR@@/bin/vmware"
+authd.fullpath = "@@PREFIXDIR@@/bin/vmware-authd"
+gksu.rootMethod = "su"
+NETWORKING = "yes"
+installerDefaults.autoSoftwareUpdateEnabled = "no"
+installerDefaults.dataCollectionEnabled = "no"
+installerDefaults.componentDownloadEnabled = "no"
+installerDefaults.transferVersion = "1"
+acceptOVFEULA = "yes"
+acceptEULA = "yes"
diff --git a/pkgs/applications/virtualization/vmware-workstation/vmware-installer-bootstrap b/pkgs/applications/virtualization/vmware-workstation/vmware-installer-bootstrap
new file mode 100644
index 0000000000000..4db8f7a1b458f
--- /dev/null
+++ b/pkgs/applications/virtualization/vmware-workstation/vmware-installer-bootstrap
@@ -0,0 +1,5 @@
+VMWARE_INSTALLER="@@INSTALLERDIR@@"
+VERSION="@@IVERSION@@" # For backwards compability
+VMISVERSION="@@IVERSION@@"
+VMISBUILDNUM="@@BUILD@@"
+VMISPYVERSION="39"
diff --git a/pkgs/applications/virtualization/vmware-workstation/vmware-modconfig b/pkgs/applications/virtualization/vmware-workstation/vmware-modconfig
new file mode 100644
index 0000000000000..c93a371579667
--- /dev/null
+++ b/pkgs/applications/virtualization/vmware-workstation/vmware-modconfig
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+set -e
+
+ETCDIR=/etc/vmware
+. $ETCDIR/bootstrap
+
+exec "$LIBDIR"/vmware/bin/vmware-zenity --error --text "Reboot is required to load VMware kernel modules (make sure that 'virtualisation.vmware.host.enable' is enabled)"
diff --git a/pkgs/os-specific/linux/vmware/default.nix b/pkgs/os-specific/linux/vmware/default.nix
new file mode 100644
index 0000000000000..aa77a10015e6a
--- /dev/null
+++ b/pkgs/os-specific/linux/vmware/default.nix
@@ -0,0 +1,47 @@
+{ lib, stdenv, fetchFromGitHub, kernel, kmod, gnugrep, vmware-workstation }:
+
+stdenv.mkDerivation rec {
+  pname = "vmware-modules";
+  version = "${vmware-workstation.version}-${kernel.version}";
+
+  src = fetchFromGitHub {
+    owner = "mkubecek";
+    repo = "vmware-host-modules";
+    rev = "w${vmware-workstation.version}-k5.17";
+    sha256 = "sha256-EM6YU2nOwNlAXpQ7cGrLS1N+gAS1KxleVjJTzo22De0=";
+  };
+
+  hardeningDisable = [ "pic" ];
+
+  nativeBuildInputs = kernel.moduleBuildDependencies;
+
+  enableParallelBuilding = true;
+
+  postPatch = ''
+    substituteInPlace Makefile \
+      --replace '/lib/modules/$(VM_UNAME)/misc' "$out/lib/modules/${kernel.modDirVersion}/misc" \
+      --replace '$(shell uname -r)' "${kernel.modDirVersion}" \
+      --replace /sbin/modinfo "${kmod}/bin/modinfo" \
+      --replace 'test -z "$(DESTDIR)"' "0"
+
+    for module in "vmmon-only" "vmnet-only"; do
+      substituteInPlace "./$module/Makefile" \
+        --replace '/lib/modules/' "${kernel.dev}/lib/modules/" \
+        --replace '$(shell uname -r)' "${kernel.modDirVersion}" \
+        --replace /bin/grep "${gnugrep}/bin/grep"
+    done
+  '';
+
+  preInstall = ''
+    mkdir -p "$out/lib/modules/${kernel.modDirVersion}/misc"
+  '';
+
+  meta = with lib; {
+    description = "Kernel modules needed for VMware hypervisor";
+    homepage = "https://github.com/mkubecek/vmware-host-modules";
+    license = licenses.gpl2Only;
+    platforms = [ "x86_64-linux" ];
+    broken = kernel.kernelOlder "5.5" && kernel.isHardened;
+    maintainers = with maintainers; [ deinferno ];
+  };
+}
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index bd271d1021164..b84c39113f96e 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -30337,6 +30337,8 @@ with pkgs;
 
   vmware-horizon-client = callPackage ../applications/networking/remote/vmware-horizon-client { };
 
+  vmware-workstation = callPackage ../applications/virtualization/vmware-workstation { };
+
   vocproc = callPackage ../applications/audio/vocproc { };
 
   vnstat = callPackage ../applications/networking/vnstat { };
diff --git a/pkgs/top-level/linux-kernels.nix b/pkgs/top-level/linux-kernels.nix
index 9544047355f49..9743acce4b6d8 100644
--- a/pkgs/top-level/linux-kernels.nix
+++ b/pkgs/top-level/linux-kernels.nix
@@ -464,6 +464,8 @@ in {
 
     vmm_clock = callPackage ../os-specific/linux/vmm_clock { };
 
+    vmware = callPackage ../os-specific/linux/vmware { };
+
     wireguard = if lib.versionOlder kernel.version "5.6" then callPackage ../os-specific/linux/wireguard { } else null;
 
     x86_energy_perf_policy = callPackage ../os-specific/linux/x86_energy_perf_policy { };