{ description = "Workshop VM with Participant Containers + USB ISO"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05"; nixos-generators = { url = "github:nix-community/nixos-generators"; inputs.nixpkgs.follows = "nixpkgs"; }; }; outputs = { self, nixpkgs, nixos-generators, }: let system = "x86_64-linux"; pkgs = nixpkgs.legacyPackages.${system}; # Common configuration commonConfig = { isLiveIso ? false, }: import ./common.nix { inherit pkgs isLiveIso; }; in { packages.${system} = { local-vm = self.nixosConfigurations.workshop-vm.config.system.build.vm; live-iso = nixos-generators.nixosGenerate { inherit system; format = "iso"; modules = [ (commonConfig { isLiveIso = true; }) ]; }; }; devShells.${system}.default = pkgs.mkShell { packages = with pkgs; [ markdownlint-cli jq nixpkgs-fmt qemu ]; }; nixosConfigurations.workshop-vm = nixpkgs.lib.nixosSystem { inherit system; modules = [ "${nixpkgs}/nixos/modules/virtualisation/qemu-vm.nix" (commonConfig { isLiveIso = false; }) ( { config, pkgs, lib, ... }: { boot.loader.grub.enable = false; boot.loader.generic-extlinux-compatible.enable = true; # Enable networking for VM networking.hostName = "workshop-vm"; networking.networkmanager.enable = true; networking.firewall.enable = false; # Hybrid console configuration - serial primary, GUI available boot.kernelParams = [ "console=ttyS0,115200" "console=tty1" ]; # VM specific settings virtualisation.memorySize = 4096; virtualisation.diskSize = 40000; # Hybrid mode: GUI available but serial console primary virtualisation.qemu.options = [ "-display" "gtk" "-monitor" "stdio" # Add port forwarding for SSH "-netdev" "user,id=net0,hostfwd=tcp::2222-:22" "-device" "virtio-net,netdev=net0" ]; # GUI session commands handled in common.nix } ) ]; }; }; }