diff options
Diffstat (limited to 'os/vms/opnsense.nix')
| -rw-r--r-- | os/vms/opnsense.nix | 95 |
1 files changed, 95 insertions, 0 deletions
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); + }; + }; + }; + }; +} |
