Or in other words, I ditch NixOS because it’s awkward and weird, and I install Arch because it’s awkward and weird, but in a different way. And here’s my opinion.
So I’ve been playing with NixOS for a few days now and while it does have some interesting features, it’s just a bit weird. I guess the more diplomatic way would be to say it’s not a distribution for me. This doesn’t mean you should stop using it. It also doesn’t mean NixOS is bad, so calm down.
Being declarative is pretty cool, having a single config file that contains your entire system config is a clever idea. Except it gets too big, so you end up cutting it into smaller pieces, and now you have a bunch of files to cope with. But that’s fine, should you want to reinstall your whole system, copying that directory of files into the new installation will instantly set the system up.
Why does the config get so big? Well it turns out the .nix files everything lives in is actually a Turing complete programming language by itself. So you’re free to get lost in the programmer faff of refactoring your system to be “better”. Got more than one machine? You can have a mega config that knows what machine it is on and activates the correct kernel modules, etc.
Want a dev machine, a desktop machine and a test VM for playing in? You can do that very easily, each with the same user account, but different software to match the purpose of the machine.
Except this doesn’t really extend to much beyond the core system because most things in your home directory, like the entirety of KDE/Gnome or whatever else you have installed need setting up too. Yes you can install Home Manager, make a dotfiles directory and put your config in there, synced to a Github repo, but there’s a whole load of stuff that fiddles with its own config files and you can’t let NixOS take over or your changes will get wiped out.
Although from the YouTube videos I’ve watched, a typical NixOS user seems to just live in Hyprland with its tiling window manager, using NeoVim to edit text config files. They never seem to do much actual work.
There’s also flakes, and a weird weird political oddness about the whole project, with different factions of users falling out with each other over features that should and shouldn’t exist.
But all of that is quite easy to cope with if you’ve been using Linux for over 20 years and are capable of programming in several languages. It’s all kind of sensible if you do a lot of reading of the docs. And are able to cope with the docs being vague or incomplete, or being reddit threads with unexplained code.
It’s just, I don’t want to do that faff with my actual OS. I’m going through that with the software I’m writing. One lot of poorly documented tools and educated guesswork is enough, I don’t need it everywhere on my computer.
The bit that’s hard to cope with is installing software. The Nix packages library is massive, everything you could ever want is in there, easily installable.
Except that binary only package you have, or that random thing off Github you need to compile manually. Nix doesn’t like those unless you hand roll your own package for them which isn’t a simple task if the thing you’re trying to install is a large, complex piece of software – or written by someone else and your normal procedure is
- Install all the dependencies
- ./configure
- make
- make install
You need to actually learn how to write a Nix program to do this for you, but it’s not very well explained for anything but the simplest of examples. And you have to do that even if the program doesn’t need installing and is going to live in your home directory.
There is no “just install GCC on your system, install all the headers and libraries”. Everything is contained.
The Agon Light emulator I use is quite easy to set up on a regular Linux system – download the precompiled binary and run it.
But you can’t do that on NixOS, it doesn’t use the regular Linux .so linker system. So you have to compile it by hand, using nix-build. Except this package is on github with submodules. The submodules are written in C++, the program itself is written in Rust.
I couldn’t figure it out, and came to the conclusion I was spending more time trying to get a piece of software installed, and going down a rabbit hole of learning how to make packages, than actually using the machine.
No doubt to someone who’s spent years using this, it’s a five minute job and quite easy. I can set up a reverse-proxied LXC container running nginx with Let’s Encrypt SSL certs in a few minutes, it’s easy. I’ve done it at least 30 times. It’s not documented anywhere, but obvious to me now I’ve done it so much.
I just don’t have that much time to invest in basic tasks I can do easily on another distro. I’ve come to the conclusion NixOS is not actually a Linux distro. It runs the Linux kernel, but that’s where the similarity stops. It’s like thinking MacOS X is the same as Linux.
So I wiped my machine and installed Arch. It has no installer, you literally bootstrap the machine yourself by hand, make a few core config files, run some stuff and have to manually install all the packages you need.
Took me two reboots before I’d figured out how to get wifi working, and I don’t think I have Intel accelerated graphics working properly, but my Surface is running its own kernel and doesn’t overheat, which is a bonus.
Also I can just install stuff using its package manager.
I decided I don’t care about having a reproducible system, I tend to install my OS once, install software and that’s it. I’m not constantly removing and reinstalling a VM full of test things to play around. I’m sure NixOS is wonderful for that.
I’m also quite certain that at some point Arch’s rolling update system will have me accidentally updating a core piece of software and breaking my machine. But I hand installed it, so I feel more able to fix it.
I had to hand install grub. On Ubuntu I didn’t even know how to run it to configure a new kernel. If my bootloader broke, I literally had no clue how to fix it. On Arch, this was one of the first steps with installing a new system.