summaryrefslogtreecommitdiff
path: root/modules/virtualization.nix
blob: fb5a4cde354e69155762745e3a08f3d6798bc955 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
{ pkgs, config, lib, ... }:

let
  gpuIDs = [
    "10de:28e0"
    "10de:22be"
  ];
in
{
  virtualisation = {
    libvirtd = {
      enable = true;
      qemu = {
        swtpm.enable = true;
        ovmf.enable = true;
        ovmf.packages = [ pkgs.OVMFFull.fd ];
      };
    };
    spiceUSBRedirection.enable = true;

    # docker.enable = true;
    podman = {
      enable = true;
      dockerCompat = true;
    };
  };
  services.spice-vdagentd.enable = true;
  programs.virt-manager.enable = true;

  systemd.tmpfiles.rules = [ "f /dev/shm/looking-glass 0660 compromyse kvm -" ];

  environment.extraOutputsToInstall = [ "dev" ];
  environment.systemPackages = [
    pkgs.looking-glass-client
    pkgs.libvirt
    #pkgs.vagrant
    pkgs.virt-viewer
    pkgs.guestfs-tools
    pkgs.distrobox

    (pkgs.writeShellScriptBin "db-create" ''
      mkdir -p "$HOME/db"
      distrobox create --name my-distrobox --home "$HOME/db" --init --image ubuntu:24.04
    '')

    (pkgs.writeShellScriptBin "pin-cpu" ''
      if [[ $1 == "" ]]; then
        cpus="8-15"
      else
        cpus=$1
      fi
      systemctl set-property --runtime -- user.slice AllowedCPUs="$cpus"
      systemctl set-property --runtime -- system.slice AllowedCPUs="$cpus"
      systemctl set-property --runtime -- init.scope AllowedCPUs="$cpus"
    '')

    (pkgs.writeShellScriptBin "unpin-cpu" ''
      systemctl set-property --runtime -- user.slice AllowedCPUs=""
      systemctl set-property --runtime -- system.slice AllowedCPUs=""
      systemctl set-property --runtime -- init.scope AllowedCPUs=""
    '')

    (pkgs.writeShellScriptBin "vfio-bind" ''
      sudo modprobe -r nvidia_drm nvidia_modeset nvidia_uvm i2c_nvidia_gpu nvidia

      sudo modprobe vfio
      sudo modprobe vfio_iommu_type1
      sudo modprobe vfio_pci

      systemctl --user -M compromyse@ stop pipewire.service pipewire.socket

      sudo virsh nodedev-detach pci_0000_01_00_0
      sudo virsh nodedev-detach pci_0000_01_00_1

      systemctl --user -M compromyse@ restart pipewire.service pipewire.socket
    '')

    (pkgs.writeShellScriptBin "vfio-unbind" ''
      systemctl --user -M compromyse@ stop pipewire.service pipewire.socket

      sudo virsh nodedev-reattach pci_0000_01_00_0
      sudo virsh nodedev-reattach pci_0000_01_00_1

      systemctl --user -M compromyse@ restart pipewire.service pipewire.socket

      sudo modprobe -r vfio_pci
      sudo modprobe -r vfio_iommu_type1
      sudo modprobe -r vfio

      sudo modprobe nvidia_drm nvidia_modeset nvidia_uvm i2c_nvidia_gpu nvidia
    '')
  ];

  boot = {
    /* initrd.kernelModules = [
      "vfio_pci"
      "vfio"
      "vfio_iommu_type1"

      "nvidia"
      "nvidia_modeset"
      "nvidia_uvm"
      "nvidia_drm"
    ]; */

    kernelParams = [
      "skippatcheck"
      "pci_acs_override=downstream,multifunction"
      /* ("vfio-pci.ids=" + lib.concatStringsSep "," gpuIDs) */
    ];
  };

  # Use the custom kernel package set
  boot.kernelPackages = pkgs.linuxPackages_xanmod_latest;

  # boot.kernelPatches = [
  #   {
  #     # https://github.com/Kinsteen/win10-gpu-passthrough/blob/main/pat_patch.diff
  #     name = "disable-pat-check";
  #     patch = ../dist/disable-pat-check.patch;
  #   }
  #   {
  #     # https://aur.archlinux.org/cgit/aur.git/tree/1001-6.8.0-add-acs-overrides.patch?h=linux-vfio
  #     name = "acso";
  #     patch = ../dist/acso.patch;
  #   }
  # ];

  # boot.kernelParams = [ "skippatcheck" "pcie_acs_override=downstream,multifunction" ];
}