NetworkManager vs. systemd-networkd on RHEL (Artikel 076)
Analyse der Netzwerk-Stacks in RHEL. Warum NetworkManager der Standard ist und wann sich der Wechsel auf das minimalistische systemd-networkd lohnt.
# Networking on RHEL: Den richtigen Stack wählen
TL;DR / Management Summary In RHEL und Rocky Linux ist der NetworkManager (NM) der unangefochtene Standard. Er ist mächtig, unterstützt komplexe VPNs und WLANs und ist tief in die Enterprise-Management-Tools integriert. Dennoch gewinnt systemd-networkd an Bedeutung für minimalistische Cloud-Images und Container-Hosts. Empfehlung: Bleiben Sie bei NetworkManager für 95% Ihrer Server. Wechseln Sie nur zu systemd-networkd, wenn jede Millisekunde Boot-Zeit zählt und Sie absolute Einfachheit brauchen.
# 1. Einführung & Architektur
Zwei Welten, ein Ziel.
- NetworkManager: Ein dynamischer Dämon, der auf Events reagiert und Profile (
connections) verwaltet. Er nutzt traditionellifcfg-*Dateien oder das moderne Keyfile-Format. - systemd-networkd: Ein statischer, extrem schlanker Dienst, der INI-Dateien in
/etc/systemd/network/liest.
# Vergleich (Mermaid)
graph TD
A[Network Hardware] --> B[Linux Kernel]
B -->|Option 1| C[NetworkManager]
B -->|Option 2| D[systemd-networkd]
C -->|Tool| C1[nmcli / nmtui]
D -->|Tool| D1[networkctl]
C -->|Backend| E[WPA Supplicant / Libreswan]
D -->|Backend| F[Native systemd logic]
# 2. Der RHEL Standard: NetworkManager (Keyfiles)
Weg von ifcfg.
Früher nutzte RHEL /etc/sysconfig/network-scripts/ifcfg-eth0. Ab RHEL 9 sind diese veraltet (deprecated). Der neue Standard sind Keyfiles in /etc/NetworkManager/system-connections/.
# Beispiel: Statische IP via nmcli (generiert Keyfile)
sudo nmcli con add type ethernet con-name static-eth0 ifname eth0 ip4 192.168.1.10/24 gw4 192.168.1.1
# 3. Wechsel zu systemd-networkd
Wenn weniger mehr ist.
In sehr kleinen VMs oder spezialisierten Appliances kann man NetworkManager deaktivieren.
# Schritt 1: NetworkManager stoppen
sudo systemctl stop NetworkManager
sudo systemctl disable NetworkManager
sudo systemctl mask NetworkManager
# Schritt 2: systemd-networkd konfigurieren
Erstellen Sie /etc/systemd/network/20-eth0.network:
[Match]
Name=eth0
[Network]
Address=192.168.1.10/24
Gateway=192.168.1.1
DNS=1.1.1.1
# Schritt 3: Dienst starten
sudo systemctl enable --now systemd-networkd
sudo systemctl enable --now systemd-resolved
# 4. Day-2 Operations: Management
Status prüfen.
| Feature | NetworkManager | systemd-networkd |
|---|---|---|
| CLI Tool | nmcli |
networkctl |
| GUI Tool | nmtui |
Keine |
| Boot Speed | Mittel | Extrem schnell |
| Komplexität | Hoch | Niedrig |
# NetworkManager Status
nmcli connection show
nmcli device status
# systemd-networkd Status
networkctl list
networkctl status eth0
# 5. Troubleshooting & “War Stories”
Wenn die Verbindung nach dem Wechsel stirbt.
# Story 1: “Der DHCP-Zombie”
Symptom: Nach dem Wechsel zu systemd-networkd bekommt das Interface zwei IPs: Eine statische und eine via DHCP.
Ursache: Der NetworkManager wurde nur gestoppt, aber nicht deaktiviert oder es läuft noch ein alter dhclient.
Lösung: Deaktivieren Sie NM vollständig (mask) und beenden Sie alle dhclient Prozesse manuell.
# Story 2: “Proxmox Cloud-Init Konflikt”
Symptom: Eine RHEL-VM in Proxmox überschreibt nach jedem Reboot die Netzwerkeinstellungen.
Ursache: Proxmox sendet Cloud-Init Daten. Wenn Cloud-Init für NetworkManager konfiguriert ist, aber systemd-networkd läuft, entsteht Chaos.
Lösung: Konfigurieren Sie Cloud-Init explizit für den gewünschten Renderer in /etc/cloud/cloud.cfg.d/99-custom-networking.cfg:
system_info: { network: { renderers: ['networkd'] } }.
# 6. Fazit & Empfehlung
- RHEL/Rocky Server: Bleiben Sie bei NetworkManager. Die Integration in Tools wie Cockpit und Ansible ist zu gut, um darauf zu verzichten.
- Minimalist / Edge: Nutzen Sie systemd-networkd, wenn Sie Speicherplatz sparen und den Bootvorgang beschleunigen müssen.
- Wichtig: Mischen Sie niemals beide Systeme auf einem Host!
# Anhang: Cheatsheet
| Aufgabe | NetworkManager | systemd-networkd |
|---|---|---|
| Interface Up | nmcli dev connect <if> |
ip link set <if> up |
| Route prüfen | `nmcli dev show | grep ROUTE` |
| DNS prüfen | `nmcli dev show | grep DNS` |
| Config Reload | nmcli con reload |
networkctl reload |