Today I’ve spent some time looking for a way to rollback NixOS, and did a couple of mistakes along the way. So let me write the things I did down, so that, the next time, I don’t have to make these mistakes again
Earlier today, I’ve run
sudo nixos-rebuild switch --upgrade , and got a semi-broken system (some weird error during boot and mouse not working). I’ve booted to the previous generation, and it worked.
So I decided to make the previous generation current. I also wanted to change configuration.nix, and get the new generation based on the old state of channels. I’ve tried
sudo nixos-rebuild switch --rollback: that did make the previous generation default, but it didn’t removed the new, broken-one, from boot menu.
So, the next thing I did, which was a mistake, was to run
sudo nix-collect-garbadge -d. This didn’t remove the broken generation, but it did remove old version of channels. So,
sudo nix-channel --rollback, which is the thing I should be using in the first place, was broken now.
I however have a local copy of nixpkgs repository, so I figured I just use it instead of a channel. To do this, I needed two things:
- figure out which commit of nixpkgs I should use (it should be the one that was used by the working generation)
- figure out how to make
nixos-rebuilduse my local copy of nixpkgs.
To do the first, I run
nixos-version, which gave me a version, last component of which was the desired commit hash.
To do the second, I run
sudo nixos-rebuild switch \ -I nixpkgs=/home/matklad/projects/nixpkgs/ \ -I nixos=/home/matklad/projects/nixpkgs/nixos/
And now it all seems working