I hopped from arch (2010-2019) to Nixos (2019-2023). I had my issues with it but being a functional programmer, I really liked the declarative style of configuring your OS. That was until last week. I decided to try out void Linux (musl). I’m happy with it so far.

Why did I switch?

  1. Nix is extremely slow and data intensive (compared to xbps). I mean sometimes 100-1000x or more. I know it is not a fair comparison because nix is doing much more. Even for small tweaks or dependency / toolchain update it’ll download/rebuild all packages. This would mean 3-10GB (or more) download on Nixos for something that is a few KB or MB on xbps.

  2. Everything is noticeably slower. My system used way more CPU and Ram even during idle. CPU was at 1-3% during idle and my battery life was 2 to 3.5h. Xfce idle ram usage was 1.5 GB on Nixos. On Void it’s around 0.5GB. I easily get 5-7h of battery life for my normal usage. It is 10h-12h if I am reading an ebook.

Nix disables a lot of compiler optimisations apparently for reproducibility. Maybe this is the reason?

  1. Just a lot of random bugs. Firefox would sometimes leak memory and hang. I have only 8 GB of ram. WiFi reconnecting all the time randomly. No such issues so far with void.

  2. Of course the abstractions and the language have a learning curve. It’s harder for a beginner to package or do something which is not already exposed as an option. (This wasn’t a big issue for me most of the time.)

For now, I’ll enjoy the speed and simplicity of void. It has less packages compared to nix but I have flatpak if needed. So far, I had to install only Android studio with it.

My verdict is to use Nixos for servers and shared dev environments. For desktop it’s probably not suitable for most.

  • lloram239@feddit.dedeleted by creator
    link
    fedilink
    arrow-up
    1
    ·
    3 年前

    Good question. NUR doesn’t seem to output the packages directly, but requires that you supply your pkgs manually. You can use nix shell with NUR, but it gets rather ugly:

    nix shell --impure --expr '(import (builtins.getFlake github:nix-community/NUR) { pkgs = (import  {}).pkgs; }).repos.mic92.hello-nur'
    

    nix registry doesn’t help here, as it’s just for managing aliases that allow you to type “nixpkgs” instead of “github:NixOS/nixpkgs/nixos-23.05” in some places.

    It might be possible to write a flake that outputs NUR packages for direct use, e.g. something like:

    {
      inputs = {
        nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.05";
        flake-utils.url = "github:numtide/flake-utils";
        nur_src.url = "github:nix-community/NUR";
      };
    
      outputs = { self, nixpkgs, flake-utils, nur_src }:
        flake-utils.lib.eachDefaultSystem (system:
          let
            pkgs = nixpkgs.legacyPackages.${system};
            nurpkgs = import "${nur_src}/default.nix" { pkgs = pkgs; nurpkgs = pkgs; };
          in {
            packages = nurpkgs.repos.mic92; // FIXME: this needs more work and filtering
          }
        );
    }
    

    Which gives:

    $ nix --allow-import-from-derivation flake show .
    git+file:///
    └───packages
        ├───aarch64-darwin
        │   ├───bing-image-creator: package 'python3.10-bing-image-creator-0.4.4'
        │   ├───clearsans: package 'clearsans-1.00'
        │   ├───cntr: package 'cntr-1.5.1'
        │   ├───conky-symbols: package 'ConkySymbols'
        │   ├───eapol_test: package 'eapol_test-2.10'
        │   ├───edge-gpt: package 'python3.10-edge-gpt-0.13.1'
        │   ├───fira-code-pro-nerdfonts: package 'nerdfonts-3.0.1'
        │   ├───gatttool: package 'bluez-5.66'
        │   ├───gdb-dashboard: package 'gdb-dashboard-0.11.4'
    

    But needs some more work and might be reinventing the wheel. Haven’t used NUR myself and no idea what the state of flakes in NUR is.