A sealed image bakes no per-VM data. generalize.nix gains a gated configMedium flag (false path byte-identical, so the shared macOS generalize path is untouched): the baked answer file stays generic and the target's first boot reads hostname/static-IP/timezone/tint off a small removable CD via a finder (vmix-load-config.cmd) + applier (vmix-apply-config.ps1), with the static-IP script dot-sourcing the same config. templates.seal is a thin preset (delayOobeRun + configMedium + D:\Users profiles + a data disk); images gain a .seal leaf next to .generalize; makeConfigMedium renders the per-VM ISO. So one sealed store path is shared by every VM, each mints its own SID on first boot and builds the whole profile on D:, and only a cheap ISO is per-VM. Also folds in the delayOobeRun reconcile: extraDisk (and the audit-mode data-disk init) are gated off under deferral, so a sealed image ships with no throwaway `data` output -- the target's specialize formats the host zvol instead. vms: disks.config.file attaches the config medium as a second CD-ROM. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0117qMyjpuXsjpVAcpJbFD8g
39 lines
1.8 KiB
Nix
39 lines
1.8 KiB
Nix
{ pkgs, lib, system, ... }:
|
|
let
|
|
windows = rec {
|
|
drivers = import ./drivers { inherit pkgs system; };
|
|
makeFilesISO = (import ./helpers/makeFilesISO.nix) { inherit pkgs; };
|
|
makeConfigMedium = (import ./helpers/makeConfigMedium.nix) { inherit pkgs lib makeFilesISO; };
|
|
customizeImage = (import ./helpers/customizeImage.nix) { inherit pkgs lib; };
|
|
customizeImageFold = builtins.foldl' customizeImage;
|
|
templates = (import ./templates) { inherit pkgs lib system drivers makeFilesISO; };
|
|
makeAuditModeAutounattend = (import ./helpers/makeAuditModeAutounattend.nix) { inherit pkgs lib; };
|
|
makeWinISO = (import ./helpers/makeWinISO.nix) { inherit pkgs; };
|
|
makeImage = (import ./helpers/makeImage.nix) { inherit pkgs lib drivers makeWinISO makeAuditModeAutounattend; };
|
|
};
|
|
|
|
win10 = (import ./win10) { inherit pkgs lib system windows; };
|
|
win11 = (import ./win11) { inherit pkgs lib system windows; };
|
|
|
|
# Recursively add .generalize and .seal to every derivation leaf in the tree
|
|
addGeneralize = val:
|
|
if val ? _vmixOsType then
|
|
val // {
|
|
generalize = args:
|
|
let
|
|
templateArgs = builtins.removeAttrs args [ "vncDisplay" ];
|
|
displayArgs = lib.optionalAttrs (args ? vncDisplay) { inherit (args) vncDisplay; };
|
|
in windows.customizeImage val (windows.templates.generalize templateArgs // displayArgs);
|
|
seal = args:
|
|
let
|
|
templateArgs = builtins.removeAttrs args [ "vncDisplay" ];
|
|
displayArgs = lib.optionalAttrs (args ? vncDisplay) { inherit (args) vncDisplay; };
|
|
in windows.customizeImage val (windows.templates.seal templateArgs // displayArgs);
|
|
}
|
|
else if builtins.isAttrs val then
|
|
lib.mapAttrs (_: addGeneralize) val
|
|
else val;
|
|
|
|
in windows // {
|
|
images = addGeneralize { inherit win10 win11; };
|
|
}
|