fix(installer): start nix-daemon and trust flake repo for HM activation
HM activation inside `nixos-enter` failed with `big.lock: Permission denied` because the chroot has no systemd and therefore no nix-daemon — the user-level `nix run` fell back to single-user mode and couldn't write /nix/var/nix/db. Launch nix-daemon manually for the activation window and force NIX_REMOTE=daemon. Also mark /etc/nixos (and the impermanence path) as a git safe.directory so HM doesn't trip over git's dubious-ownership check on the root-owned repo. Make nomarchy-env-update self-bootstrap via `nix run home-manager` when home-manager isn't on PATH so the recovery hint actually works on a freshly-installed system. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -21,8 +21,17 @@ if command -v nomarchy-preflight-migration >/dev/null 2>&1; then
|
|||||||
nomarchy-preflight-migration
|
nomarchy-preflight-migration
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Apply Home Manager changes from the local flake (Standalone)
|
# Apply Home Manager changes from the local flake (Standalone).
|
||||||
|
# On a freshly-installed system where the installer's HM activation failed,
|
||||||
|
# `home-manager` won't be on PATH yet — fall back to `nix run` so this
|
||||||
|
# script can recover the install instead of erroring on a missing binary.
|
||||||
echo "Applying user-level changes from $REPO_DIR#$USER..."
|
echo "Applying user-level changes from $REPO_DIR#$USER..."
|
||||||
home-manager switch --flake "$REPO_DIR#$USER" --impure
|
if command -v home-manager >/dev/null 2>&1; then
|
||||||
|
home-manager switch --flake "$REPO_DIR#$USER" --impure
|
||||||
|
else
|
||||||
|
nix --extra-experimental-features 'nix-command flakes' \
|
||||||
|
run 'home-manager/release-25.11' \
|
||||||
|
-- switch --flake "$REPO_DIR#$USER" --impure
|
||||||
|
fi
|
||||||
|
|
||||||
echo "Environment update complete."
|
echo "Environment update complete."
|
||||||
|
|||||||
@@ -1266,10 +1266,31 @@ execute_installation() {
|
|||||||
# `runuser -u … -- env HOME=…` switches uid only and leaves \$USER
|
# `runuser -u … -- env HOME=…` switches uid only and leaves \$USER
|
||||||
# as root, which is what landed the dotfiles in /root previously.
|
# as root, which is what landed the dotfiles in /root previously.
|
||||||
info "Activating Home Manager for $USERNAME..."
|
info "Activating Home Manager for $USERNAME..."
|
||||||
|
# `nixos-enter` chroots without starting systemd, so nix-daemon isn't
|
||||||
|
# running. A user-level `nix run` would then fall back to single-user
|
||||||
|
# mode and try to write /nix/var/nix/db directly — which root owns in
|
||||||
|
# the multi-user store, so it fails with "big.lock: Permission denied".
|
||||||
|
# Launch the daemon manually for the duration of the activation.
|
||||||
if nixos-enter --root /mnt -- bash -c "
|
if nixos-enter --root /mnt -- bash -c "
|
||||||
set -e
|
set -e
|
||||||
install -d -o '$USERNAME' -g users -m 0755 '/home/$USERNAME'
|
install -d -o '$USERNAME' -g users -m 0755 '/home/$USERNAME'
|
||||||
runuser -l '$USERNAME' -c \"nix --extra-experimental-features 'nix-command flakes' run 'home-manager/release-25.11' -- switch --flake '/etc/nixos#$USERNAME' --impure\"
|
|
||||||
|
# /etc/nixos is a git repo owned by root (we init it as root above).
|
||||||
|
# When HM runs as the user, nix invokes git, which refuses with
|
||||||
|
# 'dubious ownership' unless the path is marked safe system-wide.
|
||||||
|
git config --system --add safe.directory /etc/nixos || true
|
||||||
|
git config --system --add safe.directory /persist/etc/nixos || true
|
||||||
|
|
||||||
|
/run/current-system/sw/bin/nix-daemon --daemon &
|
||||||
|
DAEMON_PID=\$!
|
||||||
|
trap 'kill \$DAEMON_PID 2>/dev/null || true' EXIT
|
||||||
|
|
||||||
|
for _ in \$(seq 1 50); do
|
||||||
|
[ -S /nix/var/nix/daemon-socket/socket ] && break
|
||||||
|
sleep 0.1
|
||||||
|
done
|
||||||
|
|
||||||
|
runuser -l '$USERNAME' -c \"NIX_REMOTE=daemon nix --extra-experimental-features 'nix-command flakes' run 'home-manager/release-25.11' -- switch --flake '/etc/nixos#$USERNAME' --impure\"
|
||||||
"; then
|
"; then
|
||||||
success "Home Manager activated"
|
success "Home Manager activated"
|
||||||
else
|
else
|
||||||
|
|||||||
Reference in New Issue
Block a user