====== YTVI - Neue CAN Konfiguration ======
Raspberry Pi OS Bookworm: Netzwerk-Änderungen erklärt – Von ifupdown zu systemd-networkd (inkl. CAN-Setup)
Dieses Dokument ist ein Skript für ein YouTube-Video, das die Netzwerk-Änderungen in Raspberry Pi OS Bookworm (basierend auf Debian 12) erklärt. Es behandelt die Umstellung von **ifupdown** zu **systemd-networkd**, insbesondere für CAN-Interfaces, und zeigt, wie man Netzwerk-Manager analysiert, Konfigurationen erstellt, Probleme debuggt und Konflikte löst. Zielgruppe: Raspberry Pi-Nutzer, IoT-Entwickler und Linux-Anfänger. **Video-Länge**: ca. 20-30 Minuten. **Hinweis**: Links sind in der Beschreibung, Befehle sind live demonstriert.
===== YouTube Video #141 =====
{{youtube>XXX?half}}
\\
===== Warum anders ab Bookworm =====
Seit Bookworm ist **ifupdown** nicht mehr standardmäßig installiert und wurde durch **systemd-networkd** ersetzt. Dies betrifft besonders CAN-Interfaces (Controller Area Network), die im 3D-Druck aber auch IoT, Robotik oder Automobil-Projekten genutzt werden. Warum der Wechsel? //systemd-networkd// ist modern, in systemd integriert, ermöglicht parallele Verarbeitung für schnellere Boot-Zeiten und reduziert Abhängigkeiten von alten Skripten.
**Vorteile**: Höhere Stabilität in serverartigen oder embedded Setups, bessere Fehlerbehandlung, Skalierbarkeit für komplexe Netzwerke wie Bridges oder VLANs.
**Nachteile**: Lernkurve für Legacy-Nutzer und mögliche Konflikte mit **NetworkManager**, das auf Raspberry Pi für WLAN/Ethernet läuft. In diesem Video lernst du die Tools, Konfigurationen, Debugging und Problemlösungen – mit praktischen Demos für CAN. Basierend auf offiziellen Docs und Community-Erfahrungen [[https://forums.raspberrypi.com/viewtopic.php?t=378067|Raspberry Pi Forum]] [[https://wiki.debian.org/SystemdNetworkd|Debian Wiki]].
===== Was ist das ... ? =====
* **ifupdown**: Ein klassisches, script-basiertes Tool aus den 1990er Jahren, das über Textdateien wie ''/etc/network/interfaces'' arbeitet. Es ist einfach für statische Konfigurationen (z. B. feste IPs, CAN-Queues), aber imperativ (Schritt-für-Schritt) und veraltet. In Bookworm nicht mehr Standard, muss manuell installiert werden (''apt install ifupdown''). Geeignet für Legacy, aber fehlt an Integration in systemd, was zu langsameren Boots und Fehlern führen kann [[https://wiki.debian.org/NetworkConfiguration#The_.2BAC8-ifupdown_way|Debian Network Config]] [[https://manpages.debian.org/bookworm/ifupdown/interfaces.5.en.html|ifupdown Docs]].
* **NetworkManager (NM)**: Ein dynamisches Tool für Desktops/Laptops, ideal für WiFi, VPNs, Hotplugging. Verwendet Verbindungen (via ''nmcli'' oder GUI wie ''nm-applet''). Auf Raspberry Pi Bookworm Standard für WLAN/Ethernet, besonders mit GUI. Stark für dynamische Setups, aber ressourcenintensiv und kann mit systemd-networkd kollidieren [[https://networkmanager.dev/docs/|NetworkManager Docs]] [[https://wiki.debian.org/NetworkManager|Debian NM Wiki]].
* **systemd-networkd**: Moderner, deklarativer Manager, integriert in systemd. Konfiguriert über ''.network''- und ''.link''-Dateien in ''/etc/systemd/network/''. Leichtgewichtig, schnell, stabil für Server/IoT, Default in Bookworm für headless Setups. Ideal für CAN (Bitrate, Restarts direkt setzbar), aber ohne GUI [[https://wiki.debian.org/SystemdNetworkd|Debian systemd-networkd]] [[https://www.freedesktop.org/software/systemd/man/systemd.network.html|systemd Docs]].
**Vergleichstabelle**:
^ Tool ^ Geschichte & Typ ^ Stärken ^ Schwächen ^ Raspberry Pi-Nutzung ^
| ifupdown | 1990er, script-basiert | Einfach, statisch, niedrige Ressourcen | Veraltet, keine Parallelarbeit, imperativ | Optional für Legacy, manuell installieren |
| NetworkManager | Modern, dynamisch | GUI/TUI, Hotplugging, WiFi/VPN | Ressourcenintensiv, Konflikte möglich | Standard für Desktop/WLAN/Ethernet |
| systemd-networkd | Systemd-integriert, deklarativ | Schnell, stabil, skalierbar | Keine GUI, Lernkurve | Default für headless/CAN/IoT |
**Begründung für Wechsel**: Debian und Raspberry Pi wollen Konsistenz, Sicherheit und moderne Standards. //systemd-networkd// vermeidet Schwächen von //ifupdown// und passt zu IoT/Cloud-Trends [[https://www.debian.org/releases/bookworm/amd64/release-notes/ch-information.en.html|Debian Release Notes]] [[https://www.freedesktop.org/software/systemd/man/systemd-networkd.service.html|systemd-networkd Docs]].
===== Was wird verwendet? =====
Um zu verstehen, was auf einem Raspberry Pi / SBC läuft, prüfe zuerst die installierten Pakete und Dienste – Bookworm mischt oft **NetworkManager** (GUI, WLAN/Ethernet) und **systemd-networkd** (headless, CAN). Schritte:
* **Pakete prüfen**: ''dpkg -l | grep ifupdown'' (zeigt, ob installiert; meist nicht in Bookworm).
* **Dienste prüfen**: ''systemctl status systemd-networkd'' (sollte "active" sein), ''systemctl status NetworkManager'' (aktiv für WLAN/Ethernet).
* **Interfaces analysieren**: ''networkctl list'' zeigt //systemd-networkd//-verwaltete Interfaces (z. B. //configured// für can0, //unmanaged// für andere). ''nmcli device'' zeigt //NetworkManager//-verwaltete (z. B. //connected// für wlan0). ''ip link show'' gibt Low-Level-Details (UP/DOWN, Queues). Konflikte (z. B. ein Interface in beiden) via Logs prüfen (siehe Kapitel 5) [[https://raspberrypi.stackexchange.com/questions/108592/use-systemd-networkd-for-general-networking|RPi Stack Exchange]] [[https://wiki.debian.org/SystemdNetworkd|Debian Wiki]].
networkctl list
IDX LINK TYPE OPERATIONAL SETUP
1 lo loopback carrier unmanaged
2 eth0 ether no-carrier configuring
3 can0 can carrier configured
4 wlan0 wlan routable unmanaged
4 links listed.
nmcli device
DEVICE TYPE STATE CONNECTION
wlan0 wifi connected FlyOS wireless
lo loopback connected (externally) lo
p2p-dev-wlan0 wifi-p2p disconnected --
eth0 ethernet unavailable --
can0 can unmanaged --
===== CAN-Konfig =====
CAN-Interfaces (z. B. can0 für MCP2515-Chips, oder USB Koppler) sind von der Bookworm-Änderung betroffen, da sie früher über **ifupdown** liefen. Hier die Schritte für beide Methoden.
==== systemd-Methode (neu) ====
Die empfohlene Methode in Bookworm – deklarativ, stabil, systemd-integriert. Schritte:
1. **Hardware aktivieren**: Editiere ''/boot/config.txt'' (z. B. für MCP2515):
''code
dtoverlay=mcp2515-can0,oscillator=8000000,interrupt=25
''
Passe Frequenz/Interrupt an deine Hardware an.
2. **Konfigurationsdateien erstellen**:
- ''/etc/systemd/network/25-can.network'' (Bitrate, Restart):
''code
[Match]
Name=can*
[CAN]
BitRate=1M
RestartSec=0.1s
[Link]
RequiredForOnline=no
''
- ''/etc/systemd/network/99-can-link.link'' (Queue für hohe Last):
''code
[Match]
OriginalName=can*
[Link]
TransmitQueueLength=1024
''
3. **Aktivieren**:
''code
sudo systemctl enable --now systemd-networkd
sudo udevadm control --reload-rules && sudo udevadm trigger
''
Reboot erforderlich.
4. **Prüfen**:
''code
ip link show can0 # Zeigt qlen 1024
networkctl status can0 # Zeigt Bitrate 1M
''
[[https://forums.raspberrypi.com/viewtopic.php?t=386658|RPi CAN Setup]] [[https://www.freedesktop.org/software/systemd/man/systemd.network.html|systemd.network Docs]].
==== ifupdown (legacy / alt) ====
Für Rückwärtskompatibilität. Schritte:
1. **Installieren**:
''code
sudo apt install ifupdown
''
2. **Konfigurieren**: Erstelle ''/etc/network/interfaces.d/can0'':
''code
auto can0
iface can0 inet manual
pre-up /sbin/ip link set can0 type can bitrate 1000000
up /sbin/ifconfig can0 up
post-up /sbin/ip link set can0 txqueuelen 1024
down /sbin/ifconfig can0 down
''
3. **Aktivieren**:
''code
sudo ifup can0
''
4. **Prüfen**:
''code
ifconfig can0
ip link show can0
''
**Nachteil**: Weniger integriert, potenziell langsamere Boots [[https://canbus.esoterical.online/Getting_Started.html|CANbus Guide]].
==== Migrationstipps ====
TBD
Bei Upgrades von Bullseye: Entferne alte ''/etc/network/interfaces''-Dateien, migriere zu ''.network''-Format. Teste in einer VM, um Netzwerkbrüche zu vermeiden [[https://medium.com/@life-is-short-so-enjoy-it/story-one-issue-in-raspberry-pi-os-brought-me-to-know-about-lennart-poettering-and-systemd-e5d8aad8c3f7|Medium Migration Story]].
===== nützliche Tools =====
Hier sind die wichtigsten Tools für Diagnose und Management, mit Beispielen und Anwendungsfällen:
* **Für systemd-networkd**:
- ''networkctl list'': Übersicht aller Interfaces (z. B. can0 configured).
- ''networkctl status '': Details zu Bitrate/Status (z. B. can0 Bitrate).
- ''systemd-analyze'': Boot-Zeiten-Analyse für Netzwerk-Verzögerungen.
* **Für NetworkManager**:
- ''nmcli device'': Geräte-Status (z. B. wlan0 connected).
- ''nmcli connection show'': Verbindungs-Details (IPs, DNS).
- ''nmtui'': Text-UI für headless Setups.
- ''nm-connection-editor'': GUI für Desktop.
* **Allgemein**:
- ''ip link show '': Low-Level-Status, Queues.
- ''ip addr show '': IPs und Adressen.
- ''ls /etc/systemd/network/'': Configs anzeigen [[https://www.freedesktop.org/software/systemd/man/networkctl.html|networkctl Docs]] [[https://networkmanager.dev/docs/|NM Docs]] [[https://wiki.archlinux.org/title/Systemd-networkd|Arch Wiki]].
**Demo**: Führe ''nmcli connection add'' und ''networkctl status can0'' live aus.
===== journalctl / dmesg =====
Debugging ist essenziell für Netzwerkprobleme. Hier die wichtigsten Log-Tools:
* **journalctl**: Systemd-Logs. Nutze:
- ''journalctl -u systemd-networkd'': Logs für //systemd-networkd// (suche "Link UP", Errors wie "Failed to bring up").
- ''journalctl -u NetworkManager'': Logs für NM.
- **Achten auf**: Timestamps (''-S "5 minutes ago"''), Prioritäten (''-p err'' für Errors), Units (''-u''). Live-Monitoring mit ''--follow''.
* **dmesg**: Kernel-Logs. Nutze:
- ''dmesg | grep can'': CAN-Treiber-Init (z. B. "MCP2515 initialized" oder "No carrier").
- **Achten auf**: Zeitstempel (seit Boot), Level (''-l err'' für Errors).
* **Andere Stellen**:
- ''/var/log/syslog'': Allgemeine Logs.
- ''/var/log/kern.log'': Kernel-Logs.
- ''systemctl status '': Kurze Übersicht.
- ''journalctl -b'': Logs seit letztem Boot [[https://www.freedesktop.org/software/systemd/man/journalctl.html|journalctl Docs]] [[https://manpages.debian.org/bookworm/systemd/dmesg.1.en.html|dmesg Docs]] [[https://wiki.debian.org/Systemd#Journal|Debian Journal]].
**Demo**: Simuliere einen Error (z. B. falsche Bitrate), zeige Logs:
''code
journalctl -u systemd-networkd -p err
dmesg | grep can
''
**Tipp**: ''journalctl --vacuum-time=2weeks'' zum Log-Aufräumen.
===== Parallelbetrieb NM & systemd-networkd =====
In Bookworm laufen **NetworkManager** (WLAN/Ethernet) und **systemd-networkd** (headless/CAN) oft parallel, was Konflikte verursachen kann. Häufige Probleme:
* **Konflikte bei Interfaces**: Z. B. eth0 als //configuring// in ''networkctl'', aber //unavailable// in ''nmcli'' – beide Manager greifen zu.
* **Symptome**: Doppelte IPs, Boot-Verzögerungen (z. B. ''systemd-networkd-wait-online'' fail), Interfaces nicht erreichbar.
* **Ursachen**: Überlappende Konfigurationen (z. B. ''.network''-Datei für eth0 in ''/etc/systemd/network/''). Community-Berichte über Netzwerkbrüche bei Upgrades [[https://medium.com/@life-is-short-so-enjoy-it/story-one-issue-in-raspberry-pi-os-brought-me-to-know-about-lennart-poettering-and-systemd-e5d8aad8c3f7|Medium Story]] [[https://forums.raspberrypi.com/viewtopic.php?t=376705|RPi Forum Konflikte]].
**Lösungen**:
* **Trenne Interfaces**: In ''/etc/NetworkManager/NetworkManager.conf'':
''code
[keyfile]
unmanaged-devices=interface-name:can*
''
Danach: ''sudo systemctl restart NetworkManager''.
* **Deaktiviere einen Manager**: Z. B. ''sudo systemctl disable NetworkManager''.
* **Prüfe Konfig-Dateien**: Entferne eth0 aus ''/etc/systemd/network/'':
''code
sudo rm /etc/systemd/network/.network
sudo systemctl restart systemd-networkd
''
**Demo**: Zeige Konflikt aus Rechner-Daten, dann Fix:
''code
nmcli connection add type ethernet ifname eth0 con-name "Wired connection 1"
''
===== CAN mit NM? =====
Kurz: Möglich, aber **nicht empfohlen**. **NetworkManager** ist für IP-basierte Netzwerke (WiFi, Ethernet, VPN) optimiert und unterstützt CAN nicht nativ (keine Bitrate/Queue-Optionen). Workaround: Custom-Skripte in ''/etc/NetworkManager/dispatcher.d/'' (z. B. für ''ip link set can0 type can bitrate 1M''), aber das ist kompliziert und unstabil. Community empfiehlt **systemd-networkd** für CAN, da es low-level-Protokolle besser handhabt. NM sollte CAN als //unmanaged// markieren [[https://unix.stackexchange.com/questions/629484/how-to-set-txqueuelen-permanently-on-linux|Stack Exchange]] [[https://networkmanager.dev/docs/api/latest/NetworkManager.conf.html|NM Config Docs]].
**Demo**: Zeige Fehlversuch mit ''nmcli'' (kein CAN-Support), dann Workaround:
''code
sudo ip link set can0 up type can bitrate 1000000
''
**Tipp**: Bleib bei //systemd-networkd// für CAN-Stabilität.
===== Befehlsreferenz =====
Hier eine Zusammenfassung aller nützlichen Befehle aus dem Video als Quick-Reference:
^ Kategorie ^ Befehl ^ Beschreibung & Beispiel ^
| **Installation/Status** | ''dpkg -l | grep ifupdown'' | Prüft, ob ifupdown installiert ist. |
| | ''systemctl status systemd-networkd'' | Zeigt Status von systemd-networkd (active/inactive). |
| | ''systemctl status NetworkManager'' | Zeigt Status von NM. |
| **Interface-Übersicht** | ''networkctl list'' | Listet systemd-verwaltete Interfaces (z. B. can0 configured). |
| | ''nmcli device'' | Listet NM-verwaltete Interfaces (z. B. wlan0 connected). |
| | ''ip link show '' | Low-Level-Details (z. B. ''ip link show can0'' für Queue/Status). |
| | ''ip addr show '' | IPs und Adressen (z. B. für eth0). |
| **Konfiguration** | ''sudo systemctl enable %%--%%now systemd-networkd'' | Aktiviert systemd-networkd. |
| | ''sudo ifup '' | Aktiviert Interface mit ifupdown (z. B. can0). |
| | ''nmcli connection add type ethernet ifname eth0 con-name "Wired"'' | Fügt NM-Verbindung hinzu. |
| | ''sudo udevadm control %%--%%reload-rules && sudo udevadm trigger'' | Lädt Udev-Regeln neu (für .link-Dateien). |
| **Debugging** | ''journalctl -u systemd-networkd'' | Logs für systemd-networkd (filtere mit -p err). |
| | ''journalctl -u NetworkManager'' | Logs für NM. |
| | ''dmesg | grep can'' | Kernel-Logs für CAN (z. B. Treiber-Init). |
| | ''systemd-analyze blame'' | Boot-Zeiten-Analyse (zeigt Netzwerk-Verzögerungen). |
| **Manuell Aktivieren** | ''sudo ip link set can0 up type can bitrate 1M'' | Manuelles CAN-Setup (Fallback). |
===== Python Testscript =====
DiesesPython Script zeigt, welches Interface von welchem Manager gemanaged wird.
Beispielausgabe \\
fly@fly-minipad:~$ python3 can.py
System Information:
OS : Armbian 25.8.1 bookworm
Kernel : 5.10.85-v3.0-fly-sunxi
Interfaces and Managers:
+---------------+----------------------+--------------------------------+
| Interface | Manager | Configuration Source |
+---------------+----------------------+--------------------------------+
| can | ifupdown | /etc/network/interfaces.d/can1 |
| can0 | ifupdown | /etc/network/interfaces.d/can0 |
| can1 | ifupdown | /etc/network/interfaces.d/can1 |
| eth0 | Unmanaged or Unknown | None |
| eth1 | NetworkManager | Connection: Wired |
| inet | ifupdown | /etc/network/interfaces |
| lo | NetworkManager | Connection: (externally) |
| p2p-dev-wlan0 | Unmanaged or Unknown | None |
| wlan0 | NetworkManager | Connection: NoMamsLand |
+---------------+----------------------+--------------------------------+
#!/usr/bin/env python3
import subprocess
import re
import os
import glob
from platform import release, system, uname
def run_command(cmd):
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
return result.stdout.splitlines()
def parse_networkctl():
networkctl = run_command("networkctl list")
interfaces = {}
for line in networkctl[1:]: # Skip header
parts = re.split(r'\s+', line.strip())
if len(parts) >= 5:
iface, setup = parts[1], parts[-1]
interfaces[iface] = {"setup": setup, "config": None}
for f in glob.glob("/etc/systemd/network/*.network"):
with open(f, "r") as file:
if f"Name={iface}" in file.read() or "Name=*" in file.read():
interfaces[iface]["config"] = f
return interfaces
def parse_nmcli():
nmcli = run_command("nmcli device")
interfaces = {}
for line in nmcli[1:]: # Skip header
parts = re.split(r'\s+', line.strip())
if len(parts) >= 4:
iface, state, conn = parts[0], parts[2], parts[3]
interfaces[iface] = {"state": state, "config": f"Connection: {conn}" if conn != "--" else None}
return interfaces
def check_ifupdown():
interfaces = {}
if os.path.exists("/etc/network/interfaces"):
with open("/etc/network/interfaces", "r") as f:
for line in f:
if line.strip().startswith(("iface ", "allow-hotplug ")):
parts = line.split()
if len(parts) > 1:
iface = parts[1] if parts[0] == "allow-hotplug" else parts[2]
interfaces[iface] = {"manager": "ifupdown", "config": "/etc/network/interfaces"}
for file in glob.glob("/etc/network/interfaces.d/*"):
with open(file, "r") as f:
for line in f:
if line.strip().startswith(("iface ", "allow-hotplug ")):
parts = line.split()
if len(parts) > 1:
iface = parts[1] if parts[0] == "allow-hotplug" else parts[2]
interfaces[iface] = {"manager": "ifupdown", "config": file}
return interfaces
def print_system_info():
os_info = "Raspberry Pi OS" if os.path.exists("/etc/rpi-issue") else "Unknown OS"
with open("/etc/os-release", "r") as f:
for line in f:
if line.startswith("PRETTY_NAME="):
os_info = line.split("=")[1].strip().strip('"')
break
kernel = release()
print(f"System Information:")
print(f"{'OS':<20}: {os_info}")
print(f"{'Kernel':<20}: {kernel}")
print()
def print_table(data):
headers = ["Interface", "Manager", "Configuration Source"]
max_len = [len(h) for h in headers]
rows = []
for iface, info in data.items():
manager = info.get("manager", "Unmanaged or Unknown")
config = info.get("config", "None")
rows.append([iface, manager, config])
max_len = [max(max_len[i], len(str(col))) for i, col in enumerate([iface, manager, config])]
print("+" + "+".join("-" * (l + 2) for l in max_len) + "+")
print("|" + "|".join(f" {h:<{max_len[i]}} " for i, h in enumerate(headers)) + "|")
print("+" + "+".join("-" * (l + 2) for l in max_len) + "+")
for row in sorted(rows, key=lambda x: x[0]):
print("|" + "|".join(f" {col:<{max_len[i]}} " for i, col in enumerate(row)) + "|")
print("+" + "+".join("-" * (l + 2) for l in max_len) + "+")
def main():
print_system_info()
print("Interfaces and Managers:")
networkctl_ifaces = parse_networkctl()
nmcli_ifaces = parse_nmcli()
ifupdown_ifaces = check_ifupdown()
all_ifaces = set(networkctl_ifaces.keys()) | set(nmcli_ifaces.keys()) | set(ifupdown_ifaces.keys())
result = {}
for iface in all_ifaces:
if iface in ifupdown_ifaces:
result[iface] = {"manager": "ifupdown", "config": ifupdown_ifaces[iface]["config"]}
elif networkctl_ifaces.get(iface, {}).get("setup", "") in ["configured", "configuring"]:
result[iface] = {"manager": "systemd-networkd", "config": networkctl_ifaces[iface]["config"]}
elif nmcli_ifaces.get(iface, {}).get("state", "") in ["connected", "connecting"]:
result[iface] = {"manager": "NetworkManager", "config": nmcli_ifaces[iface]["config"]}
else:
result[iface] = {"manager": "Unmanaged or Unknown", "config": "None"}
print_table(result)
if __name__ == "__main__":
main()
===== Links =====
Weitere Themen: Vorteile von **systemd-networkd** (automatische Restarts), Nachteile (keine GUI), Alternativen wie Netplan (Ubuntu-fokussiert). Integration mit raspi-config für WiFi, CAN in Docker.
* Raspberry Pi Foren: [[https://forums.raspberrypi.com/viewtopic.php?t=378067|Bookworm Änderungen]], [[https://forums.raspberrypi.com/viewtopic.php?t=376705|NM vs. systemd]], [[https://forums.raspberrypi.com/viewtopic.php?t=386658|CAN Setup]]
* Debian Wiki: [[https://wiki.debian.org/SystemdNetworkd|systemd-networkd Guide]]
* Stack Exchange: [[https://raspberrypi.stackexchange.com/questions/108592/use-systemd-networkd-for-general-networking|systemd Nutzung]]
* Medium: [[https://medium.com/@life-is-short-so-enjoy-it/story-one-issue-in-raspberry-pi-os-brought-me-to-know-about-lennart-poettering-and-systemd-e5d8aad8c3f7|Migration Story]]
* Arch Wiki: [[https://wiki.archlinux.org/title/Systemd-networkd|Erweiterte Docs]]
* Hackaday: [[https://hackaday.io/project/162164/instructions|RPi Netzwerk]]
* Offizielle RPi-Docs: [[https://www.raspberrypi.com/documentation/computers/configuration.html|Netzwerk-Konfig]]