Was Linux angeht, habe ich nun viele Jahre Erfahrung mit Arch Linux und noch viele Jahre mehr mit Debian. Um etwas Neues auszuprobieren, habe ich eine NixOS-Installation in einer VM gestartet. Diese Distribution ist sehr anders als die anderen, die ich bisher gesehen habe, aber auch äußerst interessant.
NixOS bietet eine Abstraktionsschicht, in der man alle Konfigurationen in einer zentralen Konfigurationsdatei vornehmen kann. Das beginnt bei der Systemsprache, der Definition der Benutzer mit Gruppenzuordnung und Standard-Shell, dem Bootloader und dem Display-Manager, sogar die Desktop-Umgebung, und reicht bis zur Installation und Konfiguration der verschiedenen Dienste und Programme. Ich habe sogar einen WireGuard-VPN-Zugang direkt in der Konfiguration eingetragen.
Man bearbeitet diese Konfigurationsdatei und lässt danach das gesamte System neu „bauen“ mit einem einfachen Aufruf von nixos-rebuild switch
. Wenn man ein neues System aufsetzt, kann man einfach diese Datei kopieren und hat alle Pakete und Einstellungen identisch mit dem vorherigen System. Das kann besonders sinnvoll sein, wenn man beispielsweise automatisiert Cloud-Server ausrollen möchte.
Nach einigem Ausprobieren und Lesen der Dokumentation habe ich für mich einen Weg gefunden, wie ich die Konfiguration sinnvoll aufteile. Ich habe eine flake.nix-Datei, die dann die configuration.nix und die home.nix aufruft.
Über die flake.nix installiere ich Pakete, die nicht im Store sind, etwa den Home Manager oder den Zen Browser, den ich derzeit bevorzugt nutze. An dieser Stelle muss man ein wenig aufpassen. Man lädt Pakete von GitHub ins System. Da sollte man vorher genau überprüfen, ob diese keine Sicherheitsprobleme mit sich bringen.
Die home.nix kümmert sich um die Einstellungen des Home Managers, insbesondere um Programme, die nicht systemweit installiert sein müssen.
Zu diesen drei Dateien gibt es noch eine hardware-configuration.nix, die während der Installation erzeugt wird und Informationen zu den genutzten Geräten, der Aufteilung der Festplatte, den Kernel-Parametern und der verwendeten Systemart (zum Beispiel x86_64-linux) enthält.
Ich habe mein System auf NixOS unstable umgestellt, da ich für Desktop-Systeme ein Rolling Release bevorzuge.
Der nächste Plan ist, meinen Desktop-Gaming-Rechner neu mit NixOS aufzusetzen, anschließend mit Wayland und Hyprland. Zudem plane ich Gaming über Steam. Eventuell gibt es dazu einen neuen Beitrag, wenn alles läuft und ich interessante neue Erkenntnisse mitbringen kann.
Hier sind meine Konfigurationsdateien; vielleicht helfen sie ja jemandem bei der Installation:
configuration.nix
{ config, pkgs, ... }:
{
imports = [
./hardware-configuration.nix
];
# Bootloader.
boot.loader.grub.enable = true;
boot.loader.grub.device = "/dev/vda";
boot.loader.grub.useOSProber = true;
networking.hostName = "nixos"; # Define your hostname.
# Enable networking
networking.networkmanager.enable = true;
# Set your time zone.
time.timeZone = "Europe/Berlin";
# Select internationalisation properties.
i18n.defaultLocale = "de_DE.UTF-8";
i18n.extraLocaleSettings = {
LC_ADDRESS = "de_DE.UTF-8";
LC_IDENTIFICATION = "de_DE.UTF-8";
LC_MEASUREMENT = "de_DE.UTF-8";
LC_MONETARY = "de_DE.UTF-8";
LC_NAME = "de_DE.UTF-8";
LC_NUMERIC = "de_DE.UTF-8";
LC_PAPER = "de_DE.UTF-8";
LC_TELEPHONE = "de_DE.UTF-8";
LC_TIME = "de_DE.UTF-8";
};
# Enable the X11 windowing system.
services.xserver.enable = true;
# Enable the XFCE Desktop Environment.
services.xserver.displayManager.lightdm.enable = true;
services.xserver.desktopManager.xfce.enable = true;
services.displayManager.autoLogin.enable = true;
services.displayManager.autoLogin.user = "robert";
# Configure keymap in X11
services.xserver.xkb = {
layout = "de";
variant = "";
};
console.keyMap = "de";
services.printing.enable = true;
hardware.pulseaudio.enable = false;
security.rtkit.enable = true;
services.pipewire = {
enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
};
users.users.robert = {
isNormalUser = true;
description = "Robert";
extraGroups = [ "networkmanager" "wheel" ];
shell = pkgs.zsh;
packages = with pkgs; [
# thunderbird
];
};
users.extraUsers.root = {
shell = pkgs.zsh;
};
programs.firefox.enable = true;
nixpkgs.config.allowUnfree = true;
environment.systemPackages = with pkgs; [
git
gcc
thefuck
ghostty.terminfo
go
neovim
zellij
ncdu
rustdesk-flutter
ghostty
];
services.openssh = {
enable = true;
ports = [ 22 ];
settings = {
PasswordAuthentication = true;
AllowUsers = null;
UseDns = true;
X11Forwarding = false;
PermitRootLogin = "yes";
};
};
services.sunshine = {
enable = true;
autoStart = true;
openFirewall = true;
};
programs.neovim = {
defaultEditor = true;
viAlias = true;
enable = true;
vimAlias = true;
};
programs.zsh = {
enable = true;
shellAliases = {
ll = "ls -l";
update = "sudo nixos-rebuild switch";
editconf = "sudo vim /etc/nixos/configuration.nix";
};
#history.size = 10000;
oh-my-zsh = {
enable = true;
plugins = [ "git" "thefuck" ];
theme = "robbyrussell";
};
};
networking.wireguard.enable = true;
networking.wireguard.interfaces = {
wg0 = {
ips = [ "10.0.0.8/24" ];
listenPort = 51820;
privateKey = "XYZ123PRabcdefghijkläöüVBWOyMGucEjjasdfu";
peers = [
{
publicKey = "XYZ123PRabcdefghijkläöüVBWOyMGucEjjasdfu";
allowedIPs = [ "10.0.0.0/24" ];
endpoint = "my.server.com:51820";
persistentKeepalive = 25;
}
];
};
};
# This value determines the NixOS release from which the default
# settings for stateful data, like file locations and database versions
# on your system were taken. It‘s perfectly fine and recommended to leave
# this value at the release version of the first install of this system.
# Before changing this value read the documentation for this option
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
system.stateVersion = "24.11"; # Did you read the comment?
}
flake.nix:
{
description = "NixOS configuration";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
home-manager = {
url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
zen-browser = {
url = "github:0xc000022070/zen-browser-flake";
inputs.nixpkgs.follows = "nixpkgs"; # Closing brace added here
};
};
outputs = inputs@{ nixpkgs, home-manager, zen-browser, ... }: {
nixosConfigurations = {
"nixos" = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
./configuration.nix
home-manager.nixosModules.home-manager {
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.users.robert = import ./home.nix;
home-manager.extraSpecialArgs = { inherit inputs; system = "x86_64-linux";};
}
];
};
};
};
}
home.nix:
{ config, pkgs, system, inputs, ... }:
{
home.username = "robert";
home.homeDirectory = "/home/robert";
home.stateVersion = "24.11";
home.packages = with pkgs; [
inputs.zen-browser.packages."${system}".default
nextcloud-client
keepassxc
];
programs.home-manager.enable = true;
}