diff options
Diffstat (limited to 'os/vms')
| -rw-r--r-- | os/vms/default.nix | 0 | ||||
| -rw-r--r-- | os/vms/microvms.nix | 40 | ||||
| -rw-r--r-- | os/vms/net-core.nix | 34 | ||||
| -rw-r--r-- | os/vms/opnsense.nix | 95 |
4 files changed, 169 insertions, 0 deletions
diff --git a/os/vms/default.nix b/os/vms/default.nix deleted file mode 100644 index e69de29..0000000 --- a/os/vms/default.nix +++ /dev/null diff --git a/os/vms/microvms.nix b/os/vms/microvms.nix new file mode 100644 index 0000000..0a24c60 --- /dev/null +++ b/os/vms/microvms.nix @@ -0,0 +1,40 @@ +{ + config, + lib, + inputs, + ... +}: +let + cfg = config.os.vms; + sharedSecrets = [ + { + tag = "shared-secrets"; + proto = "virtiofs"; + source = "/etc/nixos/secrets"; + mountPoint = "/etc/nixos/secrets"; + } + ]; +in +{ + imports = [ inputs.microvm.nixosModules.host ]; + + options.os.vms = { + net-core.enable = lib.mkEnableOption "enables the net-core virtual machine"; + }; + + config = lib.mkMerge [ + (lib.mkIf cfg.enable { + }) + + (lib.mkIf cfg.net-core.enable { + microvm.vms.net-core = { + autostart = true; + config = { + imports = [ ../vms/net-core.nix ]; + microvm.shares = sharedSecrets; + }; + }; + }) + + ]; +} diff --git a/os/vms/net-core.nix b/os/vms/net-core.nix new file mode 100644 index 0000000..392aaf5 --- /dev/null +++ b/os/vms/net-core.nix @@ -0,0 +1,34 @@ +{ + pkgs, + inputs, + ... +}: +{ + system.stateVersion = "26.11"; + + imports = [ + inputs.microvm.nixosModules.microvm + ../core/default.nix + ]; + + os = { + core = { + allowUnfree.enable = true; + locale.enable = true; + }; + srv = { + ssh = { + server = { + enable = true; + microvm = true; + }; + }; + firewall.enable = true; + sops.enable = true; + }; + }; + + networking.hostName = "net-core"; + + environment.systemPackages = [ pkgs.vis ]; +} diff --git a/os/vms/opnsense.nix b/os/vms/opnsense.nix new file mode 100644 index 0000000..b9f2978 --- /dev/null +++ b/os/vms/opnsense.nix @@ -0,0 +1,95 @@ +{ + config, + lib, + inputs, + ... +}: +let + cfg = config.os.srv.opnsense; + makePciArgs = + ids: + builtins.concatLists ( + map (id: [ + "-device" + "vfio-pci,host=${id},rombar=0" + ]) ids + ); +in +{ + imports = [ inputs.microvm.nixosModules.host ]; + + options.os.srv.opnsense = { + enable = lib.mkEnableOption "enables an opnsense microvm"; + + pciIDs = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = [ ]; + example = [ + "03:00.0" + "03:00.1" + ]; + description = "List of PCI bus addresses to pass through directly to OPNsense."; + }; + + vendorIDs = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = [ ]; + example = [ "8086:1563" ]; + description = "List of Vendor:Device IDs to bind explicitly to the vfio-pci driver."; + }; + + imagePath = lib.mkOption { + type = lib.types.path; + default = /var/lib/microvm/images/opnsense.qcow2; + description = "Path to the OPNsense qcow2 drive image block."; + }; + }; + + config = lib.mkIf cfg.enable { + boot = { + kernelParams = [ + "intel_iommu=on" + "iommu=pt" + ]; + kernelModules = [ + "vfio_pci" + "vfio" + "vfio_iommu_type1" + ]; + extraModprobeConfig = '' + options vfio-pci ids=${lib.concatStringsSep "," (lib.unique cfg.vendorIDs)} + ''; + }; + + microvm.vms.opnsense = { + autostart = true; + config = { + imports = [ inputs.microvm.nixosModules.microvm ]; + + networking.hostName = "opnsense"; + + microvm = { + vcpu = 4; + mem = 4096; + hypervisor = "qemu"; + + interfaces = [ + { + type = "bridge"; + id = "vtnet0"; + bridge = "br-srv"; + } + ]; + + qemu.extraArgs = [ + "-machine" + "q35,accel=kvm,kernel-irqchip=on" + "-cpu" + "host,migratable=off,+invtsc" + ] + ++ (makePciArgs cfg.pciIDs); + }; + }; + }; + }; +} |
