As the title says, instead of the channel being managed by nix, I’d like to specify it directly in the configuration.nix
file. Is this possible?
Yup, I have deleted all my channels and do this:
let
channelRelease = "nixos-19.09pre182429.98e3b90b6c8"; # 2019-06-11 02:29:22
channelName = "unstable";
url = "https://releases.nixos.org/nixos/${channelName}/${channelRelease}/nixexprs.tar.xz";
sha256 = "1x5c4w5yh839zvinjiprl4gj8w8cpqg215iab1qy62rrfpwyx55b";
pinnedNixpkgs = builtins.fetchTarball {
inherit url sha256;
};
in
....
nix.nixPath = [
"nixpkgs=${pinnedNixpkgs}"
"nixos-config=/etc/nixos/configuration.nix"
];
programs.command-not-found = {
enable = true;
dbPath = "${pinnedNixpkgs}/programs.sqlite";
};
Usually you’d need to rebuild twice, because the first rebuild doesn’t use the nixPath in the config.
Or you can build with
sudo nixos-rebuild -I nixpkgs=https://releases.nixos.org/nixos/unstable/nixos-19.09pre182429.98e3b90b6c8/nixexprs.tar.xz test
I fetch from releases.nixos.org becaues there a programs.sqlite database was generated with all the programs and in which package they are.
Edit: I made this answer complete, including the corrections in the following answers.
Seems to work fine for me, thanks! A question though: How do I find out the channelRelease
for the most current nixos-unstable
?
Edit: Also, after removing my only channel via nix-channel --remove
, nix-shell
gives me a an error about file 'nixpkgs' was not found
. Do I simply have to re-login so some environment variable gets updated?
Yes this option set an environment variable used by the nix commands, you will have to relogin or open a new shell to use it.
Oh yes and also you have to rebuild twice because for the first rebuild your current channel will be used.
To have it build in one go, you can use
sudo nixos-rebuild -I nixpkgs=https://releases.nixos.org/nixos/unstable/nixos-19.09pre182429.98e3b90b6c8/nixexprs.tar.xz test
You can find the latest channel information here: nixos-unstable release nixos-24.05pre582649.d934204a0f8d
If you wanted, you could also fetch a commit directly from the source repo, but as I said, those don’t contain programs.sqlite
and you command-not-found
will not work. (Well you could use that from the channel. It doesn’t really matter if it’s out of date)
Excellent, seems to work fine. Thanks!
Strange. Now when I try to nixos-rebuild switch
, I get:
error: file 'nixos-config' was not found in the Nix search path (add it using $NIX_PATH or -I), at /nix/store/4xv8ps2vlsaz8gam9w4kvq2rz54fp8kp-nixexprs.tar.xz/nixos/default.nix:1:60
My NIX_PATH
is:
/root/.nix-defexpr/channels:nixpkgs=/nix/store/3k66012dfv1cw5bybm1jcx64gg98ymaf-source
Edit: After manually augmenting my NIX_PATH
with nixos-config=/etc/nixos/configuration.nix
, rebuilding works. But you apparently don’t need that @JohnAZoidberg?
Edit 2: Also, rebuilding now doesn’t work with sudo
anymore.
I do need nixos-config=/etc/nixos/configuration.nix
, sorry. It’s in my config but I omitted it because I thought it wasn’t needed.
Should work with sudo though.
I’ve also got this (zoid being my username) but I think I needed that for a different reason (I think for installing unsigned derivations e.g. from cachix)
nix.trustedUsers = [ "root" "zoid" ];
I’m slowly realizing that now, my system ist broken. Updating via "change configuration.nix
, then sudo nixos-rebuild switch
doesn’t work anymore. It doesn’t switch to a “whole” new configuration. When I restart my system and then execute nixos-rebuild switch
, it “really” switches. nix-shell
also downloads new packages after the “pseudo-switch” when I ask for them.
Pinning nixpkgs in configuration.nix? · Issue #62832 · NixOS/nixpkgs · GitHub essentially the same question. Bottom line is that this doesn’t work well though.
@lheckemann Oh, thanks for that link! I’ll go back to channels for now, then.
It’s best to create a little wrapper script that sets the NIX_PATH for you instead.
./rebuild
#!/usr/bin/env bash
set -euo pipefail
# allow to call the script from any $PWD
cd "$(dirname "$0")"
# replace with a pinned version if you want
NIX_PATH=nixpkgs=channel:nixos-unstable
# get the config from the same repo instead of /etc/nixos
NIX_PATH=$NIX_PATH:nixos-config=$PWD/machines/$(hostname)/configuration.nix
export NIX_PATH
exec nixos-rebuild "$@"
Put everything in a repo and then instead run sudo ./rebuild switch
to update the system.
Once you have multiple machines it also makes it easy to share configuration using the module imports mechanism.
When I do that I lose the ability to start a nix-shell
as a normal user:
warning: Nix search path entry '/nix/var/nix/profiles/per-user/root/channels/nixos' does not exist, ignoring
error: file 'nixpkgs' was not found in the Nix search path (add it using $NIX_PATH or -I), at (string):1:
You can solve this by also setting the NIX_PATH in the configuration.nix:
nix.nixPath = [
"nixpkgs=${toString pkgs.path}"
];