From 44d58268acb5ff67910d034e2f86f80011bfd8fd Mon Sep 17 00:00:00 2001 From: ooks-io Date: Sun, 10 Nov 2024 23:06:27 +1100 Subject: [PATCH] nixos: add virtualization module --- modules/home/console/tools/default.nix | 1 + modules/home/console/tools/virtualization.nix | 19 ++++++ modules/nixos/workstation/default.nix | 1 + modules/nixos/workstation/options.nix | 2 +- .../workstation/virtualization/default.nix | 5 ++ .../virtualization/virt-manager.nix | 58 +++++++++++++++++++ 6 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 modules/home/console/tools/virtualization.nix create mode 100644 modules/nixos/workstation/virtualization/default.nix create mode 100644 modules/nixos/workstation/virtualization/virt-manager.nix diff --git a/modules/home/console/tools/default.nix b/modules/home/console/tools/default.nix index a65e3b4..b2f1a5f 100644 --- a/modules/home/console/tools/default.nix +++ b/modules/home/console/tools/default.nix @@ -1,5 +1,6 @@ { imports = [ + ./virtualization.nix ./bat.nix ./btop.nix ./git.nix diff --git a/modules/home/console/tools/virtualization.nix b/modules/home/console/tools/virtualization.nix new file mode 100644 index 0000000..18b96f7 --- /dev/null +++ b/modules/home/console/tools/virtualization.nix @@ -0,0 +1,19 @@ +{ + lib, + osConfig, + ... +}: let + inherit (lib) elem mkIf; + inherit (osConfig.ooknet.workstation) profiles; +in { + config = mkIf (elem "virtualization" profiles) { + # setup connections for virt-manager + # see + dconf.settings = { + "org/virt-manager/virt-manager/connections" = { + autoconnect = ["qemu:///system"]; + uris = ["qemu:///system"]; + }; + }; + }; +} diff --git a/modules/nixos/workstation/default.nix b/modules/nixos/workstation/default.nix index 8e3032b..fe1f519 100644 --- a/modules/nixos/workstation/default.nix +++ b/modules/nixos/workstation/default.nix @@ -14,6 +14,7 @@ in { ./programs ./gaming ./environment + ./virtualization ]; home-manager.users.${admin.name} = mkIf admin.homeManager { diff --git a/modules/nixos/workstation/options.nix b/modules/nixos/workstation/options.nix index aa01f16..f4e72a4 100644 --- a/modules/nixos/workstation/options.nix +++ b/modules/nixos/workstation/options.nix @@ -8,7 +8,7 @@ in { default = null; }; profiles = mkOption { - type = listOf (enum ["gaming" "communication" "productivity" "creative" "media"]); + type = listOf (enum ["gaming" "communication" "productivity" "creative" "media" "virtualization"]); default = []; }; environment = mkOption { diff --git a/modules/nixos/workstation/virtualization/default.nix b/modules/nixos/workstation/virtualization/default.nix new file mode 100644 index 0000000..9c7be83 --- /dev/null +++ b/modules/nixos/workstation/virtualization/default.nix @@ -0,0 +1,5 @@ +{ + imports = [ + ./virt-manager.nix + ]; +} diff --git a/modules/nixos/workstation/virtualization/virt-manager.nix b/modules/nixos/workstation/virtualization/virt-manager.nix new file mode 100644 index 0000000..3875726 --- /dev/null +++ b/modules/nixos/workstation/virtualization/virt-manager.nix @@ -0,0 +1,58 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (builtins) attrValues; + inherit (lib) mkIf elem; + inherit (config.ooknet.workstation) profiles; +in { + config = mkIf (elem "virtualization" profiles) { + environment.systemPackages = attrValues { + inherit + (pkgs) + virt-viewer + qemu_kvm + qemu + spice + spice-protocol + # for windows virtualization + + win-virtio + win-spice + ; + # virt-manager needs this + inherit (pkgs.gnome) adwaita-icon-theme; + }; + # sets up dconf settins for qemu and add virt-manager to systemPackages + programs.virt-manager = { + enable = true; + package = pkgs.virt-manager; + }; + virtualisation = { + # allow unprivileged users to pass usb devices to vm + spiceUSBRedirection.enable = true; + + # our virtualization daemon + libvirtd = { + enable = true; + + qemu = { + # by default this uses pkgs.qemu but since i do not need to emulate aarch64 currently i use + # qemu_kvm which only supports the hosts system architecture. + package = pkgs.qemu_kvm; + + # for emulating TPM + swtpm.enable = true; + + # UEFI secure boot + ovmf = { + enable = true; + packages = [pkgs.OVMFFull.fd]; + }; + }; + }; + }; + }; +}