{ options, config, lib, pkgs, ... }: let mkIfGuest = import ../lib/mkIfMicrovmGuest.nix { inherit options config lib; }; inherit (lib) types; in { imports = [ ./vsock-connect-guest.nix ./uvms-users.nix ]; options = { uvms.zswap.enable = lib.mkEnableOption "Pass zswap.enabled=1 to kernelParams (and disable zramSwap)"; uvms.zswap.settings = lib.mkOption { description = "Zswap kernel module configuration"; default = { }; type = types.submodule { freeformType = types.attrsOf types.str; options.max_pool_percent = lib.mkOption { type = types.int; default = 25; description = "..."; }; options.compressor = lib.mkOption { type = types.str; default = "zstd"; description = "..."; }; }; }; }; config = lib.mkMerge [ (mkIfGuest { microvm = { hypervisor = "cloud-hypervisor"; volumes = [ { image = "swapfile.img"; mountPoint = "/var/swapfiles"; size = 1024; } ]; }; swapDevices = [ { device = "/var/swapfiles/swap0"; size = 768; } ]; systemd.services."microvm@".serviceConfig.ExecStartPost = [ (pkgs.writeShellScript "microvm-fix-umask" '' if [[ -e CONNECT.sock ]] ; then chmod g+rw CONNECT.sock fi '') ]; }) (lib.mkIf config.uvms.zswap.enable { zramSwap.enable = false; boot.kernelParams = builtins.attrValues ( (lib.mapAttrs (name: value: "zswap.${name}=${toString value}")) config.uvms.zswap.settings ) ++ [ "zswap.enabled=1" ]; }) ]; }