fix(install): substitute from the live daemon store during the target build

nixos-install builds with --store /mnt and passes its own substituter as
"auto?trusted=1", which in that context resolves to the target store
itself — so nothing flowed from the ISO and nix fell back to a
full-source bootstrap (gcc/python/bash tarball fetches → offline death).
Host-store simulation (fresh local?root, substituters cleared) proves
"daemon?trusted=1" makes the whole install substitute + build offline:
1125 paths copied, only the per-machine config drvs built locally.

Also drop --offline from the chroot HM build (that flag disables ALL
substituters; plain empty substituters does what we want without it).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Bernardo Magri
2026-06-11 08:51:30 +01:00
parent 3b0b2872aa
commit dba349a539

View File

@@ -70,10 +70,14 @@ export NIX_CONFIG="flake-registry = $SHARE/registry.json"
# With no network, every substituter query is a DNS timeout + retry storm
# (and tickles a nix goal.cc assertion crash). Everything an install needs
# is pinned into the ISO — drop substituters entirely when offline.
# is pinned into the ISO — drop the binary caches and substitute from the
# live store's daemon instead. The explicit daemon substituter matters:
# nixos-install builds with --store /mnt and its own "auto?trusted=1"
# substituter resolves to the TARGET store (i.e. itself), so without
# this nothing flows from the ISO and nix bootstraps gcc from source.
if ! timeout 3 bash -c '</dev/tcp/cache.nixos.org/443' 2>/dev/null; then
info "No network — disabling binary caches (the ISO carries everything)."
NIX_CONFIG+=$'\nsubstituters =\nbuilders ='
info "No network — substituting from the ISO store only."
NIX_CONFIG+=$'\nsubstituters =\nextra-substituters = daemon?trusted=1\nbuilders ='
fi
# ─── Disk selection ─────────────────────────────────────────────────────
@@ -439,7 +443,8 @@ set -e
export PATH=/run/current-system/sw/bin:\$PATH
export NIX_CONFIG=$(printf '%q' "$NIX_CONFIG")
out=\$(nix --extra-experimental-features "nix-command flakes" \
build --offline --no-link --print-out-paths \
build --no-link --print-out-paths \
--option substituters "" \
"/home/$USERNAME/.nomarchy#homeConfigurations.$USERNAME.activationPackage")
install -d -o "$USERNAME" -g users /nix/var/nix/profiles/per-user/$USERNAME
install -d -o "$USERNAME" -g users /nix/var/nix/gcroots/per-user/$USERNAME