summaryrefslogtreecommitdiff
path: root/os/vms
diff options
context:
space:
mode:
Diffstat (limited to 'os/vms')
-rw-r--r--os/vms/default.nix0
-rw-r--r--os/vms/microvms.nix40
-rw-r--r--os/vms/net-core.nix34
-rw-r--r--os/vms/opnsense.nix95
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);
+ };
+ };
+ };
+ };
+}