this post was submitted on 19 Jun 2023
38 points (95.2% liked)

Linux

48344 readers
522 users here now

From Wikipedia, the free encyclopedia

Linux is a family of open source Unix-like operating systems based on the Linux kernel, an operating system kernel first released on September 17, 1991 by Linus Torvalds. Linux is typically packaged in a Linux distribution (or distro for short).

Distributions include the Linux kernel and supporting system software and libraries, many of which are provided by the GNU Project. Many Linux distributions use the word "Linux" in their name, but the Free Software Foundation uses the name GNU/Linux to emphasize the importance of GNU software, causing some controversy.

Rules

Related Communities

Community icon by Alpár-Etele Méder, licensed under CC BY 3.0

founded 5 years ago
MODERATORS
 

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 !

you are viewing a single comment's thread
view the rest of the comments
[–] [email protected] 0 points 1 year ago* (last edited 1 year ago) (3 children)

I'm really not sure of where this would be anymore usefull than a simple bash script to install all packages you need since it doesn't do configs and that rollbacks are supported by some filesystems already. Also Having version specific dependencies is already a thing for flatpacks and such

[–] [email protected] 4 points 1 year ago (1 children)

A simple bash script is not reproducible or deterministic. Also a filesystem rollback is not the same as NixOS's generation based rollback.

Also, NixOS doesn't just install packages, all system configuration is done declaratively, which would be a very bad idea to do via a bash script.

[–] [email protected] 0 points 1 year ago* (last edited 1 year ago) (1 children)

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

[–] [email protected] 1 points 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.

[–] [email protected] 1 points 1 year ago (1 children)

Part of the purpose of NixOS is providing a means to build a reproducible environment that's easy to configure, migrate, and rollout. You can absolutely handle configuration of many different programs using either flakes or the native modules provided by nix. You can customize your entire system from firewall entries, to users and their shells, to the kernel itself and the kernel modules you'd want it to load, all in a single file or multiple files. If you want to try doing all those things in bash scripts, good luck and please share your experiences but don't expect it to be as easy as the Nix ecosystem.

[–] [email protected] 0 points 1 year ago (1 children)

so it does handle more than just conditional packages like the other zealots make it sound like

[–] [email protected] 1 points 1 year ago

Wayyy more. You can move all of your dotfiles to Nix config. And deploy it with Nix based infrastructure.

[–] [email protected] 1 points 1 year ago

There is a world of difference between a bash script and something like NixOS. The most important difference is that with NixOS something that you don't specify won't be there. Whereas a bash script (or other config management tools like Puppet, Chef or Ansible) only mutate things listed.

So it is very easy to write a script like:

ensure_installed python3
write_file /etc/foo.cfg 'thing = 7'
chgrp users /mnt/backups

But if you remove ensure_installed python3 it will stay installed. You can try to be very careful and always add ensure_not_installed python3 but this is both error prone and dead code as soon as you run it. I used to have a script like this and I used each of configuration management tools mentioned above and always ran into these issues. The exact error flow would be something like this:

  1. Enable/setup some service A that pulls in package X.
  2. Disable service A or remove package X because it isn't needed anymore.
  3. Write configuration for service B.
  4. Forget to add ensure_installed X but it works anyways because X is still installed from step 1.

Now you have a non-reproducible config because if you try to re-install or setup service B on a new machine it won't work because X isn't present. This may sound like a niche problem but I ran into it almost every time I tried to bring up a new machine using my config.

It is still possible to do this in NixOS as it isn't completely reproducible (you can have mutable state) but in general it is much harder because any configuration that isn't specified doesn't exist. As soon as you remove package X or service Y from your config it is removed from your system. I've been using NixOS for 8 years now and this problem is mostly gone. It is definitely more reproducible than bash scripts and it has a tangible effect on my workflow.

I wrote a blog post about it a long time ago but the core is still relevant: https://kevincox.ca/2015/12/21/service-management-with-nixos/.