Compare commits
	
		
			13 Commits
		
	
	
		
			4548914209
			...
			feature/on
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 6957d062c5 | |||
| 30c8441848 | |||
| ea8c5ca025 | |||
| d29b2ecbab | |||
| cc702cb5fe | |||
| 327895435b | |||
| 23fc7d2667 | |||
| eba9d9c4cd | |||
| 1c596593ca | |||
| 9985fc8778 | |||
| 3a61c7522d | |||
| 45610cb886 | |||
| f9d31cba65 | 
							
								
								
									
										2
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							| @@ -115,6 +115,7 @@ | ||||
|     "keyserver", | ||||
|     "keyservers", | ||||
|     "KRNL", | ||||
|     "kubnet", | ||||
|     "kuma", | ||||
|     "libexec", | ||||
|     "libglvnd", | ||||
| @@ -132,6 +133,7 @@ | ||||
|     "markdownlint", | ||||
|     "mechatroner", | ||||
|     "mediainfo", | ||||
|     "microvm", | ||||
|     "modesetting", | ||||
|     "mousewheel", | ||||
|     "mpris", | ||||
|   | ||||
							
								
								
									
										41
									
								
								flake.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										41
									
								
								flake.lock
									
									
									
										generated
									
									
									
								
							| @@ -267,6 +267,30 @@ | ||||
|         "type": "github" | ||||
|       } | ||||
|     }, | ||||
|     "microvm": { | ||||
|       "inputs": { | ||||
|         "flake-utils": [ | ||||
|           "flake-utils" | ||||
|         ], | ||||
|         "nixpkgs": [ | ||||
|           "nixpkgs" | ||||
|         ], | ||||
|         "spectrum": "spectrum" | ||||
|       }, | ||||
|       "locked": { | ||||
|         "lastModified": 1716382614, | ||||
|         "narHash": "sha256-dwUYl8jyMNKidPEM9gTafcRe+3pUh2rH3ZlBrUpsvnw=", | ||||
|         "owner": "astro", | ||||
|         "repo": "microvm.nix", | ||||
|         "rev": "a59c3167f673ce29b65c674deb2bee73d151a96c", | ||||
|         "type": "github" | ||||
|       }, | ||||
|       "original": { | ||||
|         "owner": "astro", | ||||
|         "repo": "microvm.nix", | ||||
|         "type": "github" | ||||
|       } | ||||
|     }, | ||||
|     "nix": { | ||||
|       "inputs": { | ||||
|         "flake-compat": [ | ||||
| @@ -609,6 +633,7 @@ | ||||
|         "flake-utils": "flake-utils_2", | ||||
|         "home-manager": "home-manager", | ||||
|         "hyprland-contrib": "hyprland-contrib", | ||||
|         "microvm": "microvm", | ||||
|         "nix": "nix", | ||||
|         "nix-index-database": "nix-index-database", | ||||
|         "nixos-generators": "nixos-generators", | ||||
| @@ -733,6 +758,22 @@ | ||||
|         "type": "github" | ||||
|       } | ||||
|     }, | ||||
|     "spectrum": { | ||||
|       "flake": false, | ||||
|       "locked": { | ||||
|         "lastModified": 1708358594, | ||||
|         "narHash": "sha256-e71YOotu2FYA67HoC/voJDTFsiPpZNRwmiQb4f94OxQ=", | ||||
|         "ref": "refs/heads/main", | ||||
|         "rev": "6d0e73864d28794cdbd26ab7b37259ab0e1e044c", | ||||
|         "revCount": 614, | ||||
|         "type": "git", | ||||
|         "url": "https://spectrum-os.org/git/spectrum" | ||||
|       }, | ||||
|       "original": { | ||||
|         "type": "git", | ||||
|         "url": "https://spectrum-os.org/git/spectrum" | ||||
|       } | ||||
|     }, | ||||
|     "systems": { | ||||
|       "locked": { | ||||
|         "lastModified": 1681028828, | ||||
|   | ||||
| @@ -72,6 +72,14 @@ | ||||
|       inputs.nixpkgs.follows = "nixpkgs"; | ||||
|     }; | ||||
|  | ||||
|     microvm = { | ||||
|       url = "github:astro/microvm.nix"; | ||||
|       inputs = { | ||||
|         nixpkgs.follows = "nixpkgs"; | ||||
|         flake-utils.follows = "flake-utils"; | ||||
|       }; | ||||
|     }; | ||||
|  | ||||
|     nix = { | ||||
|       url = "github:NixOS/nix/latest-release"; | ||||
|       inputs = { | ||||
|   | ||||
| @@ -3,6 +3,7 @@ | ||||
|   # create rad-dev namespace for lib | ||||
|   rad-dev = rec { | ||||
|     systems = import ./systems.nix { inherit lib; }; | ||||
|     microvm = import ./microvms.nix { inherit lib; }; | ||||
|  | ||||
|     # any(), but checks if any value in the list is true | ||||
|     # | ||||
| @@ -56,5 +57,30 @@ | ||||
|     # type: | ||||
|     # fileList :: Path -> String -> [Path] | ||||
|     fileList = dir: map (file: dir + "/${file}") (ls dir); | ||||
|  | ||||
|     # constructs a mac address from a string's hash | ||||
|     # | ||||
|     # args: | ||||
|     # hashable: the string to hash | ||||
|     # | ||||
|     # type: | ||||
|     # strToMac :: String -> String | ||||
|     strToMac = | ||||
|       hashable: | ||||
|       let | ||||
|         # computes sha512 hash of input | ||||
|         hashStr = builtins.hashString "sha512" hashable; | ||||
|         # grabs first 12 letters of hash | ||||
|         hashSub = start: builtins.substring start 2 (builtins.substring 0 12 hashStr); | ||||
|         # joins list of strings with a delimiter between | ||||
|         joiner = | ||||
|           delim: arr: | ||||
|           builtins.foldl' ( | ||||
|             a: b: lib.concatStrings ([ a ] ++ (lib.optionals (a != "") [ delim ]) ++ [ b ]) | ||||
|           ) "" arr; | ||||
|         # generates a list of indexes for the hash | ||||
|         starts = builtins.genList (x: x * 2) 6; | ||||
|       in | ||||
|       joiner ":" (map hashSub starts); | ||||
|   }; | ||||
| } | ||||
|   | ||||
							
								
								
									
										116
									
								
								lib/microvms.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								lib/microvms.nix
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,116 @@ | ||||
| { lib, ... }: | ||||
| rec { | ||||
|   genK3SVM = | ||||
|     server-config: agent-config: vms: | ||||
|     lib.mapAttrs ( | ||||
|       host: | ||||
|       { | ||||
|         address, | ||||
|         gateway, | ||||
|         machine-id, | ||||
|         server ? false, | ||||
|       }: | ||||
|       genMicroVM host address gateway "x86_64-linux" machine-id ( | ||||
|         if server then server-config else agent-config | ||||
|       ) | ||||
|     ) vms; | ||||
|  | ||||
|   genMicroVM = | ||||
|     hostName: address: gateway: _system: machine-id: vm-config: | ||||
|     # microvm refers to microvm.nixosModules | ||||
|  | ||||
|     # { | ||||
|     #   config, | ||||
|     #   pkgs, | ||||
|     #   lib, | ||||
|     #   ... | ||||
|     # }: | ||||
|     { | ||||
|       # The package set to use for the microvm. This also determines the microvm's architecture. | ||||
|       # Defaults to the host system's package set if not given. | ||||
|       # pkgs = import pkgs { inherit system; }; | ||||
|  | ||||
|       # (Optional) A set of special arguments to be passed to the MicroVM's NixOS modules. | ||||
|       #specialArgs = {}; | ||||
|  | ||||
|       # The configuration for the MicroVM. | ||||
|       # Multiple definitions will be merged as expected. | ||||
|       config = { | ||||
|         imports = [ vm-config ]; | ||||
|         # It is highly recommended to share the host's nix-store | ||||
|         # with the VMs to prevent building huge images. | ||||
|  | ||||
|         system.stateVersion = "24.05"; | ||||
|  | ||||
|         environment.etc."machine-id" = { | ||||
|           mode = "0644"; | ||||
|           text = machine-id + "\n"; | ||||
|         }; | ||||
|  | ||||
|         networking.hostName = hostName; | ||||
|  | ||||
|         microvm = { | ||||
|           interfaces = [ | ||||
|             { | ||||
|               type = "tap"; | ||||
|               # bridge = "ztkubnet"; | ||||
|               id = "vm-${hostName}"; | ||||
|               mac = lib.rad-dev.strToMac hostName; | ||||
|             } | ||||
|           ]; | ||||
|           shares = [ | ||||
|             { | ||||
|               source = "/nix/store"; | ||||
|               mountPoint = "/nix/.ro-store"; | ||||
|               tag = "ro-store"; | ||||
|               proto = "virtiofs"; | ||||
|             } | ||||
|             { | ||||
|               # On the host | ||||
|               source = "/var/lib/microvms/${hostName}/journal"; | ||||
|               # In the MicroVM | ||||
|               mountPoint = "/var/log/journal"; | ||||
|               tag = "journal"; | ||||
|               proto = "virtiofs"; | ||||
|               socket = "journal.sock"; | ||||
|             } | ||||
|           ]; | ||||
|         }; | ||||
|  | ||||
|         systemd.network.enable = true; | ||||
|  | ||||
|         systemd.network.networks."20-lan" = { | ||||
|           matchConfig.Type = "ether"; | ||||
|           networkConfig = { | ||||
|             Address = address; | ||||
|             Gateway = gateway; | ||||
|             DNS = [ "9.9.9.9" ]; | ||||
|             IPv6AcceptRA = true; | ||||
|             DHCP = "no"; | ||||
|           }; | ||||
|         }; | ||||
|  | ||||
|         services.openssh = { | ||||
|           enable = true; | ||||
|           openFirewall = true; | ||||
|         }; | ||||
|         users.users.alice = { | ||||
|           openssh.authorizedKeys.keys = [ | ||||
|             # photon | ||||
|             "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOGcqhLaKsjwAnb6plDavAhEyQHNvFS9Uh5lMTuwMhGF alice@parthenon-7588" | ||||
|             # gh | ||||
|             "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGoaEmzaS9vANckvBmqrYSHdFR0sPL4Xgeonbh9KcgFe gitlab keypair" | ||||
|             # janus | ||||
|             "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAfcO9p5opG8Tym6tcLkat6YGCcE6vwg0+V4MTC5WKop alice@parthenon-7588" | ||||
|             # palatine | ||||
|             "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP59pDsx34k2ikrKa0eVacj0APSGivaij3lP9L0Zd9au alice@parthenon-7588" | ||||
|             # jeeves | ||||
|             "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJDgkUndkfns6f779T5ckHOVhyOKP8GttQ9RfaO9uJdx alice@parthenon-7588" | ||||
|           ]; | ||||
|           isNormalUser = true; | ||||
|         }; | ||||
|         # Any other configuration for your MicroVM | ||||
|         # [...] | ||||
|       }; | ||||
|     }; | ||||
| } | ||||
| @@ -160,7 +160,12 @@ rec { | ||||
|     lib.nixosSystem { | ||||
|       inherit system; | ||||
|       specialArgs = { | ||||
|         inherit inputs server system; | ||||
|         inherit | ||||
|           inputs | ||||
|           server | ||||
|           system | ||||
|           src | ||||
|           ; | ||||
|       }; | ||||
|       modules = | ||||
|         [ | ||||
| @@ -208,7 +213,7 @@ rec { | ||||
|               inherit inputs src configPath; | ||||
|               hostname = name; | ||||
|             } | ||||
|             // import configPath { inherit inputs; } | ||||
|             // import configPath { inherit inputs src; } | ||||
|           ); | ||||
|         } | ||||
|       ) (lib.rad-dev.lsdir path) | ||||
|   | ||||
| @@ -20,13 +20,13 @@ in | ||||
|       echo "ebe7fbd44565ba9d=ztkubnet" > /var/lib/zerotier-one/devicemap  | ||||
|     ''; | ||||
|  | ||||
|     services.zerotierone = lib.mkDefault { | ||||
|       enable = true; | ||||
|     services.zerotierone = { | ||||
|       enable = lib.mkDefault true; | ||||
|       joinNetworks = [ "ebe7fbd44565ba9d" ]; | ||||
|     }; | ||||
|  | ||||
|     systemd.network = lib.mkDefault { | ||||
|       enable = true; | ||||
|     systemd.network = { | ||||
|       enable = lib.mkDefault true; | ||||
|       wait-online.anyInterface = true; | ||||
|       netdevs = { | ||||
|         "20-brkubnet" = { | ||||
| @@ -38,15 +38,27 @@ in | ||||
|       }; | ||||
|       networks = { | ||||
|         "30-ztkubnet" = { | ||||
|           matchConfig.Name = "ztkubnet"; | ||||
|           matchConfig.Name = [ "ztkubnet" ]; | ||||
|           networkConfig.Bridge = "brkubnet"; | ||||
|           linkConfig.RequiredForOnline = "enslaved"; | ||||
|         }; | ||||
|         "40-brkubnet" = { | ||||
|           matchConfig.Name = "brkubnet"; | ||||
|           bridgeConfig = { }; | ||||
|           networkConfig.LinkLocalAddressing = "no"; | ||||
|           linkConfig.RequiredForOnline = "no"; | ||||
|         }; | ||||
|         "41-vms" = { | ||||
|           matchConfig.Name = [ "vm-*" ]; | ||||
|           networkConfig.Bridge = "brkubnet"; | ||||
|           linkConfig.RequiredForOnline = "enslaved"; | ||||
|         }; | ||||
|         "42-kubnet-accuse" = { | ||||
|           matchConfig.Name = "kubnet-accuse"; | ||||
|           networkConfig.Bridge = "brkubnet"; | ||||
|           linkConfig.RequiredForOnline = "enslaved"; | ||||
|           address = [ "192.168.69.20/24" ]; | ||||
|         }; | ||||
|       }; | ||||
|     }; | ||||
|  | ||||
|   | ||||
							
								
								
									
										5
									
								
								modules/opt/default.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								modules/opt/default.nix
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| { ... }: | ||||
|  | ||||
| { | ||||
|  | ||||
| } | ||||
							
								
								
									
										5
									
								
								modules/opt/k3s-agent.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								modules/opt/k3s-agent.nix
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| { ... }: | ||||
| { | ||||
|   imports = [ ./k3s-common.nix ]; | ||||
|   services.k3s.role = "agent"; | ||||
| } | ||||
							
								
								
									
										15
									
								
								modules/opt/k3s-common.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								modules/opt/k3s-common.nix
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| { | ||||
|   config, | ||||
|   lib, | ||||
|   pkgs, | ||||
|   ... | ||||
| }: | ||||
|  | ||||
| { | ||||
|   services.k3s = { | ||||
|     enable = true; | ||||
|     extraFlags = "--cluster-cidr 192.168.69.0/24"; | ||||
|     # tokenFile = #TODO: set this up after building the first node lol | ||||
|     # serverAddr = | ||||
|   }; | ||||
| } | ||||
							
								
								
									
										6
									
								
								modules/opt/k3s-server.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								modules/opt/k3s-server.nix
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| { ... }: | ||||
| { | ||||
|   # imports = [ ./k3s-common.nix ]; | ||||
|  | ||||
|   services.k3s.role = "server"; | ||||
| } | ||||
							
								
								
									
										34
									
								
								modules/opt/microvm-host.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								modules/opt/microvm-host.nix
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| { | ||||
|   config, | ||||
|   lib, | ||||
|   inputs, | ||||
|   ... | ||||
| }: | ||||
| let | ||||
|   cfg = config.rad-dev.microvm-host; | ||||
|   microvm = inputs.microvm.nixosModules; | ||||
| in | ||||
| { | ||||
|   imports = [ microvm.host ]; | ||||
|   options.rad-dev.microvm-host = { | ||||
|     vms = lib.mkOption { | ||||
|       type = lib.types.attrs; | ||||
|       default = { }; | ||||
|       description = "A list of VMs to construct on the host"; | ||||
|     }; | ||||
|   }; | ||||
|   config = { | ||||
|     networking.useNetworkd = true; | ||||
|     microvm.vms = cfg.vms; | ||||
|  | ||||
|     # TODO: deprecate this once we have syslog forwarders | ||||
|     systemd.tmpfiles.rules = map ( | ||||
|       vmHost: | ||||
|       let | ||||
|         machineId = cfg.vms.${vmHost}.config.environment.etc."machine-id".text; | ||||
|       in | ||||
|       # creates a symlink of each MicroVM's journal under the host's /var/log/journal | ||||
|       "L+ /var/log/journal/${machineId} - - - - /var/lib/microvms/${vmHost}/journal/${machineId}" | ||||
|     ) (builtins.attrNames cfg.vms); | ||||
|   }; | ||||
| } | ||||
| @@ -9,11 +9,13 @@ | ||||
|     ./attic.nix | ||||
|     ./docker.nix | ||||
|     ./hydra.nix | ||||
|     ./microvms.nix | ||||
|     ./minio.nix | ||||
|     ./networking.nix | ||||
|     ./nextcloud.nix | ||||
|     ./services.nix | ||||
|     ./zfs.nix | ||||
|     ./networking.nix | ||||
|   ]; | ||||
|  | ||||
|   programs.git.lfs.enable = false; | ||||
|   | ||||
| @@ -1,8 +1,11 @@ | ||||
| { inputs, ... }: | ||||
| { inputs, src, ... }: | ||||
| { | ||||
|   users = [ | ||||
|     "alice" | ||||
|     "richie" | ||||
|   ]; | ||||
|   modules = [ inputs.attic.nixosModules.atticd ]; | ||||
|   modules = [ | ||||
|     inputs.attic.nixosModules.atticd | ||||
|     (src + "/modules/opt/microvm-host.nix") | ||||
|   ]; | ||||
| } | ||||
|   | ||||
							
								
								
									
										27
									
								
								systems/palatine-hill/microvms.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								systems/palatine-hill/microvms.nix
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| { | ||||
|   config, | ||||
|   lib, | ||||
|   pkgs, | ||||
|   src, | ||||
|   ... | ||||
| }: | ||||
| let | ||||
|   inherit (lib.rad-dev.microvm) genK3SVM; | ||||
| in | ||||
|  | ||||
| { | ||||
|   # rad-dev.microvm-host.enable = true; | ||||
|   rad-dev.microvm-host.vms = | ||||
|     genK3SVM (src + "/modules/opt/k3s-server.nix") (src + "/modules/opt/k3s-agent.nix") | ||||
|       { | ||||
|         "ph-server-1" = { | ||||
|           address = [ "192.168.69.10/24" ]; | ||||
|           gateway = "192.168.69.1"; | ||||
|           machine-id = "d694ad1e88b356887bb204ac665263f7"; | ||||
|           server = true; | ||||
|         }; | ||||
|         # "ph-agent-1" = { | ||||
|         #   ipv4 = "192.168.69.30"; | ||||
|         # }; | ||||
|       }; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user