Nix: Intro

Das Ökosystem & der Paketmanager

Jonas Katzke

1. Was ist Nix

  • Gestartet 2003 als wissenschaftliches Projekt
  • Nicht als einzelnes Tool zu verstehen
    • Stattdessen ein breites Ökosystem
  • Ziele:
    • Reproduzierbarkeit
    • Resilienz

Nix (-lang)

Eine Programmiersprache

  • Entworfen für Paketmanagement
  • Turing-vollständig

"JSON mit Haskell-Funktionen"

Nix

Ein Paketmanager für Linux und macOS

  • Deklarativ
  • Abstraktion des Paketmanagements
  • Systemagnostisch

Beispiel: Paketdeklaration

{ lib
, buildPythonPackage
, fetchPypi
, six
}:
buildPythonPackage rec {
  pname = "treelib";
  version = "1.6.4";
  format = "setuptools";
  src = fetchPypi {
    inherit pname version;
    sha256 = "sha256-Gi6Dj2uZ4mkLw9mS1aHwTNtK9lZL12iIg8I9FyV7uyo=";
  };
  propagatedBuildInputs = [ six ];
}

Nixpkgs

Eine Sammlung von Paketen für Nix

map_repo_size_fresh.svg?xlimit=40000&ylimit=20000

(Quelle: https://repology.org/repositories/graphs, Stand: 2023-09-28)

map_repo_size_fresh.svg

(Quelle: https://repology.org/repositories/graphs, Stand: 2023-09-28)

Kontext Anzahl
rPackages 25973
No package set 17231
python310Packages 6795
perl538Packages 1836
nodePackages 282

NixOS

Ein Linux Betriebssystem, basierend auf Nix.

  • Wie Nix, nur als Betriebssystem

Beispiel: Systemkonfiguration für Integrationstest

{ config, lib, pkgs, serviceBin, port ? 8080, ... }:

let
  username = "myUser";
in
{
  config = {
    networking.firewall.allowedTCPPorts = [ port ];
    users = {
      mutableUsers = false;
      users = {
        root.password = "";
        "${username}" = {
          isSystemUser = true;
          group = username;
        };
      };
    };
    systemd.services.web-service = {
      wantedBy = [ "multi-user.target" ];
      script = ''
        ${serviceBin} --port=${builtins.toString port}
      '';
      serviceConfig.User = username;
    };
  };
}

2. Was kann Nix

Für die Entwicklung

  • Isolierung von Paketen
  • Reproduzierbare Ergebnisse
  • Synchronisierte Umgebungen
  • Container & andere Paketformate
  • Metadaten!
  • Modifizierung von Paketen
  • Templates

Für das Operationelle

  • Caching & Backups
  • CI/CD
  • Cross-Compilation
  • NixOS

3. Nix Nachteile

  • Komplexität & Lernprozess
  • Dokumentation teils lückenhaft
  • Paketisolierung führt zu größeren Systemen
  • Sprachenspezifische Ökosysteme müssen adaptiert werden

4. Wie geht Nix

5. Zusammenfassung

Nix ist ein Paketmanager für Linux und macOS, mit

  • Fokus auf Reproduzierbarkeit & Isolation
  • Gute Integration in bestehende Infrastruktur (z.B. Docker)
  • "Applications as Code"