For the last month or so I haven't been able to update My NixOS configuration because
nixpkgs build
would fail. I can build and deploy the system once with an updated nixpkgs
but future invocations would fail:
<string value="3y2ymjdad71ilw7rpl71xwsj0pv9js36-nixpkgs/nixpkgs/nixos/modules/rename.nix" />
<string value="3y2ymjdad71ilw7rpl71xwsj0pv9js36-nixpkgs/nixpkgs/nixos/modules/services/x11/desktop-managers/cinnamon.nix" />
<string value="3y2ymjdad71ilw7rpl71xwsj0pv9js36-nixpkgs/nixpkgs/nixos/modules/system/etc/etc.nix" />
<string value="3y2ymjdad71ilw7rpl71xwsj0pv9js36-nixpkgs/nixpkgs/nixos/modules/system/etc/etc.nix" />
<string value="3y2ymjdad71ilw7rpl71xwsj0pv9js36-nixpkgs/nixpkgs/nixos/modules/system/etc/etc.nix" />
<string value="3y2ymjdad71ilw7rpl71xwsj0pv9js36-nixpkgs/nixpkgs/nixos/modules/system/etc/etc.nix" />
<string value="3y2ymjdad71ilw7rpl71xwsj0pv9js36-nixpkgs/nixpkgs/nixos/modules/system/etc/etc.nix" />
[...redacting much of this]
<string value="3y2ymjdad71ilw7rpl71xwsj0pv9js36-nixpkgs/nixpkgs/nixos/modules/virtualisation/qemu-vm.nix" />
<string value="3y2ymjdad71ilw7rpl71xwsj0pv9js36-nixpkgs/nixpkgs/nixos/modules/virtualisation/qemu-vm.nix" />
The manual appears to depend on the location of Nixpkgs, which is bad
since this prevents sharing via the NixOS channel. This is typically
caused by an option default that refers to a relative path (see above
for hints about the offending path).
Something about my system's invocation of the subsystems which
dynamically generate the OS configuration manpages man configuration.nix
and co were failing to
strip the nixpkgs
path from the docbooks
which were being generated. I could disable the documentation but I
use the documentation a lot when developing Arroyo, when assembling the Wobserver, when updating my system.
I can't simply disable that and rely on "oh just grep the nixpkgs source
code or use this webpage someone else hosts"… In fact I'm using it right
now to draft this blog post which will then reintegrate in to my
system!
But I couldn't update more than once:
nix channel --update
morph deploy # works
morph deploy # fails
nix channel --rollback
to known-working nixpkgs+nixosmorph deploy
# still fails!switch-to-configuration
to the previous buildmorph build # works
Frustrating. And no one really has seen anything like this or could
tell me much about how to fix it. I spent some time the last few weeks
trying to figure out how to build My NixOS configuration as a nix flake since that would
make it easier to bisect or narrow down problems without having to do
all this nix-channel
chicanery but Morph cannot deploy a flake right property right now without a
shim that someone describes but does not show and so I am resorting to
sillier methodologies.
Briefly: NIX_PATH
The Nix
Pills guide talks about NIX_PATH
in
chapter 15.
NIX_PATH
is used to resolve things like
import <nixpkgs>
and in the default
configuration this points to a few places:
/home/rrix/.nix-defexpr/channels
nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixos
nixos-config=/etc/nixos/configuration.nix
/nix/var/nix/profiles/per-user/root/channels
nix-instantiate --eval -E '<nixpkgs>'
NIX_PATH=/home/rrix/.nix-defexpr/channels:nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixos:nixos-config=/etc/nixos/configuration.nix:/nix/var/nix/profiles/per-user/root/channels nix-instantiate --eval -E '<nixpkgs>'
NIX_PATH=/home/rrix.nix-defexpr/channels:nixpkgs=/home/rrix/Code/nixpkgs nix-instantiate --eval -E '<nixpkgs>'
NIX_PATH=nixpkgs=/home/rrix/Code/nixpkgs nix-instantiate --eval -E '<nixpkgs>'
/home/rrix/Code/nixpkgs |
/nix/var/nix/profiles/per-user/root/channels/nixos |
/home/rrix/Code/nixpkgs |
/home/rrix/Code/nixpkgs |
Overriding my
NIX_PATH
to build with local nixpkgs
To bootstrap my system back together I updated my nixpkgs
checkout to the version listed on status.nixos.org and then Morph'd Meadow Crush, my GPD Pocket, as a development
mule to validate that it wouldn't have the same issues.
[nix-shell:~/Code/nixpkgs]$ export NIX_PATH=nixos=/home/rrix/Code/nixpkgs/nixos:nixpkgs=/home/rrix/Code/nixpkgs:nixos-config=/etc/nixos/configuration.nix:/nix/var/nix/profiles/per-user/root/channels;
[nix-shell:~/Code/nixpkgs]$ morph deploy ~/org/cce/nixlib/nixops/laptops.nix switch --on=meadow-crush --passwd
And then I did it again. And then I did it from within Meadow Crush. The only problems are
that a few GUI applications miss cache.nixos.org
the Binary Cache, well okay,
that's fine at least I'm not running out of date software with bugs
fixed upstream.
I took the plunge and had Meadow Crush deploy back to my Framework laptop, Virtuous Cassette, and that worked:
[nix-shell:~/Code/nixpkgs]$ cat /etc/os-release | grep BUILD_ID
BUILD_ID="22.05.git.41cc1d5d958"
But I still cannot "simply" update my system channels and deploy! In
theory I could spend some time tracking down the differences in the
evaluation, but I simply would rather not. In fact, I have wanted to
move away from using channels in general so that I could have a
declarative pin for my nixpkgs
version. I
could just … have that. With flakes you don't need to have a nixpkgs
lying around to bootstrap your system
and with this model you still do, though frankly I am not so concerned
with that as I use Syncthing already to
keep this all in a reasonable state of flow.
And so what if I just make my single-admin systems use the nixpkgs
i already have cloned?
{ ... }:
{
nix.nixPath = [
"nixos=/home/rrix/Code/nixpkgs/nixos"
"nixpkgs=/home/rrix/Code/nixpkgs"
"arroyo=/home/rrix/arroyo-nix"
];
}
This can and should be set to the local user's defexpr
file as well, which prevents Nix
from recreating the channel definitions and modifying NIX_PATH
to include them:
{
nixpkgs = import /home/rrix/Code/nixpkgs {};
nixos = import /home/rrix/Code/nixpkgs/nixos {};
}
{ config, pkgs, ... }:
{
home.activation.defexpr = pkgs.lib.mkActivationLocalLink config
"/home/rrix/org/cce/nixlib/defexpr.nix"
".nix-defexpr";
}
We'll see how fucked up this is, but now at least I can Flood the Arroyo. I had to move
~/.nix-defexpr/
away because the nix-daemon
module which defines this nixPath
variable adds a bit to the default system profile without a disablement
flag.
if [ -e "$HOME/.nix-defexpr/channels" ]; then
export NIX_PATH="$HOME/.nix-defexpr/channels${NIX_PATH:+:$NIX_PATH}"
fi
ehehehehe thanks homie.
Keeping my nixpkgs
checkout up to date
Updating the Nixpkgs checkout can be by invoking something like cce/update-nixpkgs-checkout
:
use-package plz)
(defun cce/update-nixpkgs-checkout ()
(
(interactive)let ((path "/home/rrix/Code/nixpkgs/"))
(
(with-current-buffer (find-file-noselect path)let* ((channel-status (split-string
('get "https://channels.nix.gsc.io/nixos-23.05/latest")
(plz " "))
second channel-status)))
(nixpkgs-unstable-ts (string-to-number (first channel-status)))
(nixpkgs-unstable ("git fetch --all")
(shell-command ;; (magit-fetch-all nil)
"origin/nixos-23.05")
(magit-merge-plain "updated nixpkgs checkout to %s"
(message "%c" nixpkgs-unstable-ts))))))
(format-time-string provide 'cce/nixpkgs) (
This relies on plz
pulled in by Ement.el, and Magit. I'm sure the continuing tarpit of the
lovely little local minima I've constructed here will continue to be
sustainable.