| Title: NixOS review: pros and cons | |
| Author: Solène | |
| Date: 22 January 2021 | |
| Tags: nixos linux | |
| Description: | |
| Hello, in this article I would like to share my thoughts about the | |
| NixOS Linux distribution. I've been using it daily for more than six | |
| months as my main workstation at work and on some computer at home too. | |
| I also made modest contributions to the git repository. | |
| NixOS official website | |
| ## Introduction | |
| NixOS is a Linux distribution built around Nix tool. I'll try to | |
| explain quickly what Nix is but if you want more accurate explanations | |
| I recommend visiting the project website. Nix is the package manager | |
| of the system, Nix could be used on any Linux distribution on top of | |
| the distribution package manager. NixOS is built from top to bottom | |
| from Nix. | |
| This makes NixOS a system entirely different than what one can expect | |
| from a regular Linux/Unix system (with the exception of Guix sharing | |
| the same idea with a different implementation). NixOS system | |
| configuration is stateless, most of the system is in read-only and most | |
| of paths you know doesn't exist. The directory /bin/sh only contains | |
| "sh" which is a symlink. | |
| The whole system configuration: fstab, packages, users, services, | |
| crontab, firewall... is configured from a global configuration file | |
| that defines the state of the system. | |
| An example of my configuration file to enable graphical interface with | |
| Mate as a desktop and a french keyboard layout. | |
| ```Code sample for nixos configuration file | |
| services.xserver.enable = true; | |
| services.xserver.layout = "fr"; | |
| services.xserver.libinput.enable = true; | |
| services.xserver.displayManager.lightdm.enable = true; | |
| services.xserver.desktopManager.mate.enable = true; | |
| ``` | |
| I could add the following lines into the configuration to add auto | |
| login into my graphical session. | |
| ```Code sample for nixos configuration file | |
| services.xserver.displayManager.autoLogin.enable = true; | |
| services.xserver.displayManager.autoLogin.user = "solene"; | |
| ``` | |
| ## Pros | |
| There are a lot of pros. The system is really easy to setup, | |
| installing a system (for a reinstall or replicate an installation) is | |
| very easy, you only need to get the configuration.nix file from the | |
| other/previous system. Everything is very fast to setup, it's often | |
| only a few lines to add to the configuration. | |
| Every time the system is rebuilt from the configuration file, a new | |
| grub entry is made so at boot you can choose on which environment you | |
| want to boot. This make upgrades or tries very easy to rollback and | |
| safe. | |
| Documentation! The NixOS documentation is very nice and is part of the | |
| code. There is a special man page "configuration.nix" in the system | |
| that contains all variables you can define, what values to expect, what | |
| is the default and what it's doing. You can literally search for | |
| "steam", "mediawiki" or "luks" to get information to configure your | |
| system. | |
| All the documentation | |
| Builds are reproducible, I don't consider it a huge advantage but it's | |
| nice to have it. This allow to challenge a package mirror by building | |
| packages locally and verifying they provide the exact same package on | |
| the mirror. | |
| It has a lot of packages. I think the NixOS team is pretty happy to | |
| share their statistics because, if I got it right, Nixpkgs is the | |
| biggest and up to date repository alive. | |
| Search for a package | |
| ## Cons | |
| When you download a pre compiled Linux program that isn't statically | |
| built, it's a huge pain to make it work on NixOS. The binary will | |
| expect some paths to exist at usual places but they won't exist on | |
| NixOS. There are some tricks to get them work but it's not always | |
| easy. If the program you want isn't in the packages, it may not be | |
| easy to use it. Flatpak can help to get some programs if they are not | |
| in the packages though. | |
| Running binaries | |
| It takes disk space, some libraries can exist at the same time with | |
| small compilation differences. A program can exist with different | |
| version at the same time because of previous builds still available for | |
| boot in grub, if you forget to clean them it takes a lot of memory. | |
| The whole system (especially for graphical environments) may not feel | |
| as polished as more mainstream distributions putting a lot of efforts | |
| into branding and customization. NixOS will only install everything | |
| and you will have a quite raw environment that you will have to | |
| configure. It's not a real cons but in comparison to other desktop | |
| oriented distributions, NixOS may not look as good out of the box. | |
| ## Conclusion | |
| NixOS is an awesome piece of software. It works very well and I never | |
| had any reliability issue with it. Some services like xrdp are usually | |
| quite complex to setup but it worked out of the box here for me. | |
| I see it as a huge Lego© box with which you can automate the building | |
| of the super system you want, given you have the schematics of its | |
| parts. Once you need a block you don't have in your recipes list, you | |
| will have a hard time. | |
| I really classify it into its own category, in comparison to Linux/BSD | |
| distributions and Windows, there is the NixOS / Guix category with | |
| those stateless systems for which the configuration is their code. |