Hi everyone!

I saw that NixOS is getting popularity recently. I really have no idea why and how this OS works. Can you guys help me understanding all of this ?

Thanks !

  • 20gramsWrench@lemmy.dbzer0.com
    link
    fedilink
    arrow-up
    0
    arrow-down
    1
    ·
    edit-2
    1 year ago

    I have to check a little harder on what it does since I saw in a vid that you still needed to add your own if statement to get it working I assumed a simple

    pacman -Qk xorg-xrtrop 2> /dev/null && sudo pacman --noconfirm -S package1 package2 package3 || echo 'I aint got no x, idiot'

    would do the job as well

    • priapus@lemmy.one
      link
      fedilink
      arrow-up
      1
      ·
      1 year ago

      I’m not familiar enough with Pacman to know what that command does. It’s definitely not as clean or easily manageable for servers as NixOS is. Especially not when you have multiple systems of which you would like some packages to be shared and others not. It also still doesn’t allow you to manage global system configurations.

      • 20gramsWrench@lemmy.dbzer0.com
        link
        fedilink
        arrow-up
        1
        ·
        edit-2
        1 year ago

        this one just checks if xorg is installed and installs a few packages if it is, or call the user an idiot if it isn’t Nix seems to be really good if you need more than a personal os

    • Atemu@lemmy.ml
      link
      fedilink
      arrow-up
      1
      ·
      1 year ago

      I’d recommend reading some more; especially w.r.t. imperative vs. declarative.

      In NixOS, you’d do something like this:

      { config, ... }:
      
      {
        environment.systemPackages = if config.services.xserver.enabled then [
          package1
          package2
          package3
        ] else [
          # You could optionally make headless packages available here
        ];
      }
      

      You don’t need to understand the exact semantics here but you can look at it like JSON but with functions. This is not a “program”, the end-result is just data. You’re not modifying some stateful system state with new state from an uncontrolled source (i.e. the Arch repos) but rather just “outputting” a different dataset.
      NixOS then builds a concrete system out of this pure data specification. In this concrete system, those packages’ executables are available in the “global” PATH.

      You say “I want a system where x y z are installed” and it does it for you in a standardised manner. With the bash script, you explicitly tell it each step (“install x; install y; install z”). This pure data nature is what’s meant by declarative.
      This distinction rules out whole classes of issues you simply cannot run into with NixOS.

      Another aspect is that, as long as you use the same revision of Nixpkgs and the same config file, you can re-create the exact same system (almost bit-for-bit). If you were to run your bash script in a year’s time however, you’d get an entirely different system with totally different revisions of software and therefore possibly entirely different behaviour.
      This is what’s meant by reproducibility.

      You can achieve some of the same things NixOS does using imperative tools but nowhere near the same quality.