5.4 KiB
title | date | desc |
---|---|---|
My thoughts on NixOS | 2024-06-30T20:57:37Z | A few weeks ago I decided to try out NixOS. |
For about a year I have used Arch Linux, however a few weeks ago I decided to try out NixOS. Here are some of my thoughts about it.
Configuration
Overall, NixOS is a very nice distribution which feels much unlike anything else you can find out there. In particular, the way you configure NixOS is different from what you would do on Arch.
The way you configure NixOS is by writing the configuration in a language called Nix. This configuration then is read by the Nix daemon which instructs the Nix package manager to install the required packages in the Nix store.
For example if you wanted to enable OpenGL in your system you would have to write something along the lines of
hardware.graphics = {
enable = true;
enable32Bit = true;
};
Nix would install every single thing require to enable it completely automatically.
I found this brilliant, because it essentially means that someone out there has prepared the optimal config and now everyone gets to reuse it completely for free.
Take Steam for example, if you want to play games you gave to write
programs.steam.enable = true;
This single line not only installs Steam on your system, but also provides configuration which makes your system more tailored for running any games.
Let's say you are running a server and want to enable Nginx. You can do it like this to get the optimal configuration for free, without having to deal with Nginx config files.
services.nginx = {
enable = true;
recommendedGzipSettings = true;
recommendedOptimisation = true;
recommendedProxySettings = true;
recommendedTlsSettings = true;
};
This is amazing.
The way NixOS works makes it extremely easy to not only configure the system, but also save the configuration, because it's trivial to commit it into a VCS.
Home
However, there are some rough edges.
By default there isn't really a way to configure the home directory for a single user. The thing you would traditionally call dotfiles isn't really covered by vanilla NixOS.
Instead you have to install a third party module called home-manager. This allows you to install software for a single user, as well as populate the home directory with various configuration files.
I have decided to use this module in my configuration, and generally it was quite nice to use, but there were some rough edges. For example, when I tried to install KDE Connect via home-manager, it would install the one for Plasma 5 instead of Plasma 6.
services.kdeconnect.enable = true;
I found that it's better to just install this program in the main config instead.
Channels
NixOS has different channels you can use for the packages. A channels is
something like a current set of packages and/or options which can be used in
your config. Currently you can for example use the 24.05
channel for stable,
or unstable
for unstable (which actually is quite stable).
I'm kind of on the fence about channels.
On one hand it's nice that the set of packages in 24.05
is nearly set in
stone, because then updating your system is less resource intensive. On the
other hand, the packages aren't updated much which means you're stuck with
Neovim 0.9.5 for the next half a year or so -- sad!
So if you want to have newer Neovim version you have to pull it from
unstable
. Yes, it's possible to do it while having your system pinned to
stable channel. But at that point isn't it better to just pull everything from
unstable?
This is what I went with and it works for me so far, but I'm not sure how it will be like in the long run...
Flakes
There is apparently a completely different and experimental (unstable) approach to versioning the system, which breaks with the old channel system. I haven't used it myself though, so I can't give an opinion about it specifically.
One thing I can say though is that I find it pretty confusing how there are several competing systems for writing the system configuration, out of which one is experimental, but lots of people decided to use it anyways...
Final thoughts
NixOS... is interesting. It's different, you do things differently here, even though under all of these layers of abstraction, there's still Linux.
It gets some things extremely right.
It lets you pull many versions of the same package, because everything is hashed and kept in a flat store on your hard drive.
It lets you easily write the dependencies for your projects, because you can
just write a shell.nix
file which specifies them and then use nix-shell
command to pull them all into your shell.
For example to build this website I have a shell.nix
file like this
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
buildInputs = with pkgs; [
cargo
clippy
esbuild
nodePackages.pnpm
pagefind
python3
rust-analyzer
rustc
rustfmt
];
RUST_SRC_PATH = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}";
}
I can just do this to build it
kamov@msi ~/D/website (main)> nix-shell --command fish
kamov@msi ~/D/website (main)> make
Everything is isolated, you can easily rollback your system to a previous state.
You can experiment.
You can have lots of fun!
But it feels rough around the edges.
If you feel like having an adventure go right ahead...
Cheers!