- Nix 100%
- flake.nix auf mkHost-Helper umgestellt: hosts/<name>/ (Hardware + Host-Settings) getrennt von modules/ (gemeinsame Config), pro Host optional eigene packages.nix - modules/nvidia.nix: parametrisiertes Nvidia-Optimus/Prime-Modul statt auskommentiertem Codeblock, aktiviert für hosts/gaming-laptop - Zsh (Autosuggestions, Syntax-Highlighting, host-aware Aliases via $(hostname)), zoxide, fzf, direnv, Kitty/Neovim-Feinschliff in home.nix - Minimal-Security-Härtung (sudo execWheelOnly, SSH KbdInteractive/X11 Forwarding aus) und zusätzliche CLI-Tools in modules/packages.nix - Neuer Host mf01: Nachbildung der CachyOS-Workstation (limine, fish, btrfs-Subvolumes/zram, Nvidia-eGPU, OpenRazer, Netbird, Snapper) mit gegen echtes NixOS (vs215) verifizierter Paketliste Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> |
||
|---|---|---|
| hosts | ||
| modules | ||
| flake.lock | ||
| flake.nix | ||
| home.nix | ||
| README.md | ||
NixOS Konfiguration
Deklarative NixOS-Systemkonfiguration mit Flakes und Home-Manager.
Zielumgebung: Proxmox VM (später erweiterbar auf Bare-Metal mit Nvidia Optimus).
Dateistruktur
/etc/nixos/
├── flake.nix # Einstiegspunkt – Inputs, mkHost-Helper, ein Eintrag pro Host
├── flake.lock # Lockfile – pinnt exakte Versionen (automatisch generiert)
├── home.nix # User-Konfiguration via Home-Manager (Shell, Git, Tools) – gemeinsam für alle Hosts
├── modules/
│ ├── common.nix # System: Boot, Netzwerk, Desktop, Dienste, User – für alle Hosts gleich
│ ├── packages.nix # Alle System-Pakete – getrennt für Übersichtlichkeit
│ └── nvidia.nix # Nvidia-Optimus-Modul (options.modules.nvidia.*), per Host an/aus
└── hosts/
├── nixos-vm/
│ ├── hardware-configuration.nix # Hardware-spezifisch (wird bei Installation generiert)
│ └── config.nix # Host-Settings: hostName, VM-Gast-Integration
├── gaming-laptop/
│ ├── hardware-configuration.nix # Platzhalter – vor Nutzung neu generieren
│ └── config.nix # Host-Settings: hostName, Nvidia aktiviert + Bus-IDs
└── mf01/
├── hardware-configuration.nix # Platzhalter (btrfs-Subvolumes, zram) – vor Nutzung neu generieren
├── config.nix # Host-Settings: limine, fish, eGPU, OpenRazer, Netbird, Snapper, ...
└── packages.nix # Host-eigene Paketliste (Nachbildung des CachyOS-Setups)
Jeder Host lebt in einem eigenen Ordner unter hosts/. Alles, was für alle Rechner gleich ist, steht in modules/. Ein neuer Rechner braucht nur einen neuen hosts/<name>/-Ordner plus eine Zeile in flake.nix (siehe Flake-Struktur).
Voraussetzungen
- Proxmox VE mit OVMF (UEFI) Support
- NixOS Minimal ISO (oder Netboot.xyz)
- Netzwerkzugang für Paket-Downloads
Installation (Proxmox VM)
1. VM in Proxmox erstellen
| Einstellung | Wert |
|---|---|
| OS Type | Linux 6.x |
| BIOS | OVMF (UEFI) |
| Disk | 40+ GB, VirtIO SCSI |
| RAM | 4+ GB |
| CPU | 2+ Kerne, Typ host |
| Display | VirtIO-GPU |
| Netzwerk | VirtIO, Bridge |
Nach der Installation eine EFI Disk hinzufügen (ohne Pre-Enroll Keys).
2. Ins Live-System booten
# Root-Shell starten
sudo -i
# Tastatur auf Deutsch setzen
loadkeys de
# Internetverbindung prüfen
ping -c 3 nixos.org
3. Disk partitionieren
# GPT-Partitionstabelle erstellen
parted /dev/vda -- mklabel gpt
# EFI-Partition (512 MB)
parted /dev/vda -- mkpart ESP fat32 1MiB 512MiB
parted /dev/vda -- set 1 esp on
# Root-Partition (Rest)
parted /dev/vda -- mkpart primary 512MiB 100%
4. Formatieren und mounten
# Formatieren
mkfs.fat -F32 /dev/vda1
mkfs.ext4 /dev/vda2
# Mounten
mount /dev/vda2 /mnt
mkdir -p /mnt/boot
mount /dev/vda1 /mnt/boot
5. Konfiguration erstellen
# Hardware-Konfiguration automatisch generieren
nixos-generate-config --root /mnt
# generierte hardware-configuration.nix an die richtige Stelle verschieben
mkdir -p /mnt/etc/nixos/hosts/nixos-vm
mv /mnt/etc/nixos/hardware-configuration.nix /mnt/etc/nixos/hosts/nixos-vm/
# Config-Dateien anlegen/bearbeiten
nano /mnt/etc/nixos/flake.nix
nano /mnt/etc/nixos/modules/common.nix
nano /mnt/etc/nixos/modules/packages.nix
nano /mnt/etc/nixos/hosts/nixos-vm/config.nix
nano /mnt/etc/nixos/home.nix
6. System installieren
nixos-install --flake /mnt/etc/nixos#nixos-vm
# Root-Passwort setzen wenn gefragt
# Neustarten
reboot
7. Nach dem ersten Boot
# Passwort ändern falls nötig
passwd
# System aktualisieren
sudo nix flake update --flake /etc/nixos
sudo nixos-rebuild switch --flake /etc/nixos
Täglicher Workflow
Config ändern und anwenden
# 1. Datei bearbeiten (z.B. Paket hinzufügen)
sudo nano /etc/nixos/modules/packages.nix
# 2. System neu bauen
rebuild
# 3. Änderungen committen und pushen
sudo git -C /etc/nixos add .
sudo git -C /etc/nixos commit -m "paket xyz hinzugefügt"
sudo git -C /etc/nixos push
Wichtige Befehle
| Befehl | Beschreibung |
|---|---|
rebuild |
System neu bauen und aktivieren (nutzt automatisch #$(hostname)) |
rebuild-test |
Testen ohne permanent zu setzen (wird beim Reboot verworfen) |
update |
Flake-Inputs (nixpkgs, home-manager) aktualisieren |
garbage |
Alte Generationen und ungenutzten Store aufräumen |
Die Aliases sind sowohl für Bash als auch für Zsh definiert (Standard-Login-Shell ist Zsh).
Pakete verwalten
# Paket suchen
nix search nixpkgs firefox
# Paket temporär nutzen (ohne Installation)
nix-shell -p python3
# Dev-Shell starten (aus flake.nix)
nix develop
Nützliche Konzepte
Generationen
NixOS speichert bei jedem rebuild eine neue Generation. Beim Booten kannst du jederzeit eine ältere Generation auswählen – perfektes Rollback.
# Alle Generationen anzeigen
sudo nix-env --list-generations --profile /nix/var/nix/profiles/system
# Alte Generationen aufräumen
sudo nix-collect-garbage -d
Flake-Struktur
Der #nixos-vm Teil im Rebuild-Befehl referenziert einen Host, den mkHost-Helper in flake.nix baut:
mkHost = hostName: nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
./hosts/${hostName}/hardware-configuration.nix
./hosts/${hostName}/config.nix
./modules/common.nix
./modules/packages.nix
./modules/nvidia.nix
# ... home-manager
];
};
nixosConfigurations = {
nixos-vm = mkHost "nixos-vm";
gaming-laptop = mkHost "gaming-laptop";
};
Ein neuer Rechner braucht nur:
- Neuen Ordner
hosts/<name>/mithardware-configuration.nix(pernixos-generate-config) undconfig.nix(mind.networking.hostName). - Einen weiteren Eintrag
<name> = mkHost "<name>";inflake.nix.
Danach baut --flake /etc/nixos#<name> das jeweilige System.
Bare-Metal mit Nvidia (gaming-laptop)
Der Host gaming-laptop ist für den Wechsel auf echte Hardware (Ryzen 5xxxH + RTX 3080 Laptop) bereits vorbereitet. Das Nvidia-Verhalten wird über ein eigenes Modul (modules/nvidia.nix) gesteuert, das pro Host per Option ein-/ausgeschaltet wird – kein Ein-/Auskommentieren von Codeblöcken mehr nötig:
# modules/nvidia.nix definiert:
options.modules.nvidia = {
enable = ...; # Nvidia Optimus/Prime an oder aus
amdgpuBusId = ...; # Bus-ID der internen/AMD-GPU
nvidiaBusId = ...; # Bus-ID der Nvidia-GPU
};
hosts/gaming-laptop/config.nix setzt bereits modules.nvidia.enable = true mit Platzhalter-Bus-IDs. Für den echten Umzug:
- Repo auf der Hardware klonen.
hosts/gaming-laptop/hardware-configuration.nixneu generieren:sudo nixos-generate-config sudo cp /etc/nixos/hardware-configuration.nix /pfad/zum/repo/hosts/gaming-laptop/hardware-configuration.nix- Bus-IDs ermitteln (dezimal, nicht Hex!) und in
hosts/gaming-laptop/config.nixeintragen:lspci | grep -E "VGA|3D" - Optional: Gaming-Pakete (Steam, MangoHud, Gamemode, etc.) in
hosts/gaming-laptop/config.nixergänzen. sudo nixos-rebuild switch --flake /etc/nixos#gaming-laptop.
Für weitere Nvidia-Hosts genügt ein neuer hosts/<name>/-Ordner mit eigenem modules.nvidia.enable/Bus-IDs – die Logik in modules/nvidia.nix wird automatisch mitgenutzt.
mf01 – Nachbildung der CachyOS-Workstation
Der Host mf01 (Minisforum U890 Pro) bildet die aktuelle CachyOS-Installation so nah wie möglich in NixOS nach – zunächst als Parallel-/Referenz-Config, mit der Option auf einen echten Umstieg später. Die Daten (Pakete, Dienste, Hardware) wurden direkt vom laufenden CachyOS-System erhoben, nicht geraten.
Besonderheiten gegenüber den anderen Hosts:
- Bootloader:
boot.loader.liminestattsystemd-boot(Parität zu CachyOS). - Login-Shell: fish statt zsh (
users.users.deko.shell = pkgs.fish;,home.nixenthält dafür einen eigenenprograms.fish-Block mit denselben Aliases wie bash/zsh). - Storage: btrfs mit CachyOS-typischem Subvolume-Schema (
@,@home,@srv,@log,@cache,@tmp) und zram-Swap statt Swap-Partition – siehehosts/mf01/hardware-configuration.nix(Platzhalter-UUIDs, vor echter Installation neu generieren). - Nvidia-eGPU (Oculink): Die eGPU ist nicht fest verbaut, daher wird
hardware.nvidia.open = truegesetzt, aber keinservices.xserver.videoDrivers = [ "nvidia" ]– amdgpu bleibt Primärtreiber. Muss mit tatsächlich angeschlossener eGPU verifiziert werden (siehe TODO-Kommentar inhosts/mf01/config.nix). - OpenRazer:
hardware.openrazer.enableersetzt die AUR-DKMS-Pakete;polychromaticals GUI.
Manueller Schritt: Citrix Workspace
pkgs.citrix_workspace ist unfree und erfordert ein manuell heruntergeladenes Tarball (Citrix-EULA-Gate, kein automatischer Download möglich):
- Auf citrix.com/downloads das Linux-Tarball passend zur nixpkgs-Version herunterladen.
- Per
nix-store --add-fixed sha256 <datei>bzw. dem in der nixpkgs-Doku zu Citrix beschriebenenrequireFile-Mechanismus einbinden. pkgs.citrix_workspaceinhosts/mf01/packages.nixeinkommentieren.
Bewusst ausgelassen (Stand jetzt)
- whisper-server, patchmon-agent: kein nixpkgs-Paket vorhanden, bräuchten eigenes Packaging/Custom-Service – auf Wunsch erstmal nicht mitgebaut, bei Bedarf einzeln nachrüsten.
- ufw: durch die native
networking.firewall(ausmodules/common.nix) ersetzt, um keine zwei Firewall-Systeme parallel zu betreiben. - limine-snapper-sync (Snapshot-Einträge im Bootmenü): kein NixOS-Äquivalent gefunden; NixOS-Generationen decken Rollback bereits über limine selbst ab.
- linux-arctis-manager (SteelSeries): ersetzt durch
headsetcontrolals Best-Effort-Alternative, keine 1:1-Funktionsgarantie. - Ein paar Pakete mit unklarem nixpkgs-Namen/Zweck sind in
hosts/mf01/packages.nixals# TODOmarkiert statt geraten.