Last time I didn’t upgrade for a long while some drivers broke, maybe I’ll just switch to NixOS this time since it seems interesting. Does anyone here use NixOS? What do you think about it?
Last time I didn’t upgrade for a long while some drivers broke, maybe I’ll just switch to NixOS this time since it seems interesting. Does anyone here use NixOS? What do you think about it?
NixOS + Home Manager user here.
I run in an opt-in state config. / is tmpfs. /home is tmpfs. /boot and /nix are real filesystems. At boot, the EFI loader reads the configuration from /nix/persist/etc/nixos/flake.nix, symlinks all the programs and configs into / and /home, and startup proceeds as normal.
That means nothing persists across boots unless I add it to my config. Cruft doesn’t accumulate in hidden areas, it’s all in my config. That keeps things fast, makes management easier, and makes troubleshooting easier.
The more I see about NixOS, the less I understand it.
Is it a pain in the ass to use on a daily basis? It just seems like one of those things where the juice isn’t worth the squeeze.
Daily use isn’t difficult IME. NixOS is just so nice once it’s working. It’s ridiculously easy to understand your system & how it’s set up (it’s all in your config). Nothing changes between updates that you don’t know about. You never have to merge configurations from upstream. It’s trivial to try something new without changing your system overall. Rollbacks are amazing. It’s easy to configure a new machine, to keep multiple machines synchronized (same packages & versions & even users & dotfiles). I have automatic updates enabled so I get a new system when I reboot, and if I don’t like an update I can just revert seamlessly. It basically works like an appliance: I don’t have to think about the way it’s set up unless I disagree with the defaults, and in that case I can change them. You can always override things, even down to applying patches to source code (though obviously that then requires re-compiling). It’s like if you took the stability of Debian, the up-to-date nature and huge repo of Arch & the AUR, and the configurability of Gentoo and mashed them all together.
The hard bits are packaging new programs and making “modules”. You can pretty much always configure a program by just writing the config file options in a Nix string block, e.g. I’ve got the following in my home-manager config for my
~/.xkbrc
:home.file.".config/kxkbrc" = { text = '' [$Version] update_info=kxkb_variants.upd:split-variants [Layout] DisplayNames= LayoutList=us LayoutLoopCount=-1 Model=pc86 Options=terminate:ctrl_alt_bksp,compose:rctrl ResetOldOptions=true SwitchMode=Global Use=true VariantList=colemak ''; };
Modules would let that be a Nix expression, e.g. looking like
programs.xkeyboard = { layout = "us"; variant = "colemak"; model = "pc86"; options = { terminate = "ctrl_alt_bksp"; compose = "rctrl"; }; resetOldOptions = true; };
but that requires writing an expression in Nix that converts the Nix syntax into whatever syntax the config file needs to be. That means learning a lot more Nix. Packaging programs also requires learning more Nix, and particularly how Nixpkgs builders work.
That said, the documentation is shitty, the error messages are shitty, Flakes are massively easier to work with but still “experimental” and lots of the docs & examples online are for pre-flakes, while nixpkgs is enormous it doesn’t have everything, and IDE support for Nix shell environments is lacking (have to use VS Code or a terminal-based editor like nvim).
Nix is sort of like democracy. Democracy is the worst form of government, except for all the others. Nix is the worst way to manage an OS, except for all the others. It’s shitty, but it’s shitty in different ways and those mostly end up making day-to-day operations easier.