[[Vorlage(Getestet, focal, bionic, )]] {{{#!vorlage Hinweis Dieser Artikel beschreibt den Stand bei den Versionen ab 245 von [:systemd:], welche mit Ubuntu 20.04 ausgeliefert wird. Frühere Versionen (z.B. 237 bei Ubuntu 18.04) besitzen nicht alle hier beschriebene Eigenschaften. Siehe [#Es-funktioniert-nicht bei 237 fehlende Eigenschaften]. }}} [[Vorlage(Fortgeschritten)]] {{{#!vorlage Wissen [:sudo: Root-Rechte] [:Terminal: Arbeiten mit dem Terminal] [:Netzwerk: Netzwerke einrichten] [:Rechte: Rechte von Dateien ändern] }}} [[Inhaltsverzeichnis()]] Der Netzwerk-DAEMON [#Links systemd-networkd] gehört zur systemd-Familie und konfiguriert Netzwerkschnittstellen auf den Ebenen 2 und 3 des [#Links ISO/OSI-Referenzmodells]. Mit diesem Programm kann man auch auf realen Schnittstellen aufbauende virtuelle Schnittstellen wie z.B. Brücken, Tunnel, VPN erstellen und diese konfigurieren. Das Programm kümmert sich aber nicht um Ebene 2 bei WLAN-Schnittstellen. Bei Ubuntu-Server-Installationen wird systemd-networkd als [:systemd/Units:systemd-Unit] gestartet und als einziges Programm für die Konfiguration des Netzwerks verwendet. (Siehe jedoch [:Netplan:].) Bei Ubuntu-Desktop-Installationen wird systemd-networkd lediglich installiert, aber nicht gestartet. Beim Start kann es wechselweise zu Störungen mit [:NetworkManager:] kommen, welcher bei Desktops normalerweise zur ausschließlichen Konfiguration des Netzwerks verwendet wird. Zu systemd-networkd gehört das Dienstprogramm '''networkctl''' zur Kontrolle und Steuerung des DAEMONs. Bei systemd-networkd erfolgt die Konfiguration ausschließlich über Deklarationen. Man kann aber mit dem Zusatzprogramm [:systemd/networkd-dispatcher:] auch Progamme starten. = Installation = systemd-networkd ist auf allen aktuellen Ubuntu-Installationen als fester Bestandteil von systemd bereits vorinstalliert. = Konfiguration = == Programm-Einstellungen == Die Hauptkonfigurationsdatei '''/etc/systemd/networkd.conf''' dokumentiert primär die bei der Übersetzung des Programms definierte Voreinstellung. Man darf diese Datei abändern; dabei sollte man die Kommentare füt die Voreinstellungen erhalten, weil man sonst keine Dokumentation über die Voreinstellung mehr hat. Alternativ kann man die hier folgend beschriebenen weiteren Konfigurationsdateien verwenden. Nach der Hauptkonfigurationsdatei werden noch alle auf '''.conf''' endenden Dateien in diesen Verzeichnissen (sofern existierend) berücksichtigt: * '''/usr/lib/systemd/networkd.conf.d/''' * '''/usr/local/lib/systemd/networkd.conf.d/''' * '''/etc/systemd/networkd.conf.d/''' Dateien in später genannten Verzeichnissen maskieren gleichnamige Dateien in früher genannten Verzeichnissen und die Dateien werden in lexikographischer Reihenfolge bearbeitet. Eine gute Praxis besteht im Kopieren der Datei '''/etc/systemd/networkd.conf''' in das Verzeichnis '''/etc/systemd/networkd.conf.d/''' (welches man möglicherweise erst anlegen muss) und Bearbeitung der Kopie. Die Einstellmöglichkeiten sind in der Datei aufgelistet und werden ausführlich in der Manpage erklärt: {{{#!vorlage Befehl man networkd.conf }}} == Schnittstellen-Einstellungen == Für die Konfiguration von Netzwerkschnittstellen werden Dateien in folgenden Verzeichnissen berücksichtigt: * '''/usr/lib/systemd/network/''' * '''/usr/local/lib/systemd/network/''' * '''/run/systemd/network/''' * '''/etc/systemd/network/''' Dateien in später genannten Verzeichnissen maskieren gleichnamige Dateien in früher genannten Verzeichnissen und die Dateien werden in lexikographischer Reihenfolge bearbeitet. In den genannten Verzeichnissen finden sich drei anhand ihrer Endung zu unterscheidenden Arten von Konfigurationsdateien: * '''.netdev''' zum erstellen virtueller Netzwerk-Schnittstellen * '''.link''' konfigurieren Schnittstellen auf Layer 2. Dies wird tatsächlich von [:udev:] erledigt. * '''.network''' konfigurieren Schnittstellen auf Layer 3. Alle Dateien obliegen der [#Links Syntax in Konfigurationsdateien von systemd]. Diese ähnelt dem [wikipedia:Initialisierungsdatei:Ini-Format]. {{{#!vorlage Befehl man systemd.syntax }}} Bei den Schlüsselworten für die Abschnittsnamen und die Einstellungsoptionen sind große und kleine Buchstaben bedeutsam. Die möglichen Optionen und deren richtige Schreibweise können den Manpages entnommen werden: {{{#!vorlage Befehl man systemd.netdev man systemd.link man systemd.network }}} Beachte: In den Manpages werden Abschnittsnamen in Versalien geschrieben, wenn sie als Überschrift verwendet werden. In den Konfigurationsdateien ist aber durchweg der Abschnittsname in vorgeschriebener Verwendung von Groß-/Kleinbuchstaben zu schreiben. Die nachfolgenden Tabellen listen auszugsweise die Schlüsselworte, soweit sie für das Verständnis der Beispiele in diesem Artikel erforderlich sind. ''Kursiv'' dargestellte Schlüsselworte sind ''Pflichtangaben''. {{{#!vorlage tabelle <-2 rowclass="titel"> Optionen für .netdev-Dateien +++ Schlüsselwort Beschreibung +++ [Match] <:>Abschnitt optional +++ Host Hostname oder Maschinen-Kennung (engl: ''machine-id'') des Rechners. Effektiv wird die Zeichenfolge mit '''/etc/hostname''' und '''/etc/machine-id''' verglichen. Die machine-id kann aber auch beim Hochlauf temporär als Kernel Parameter gesetzt werden. +++ Virtualization Prüft ob und ggf. wie das System virtualisiert ist. Mögliche Werte: no, yes, vm, container, qemu, kvm, zvm, vmware, microsoft, oracle, xen, bochs, uml, openvz, lxc, lxc-libvirt, systemd-nspawn, docker, rkt und ggf. weitere. Effektiv wird gegen die Ausgabe von '''systemd-detect-virt''' verglichen. +++ KernelCommandLine Option auf der Kernel-Kommandozeile. Vergleicht effektiv, ob '''/proc/cmdline''' die Angabe enthält. +++ KernelVersion Kernel Version. Vergleicht effektiv mit '''uname -r''', dabei sind auch Vergleiche auf größer-/kleiner-als usw. möglich. +++ Architecture Prüfe auf bestimmte Architektur. Beispiele: x86, x86-64, ppc, ppc-le, ppc64, ppc64-le, ia64, parisc, parisc64, s390, s390x, sparc, sparc64, mips, mips-le, mips64, mips64-le, alpha, arm, arm-be, arm64, arm64-be, sh, sh64, m86k, tilegx, cris. Vergleicht effektiv mit '''uname -m'''. +++ [[BR]]''[NetDev]'' <:>[[BR]]Abschnitt obligatorisch +++ ''Name'' Name der Schnittstelle. Pflichtangabe. Maximal 15 dieser zulässigen Zeichen: a-z, A-Z, 0-9 und Sonderzeichen: `_ = + . -` +++ ''Kind'' Typ der Schnittstelle. Pflichtangabe. Beispiele: dummy, bridge, tun, wireguard und viele weitere, siehe Manpage. }}} {{{#!vorlage tabelle <-2 rowclass="titel"> Optionen für .link-Dateien +++ Schlüsselwort Beschreibung +++ [Match] <:>Abschnitt optional, aber Verwendung dringend empfohlen. +++ Beachte: Die unter .netdev angegebenen Prüfungen sind auch hier möglich. +++ Path Eine mit Leerzeichen getrennte Liste mit Werten für die udev-Eigenschaft `ID_PATH`. Es wird geprüft, ob der tatsächliche Wert einem dar angegebenen Werten entspricht. +++ Driver Eine mit Leerzeichen getrennte Liste mit Werten für die udev-Eigenschaft `ID_NET_DRIVER`. Es wird geprüft, ob der tatsächliche Wert einem dar angegebenen Werten entspricht. +++ Type Eine mit Leerzeichen getrennte Liste mit Werten für den von '''networkctl''' angezeigten Schnittstellentyp. (Achtung: Bei Version 237 sind nur die Werte der udev-Eigenschaft `DEVTYPE` zulässig!) Es wird geprüft, ob der tatsächliche Wert einem dar angegebenen Werten entspricht. +++ Property Eine mit Leerzeichen getrennte Liste mit udev-Eigenschaft=Wert Angaben. Es wird geprüft, ob für jede angegebene Eigenschaft tatsächlich der Wert dem hier angegebenen entspricht. +++ MacAddress Eine mit Leerzeichen getrennte Liste mit MAC-Adressen. Diese Option darf mehrfach angegeben werden; die Listen werden vereinigt. Es wird geprüft, ob die momentan eingestellte Unicast-MAC-Adresse in der Gesamtliste vorkommt. +++ PermanentMACAddress Eine mit Leerzeichen getrennte Liste mit permanenten [#Links EUI-48]. Diese Option darf mehrfach angegeben werden; die Listen werden vereinigt. Es wird geprüft, ob der Identifizierer der Hardware in der Gesamtliste vorkommt. +++ [[BR]]''[Link]'' <:>[[BR]]Abschnitt obligatorisch +++ NamePolicy Eine Liste mit Bezeichnern für die zur Benennung dieser Schnittstelle auszuprobierenden Methoden. Bekannte Methoden: kernel, database, onboard, slot, path, mac, keep +++ Name Ein Name für die Schnittstelle. Dieser wird verwendet, wenn keine der angegebenen Methoden zu Benennung erfolgreich war. Maximal 15 dieser zulässigen Zeichen: a-z, A-Z, 0-9, und Sonderzeichen: `_ = + . -` +++ MACAddress Eine Unicast-MAC-Adresse, welche der Hardware zugewiesen wird. +++ MTUBytes Die maximale Paketlänge in Bytes wird für Netzwerkebene 2 auf den hier abgegebenen Wert gesetzt Die üblichen Suffixe wie K, M, G dürfen verwendet werden und; sie werden zur Basis 1024 interpretiert. }}} {{{#!vorlage tabelle <-2 rowclass="titel"> Optionen für .network-Dateien +++ Eintrag Beschreibung +++ [Match] <:>Abschnitt optional, aber Verwendung dringend empfohlen. +++ Beachte: Alle unter .link angegebenen Prüfungen sind auch hier möglich. +++ Name Eine mit Leerzeichen getrennte Liste mit Mustern (Shell-Globs) für die Werte der udev-Eigenschaft `INTERFACE`. Es wird geprüft, ob der tatsächliche Wert einem der Muster entspricht. +++ WLANInterfaceType Eine mit Leerzeichen getrennte Liste von Betriebsarten der WLAN-Schnittstelle. Beispiele: `ad-hoc`, `station`, `ap`. Weitere siehe Manpage. Es wird geprüft, ob die Betriebsart der Schnittstelle mit einem Listeneintrag übereinstimmt. +++ [[BR]][Link] <:>[[BR]]Abschnitt optional +++ MACAddress Eine Unicast-MAC-Adresse, welche der Hardware zugewiesen wird. +++ MTUBytes Die maximale Paketlänge in Bytes wird auf den hier angegebenen Wert gesetzt Die üblichen Suffixe wie K, M, G dürfen verwendet werden; sie werden zur Basis 1024 interpretiert. +++ Unmanaged Vorgabe ist `no`. Kann auf den Wert `yes` gesetzt werden, dann wird der Schnittstelle keine '''.network'''-Datei zugewiesen, weil die Suche nach passenden Dateien an dieser Stelle beendet wird. +++ <(>[[BR]]''[Network]'' <:>[[BR]]Abschnitt obligatorisch +++ Description Beschreibung der Schnittstelle. Dies dient nur der Darstellung. +++ DHCP Mögliche Werte: `yes`, `no`, `ipv4`, `ipv6`. Vorgabe ist `no`, d.h. kein Start des DHCP-Client. Anderer Wert startet den DHCP-Client das angegebene IP-Protokoll bzw. bei `yes` für beide Protokolle. Der DHCPv6-Client kann aber auch unbeeinflusst von dieser Einstellung über empfangene Ankündigungen des Routers gestartet werden. Wenn man den DHCP-Client einschaltet, kann man in den Abschnitten `[DHCPv4]` bzw. `[DHCPv6]` dessen Verhalten konfigurieren. +++ DHCPServer Standardwert `no`. Kann auf `yes` gesetzt werden und startet dann einen DHCPv4-Server. Dieser wird im Abschnitt [DHCPServer] konfiguriert. +++ Address Kurzform für einen Abschnitt `[Address]` zur Definition einer IP-Adresse und deren Prefix-Länge für ein Broadcast.Netzwerk. Kann verwendet werden, wenn man in einem Abschnitt `[Address]` nur den Schlüssel `Address` benötigt. Mehrfache Verwendung dieser Option ist möglich. +++ Gateway Kurzform für einen Abschnitt `[Route]`. Kann verwendet werden, wenn man in einem solchen Abschnitt nur den Schlüssel `Gateway` benötigt. Erzeugt eine default-Route zur angegebenen IP-Adresse. Mehrfache Verwendung dieser Option ist möglich, aber sinnlos. +++ DNS Einstellung für systemd-resolved; systemd-networkd ignoriert diesen Schlüssel. IP-Adresse eines DNS-Servers, der für die über diese Schnittstelle erreichbaren Rechner einer DNS-Domain die Namensauflösung erbringt. Mehrfache Verwendung dieser Option ist möglich. +++ Domains Einstellung für systemd-resolved; systemd-networkd ignoriert diesen Schlüssel. Eine mit Leerzeichen getrennte Liste von DNS-Domänen, für welche der/die DNS-Server an dieser Schnittstellen zuständig sind. +++ <(>[[BR]][Address] <:>[[BR]]Dieser Abschnitt ist mehrfach zulässig. +++ ''Address'' Angabe einer IP-Adresse, optional mit deren Prefix-Länge. Zulässig sind für IPv4 beispielsweise `192.0.2.42/28` und `10.0.34.56/255.255.128.0` in diesen Schreibweisen. Es müssen stets alle 4 Bytes angegeben werden, auch wenn diese den Wert `0` haben. Für IPv6 sind nur die vollständige Angabe oder die Schreibweise wie im Beispiel `fd00::1/64` zulässig. Pflichtangabe in diesem Abschnitt und nur genau einmal möglich. Es wird die Adresse zugewiesen und für die Schnittstelle (automatisch, aber abschaltbar) eine Route zum Netzwerk eingerichtet. +++ Broadcast Nur sinnvoll, wenn unter `Address` in diesem Abschnitt eine IPv4-Adresse angegeben wurde und man nicht die sich aus dieser Angabe ergebene Broadcast-Adresse, sondern diese IP-Adresse verwenden will. +++ Peer IP-Adresse der Gegenstelle bei einer Punkt-zu-Punkt-Verbindung. Zur Definition einer Punkt-zu-Punkt-Verbindung sollte man hier und auch unter `Address` die Prefix-Länge `32` bei IPv4 bzw. `128` bei IPv6 verwenden. Bei mehrfacher Verwendung wird nur die letzte Angabe verwendet. +++ <(>[[BR]][Route] <:>[[BR]]Dieser Abschnitt ist mehrfach zulässig. +++ Type Der Typ der Route. Vorgabe ist `unicast`, mögliche Werte sind die üblichen Typen von Routen wie beispielsweise `blackhole`. +++ Destination Der Zielbereich als Netzwerk-Prefix: Es muss eine IP-Adresse und optional deren Prefix-Länge angegeben werden, dabei können nur solche IP-Adressen verwendet werden, bei denen beim Host-Teil alle Bits 0 sind. Wenn keine Prefix-Länge angegeben wird, impliziert dies 32 bei IPv4 bzw. 128 bei IPv6 (Host-Route). Wenn diese Option fehlt, dann wird als Zielbereich `0.0.0.0/0` bzw. `::/0` verwendet. +++ Gateway Eine IP-Adresse. IP-Pakete mit Zieladressen im Zielbereich dieser Route werden an diese Adresse geschickt. +++ Metric Ganze Zahl ohne Vorzeichen. Praktisch nur bedeutsam, wenn es zu einem Zeitpunkt mehrere Routen mit gleichem Ziel hinsichtlich Adresse und Prefix-Länge gibt. Diese müssen sich dann in dieser Angabe unterscheiden. Der Konflikt wird gelöst durch Auswahl der Route mit der kleinsten Metric. }}} == .netdev-Dateien: Schnittstelle anlegen == Dateien mit der Endung auf '''.netdev''' werden bei jedem [#Start-und-Stopp Start von systemd-networkd] ausgewertet. Wenn es eine Datei mit Endung auf '''.netdev''' ohne eine dazu passende Schnittstelle gibt, wird die beschriebene Schnittstelle angelegt und konfiguriert. === Beispiel: Netzwerkbrücke === Eine [:Netzwerkbrücke:] ist eine Realisierung eines Hub/Switch in Software und verbindet mehrere Netzwerkschnittstellen auf Ebene 2. Dies kann als einfache Methode für eine [:Internetverbindungsfreigabe:] verwendet werden. {{{# /etc/systemd/network/20-bridge.netdev [NetDev] Kind = bridge Name = HUB [Bridge] STP = yes HelloTimeSec = 1 MaxAgeSec = 4 ForwardDelaySec = 4 }}} Der gesamte Abschnitt `[Bridge]` ist hier optional. Abhängig vom Typ (`Kind=`) der Schnittstelle sind weitere Abschnitte zur Ausgestaltung der Schnittstelle zulässig. Dies wird hier benutzt, um das Spanning Tree Protokoll einzuschalten und zu parametrieren. Details siehe Artikel [:Netzwerkbrücke:]. Die Schnittstellen, welche diesem HUB als Ports zugeordnet werden sollen, müssen in ihrer '''.network'''-Datei eine entsprechende Zuweisung erhalten: {{{# /etc/systemd/network/80-HUB-port.network [Match] Type =! wlan Name =! HUB [Network] Description = Interface als Bridge-Port von HUB verwenden. Bridge = HUB LinkLocalAddressing = no }}} Wie im Beispiel gezeigt, kann man mit =! auch auf Ungleichheit testen. Dies wird hier benutzt, damit die Brücke nicht sich selbst als Port hinzugefügt wird. Die Angabe "`LinkLocalAddressing=no`" ist hier optional. Sie verhindert, dass per Voreinstellung für jeden Port eine eigene IPv6-Link-Adresse vergeben wird. Bei Ubuntu 18.04 mit systemd-Version 237 hat dies den schönen Nebeneffekt, dass die voll funktionsfähige Schnittstelle nicht von networkctl als "`degraded`" angezeigt wird, weil nur Link-Local-Adressen vorhanden sind. systemd-networkd löscht niemals eine Schnittstelle. Selbst wenn man die .netdev-Datei löscht, welche zu ihrer Erzeugung gedient hat, interessiert dies systemd-networkd nicht. Eine Schnittstelle, welche nicht zu realer Hardware gehört, kann man aber mit dem [#Dienstprogramm-networkctl Dienstprogramm networkctl] vernichten. == .link-Dateien == Die Dateien mit Endung auf '''.link''' dienen zu Konfiguration vorhandener (Hardware- und Software-) Schnittstelle auf Netzwerkebene 2, soweit es sich um statische Konfigurationselemente handelt. (Variable Einstellungen auf Ebene 2 können dagegen in '''.network'''-Dateien erfolgen.) Diese Dateien werden von dem in udev fest eingebauten Modul '''net_setup_link''' bearbeitet. Damit sind '''.link'''-Dateien verkappte udev-Regeln, die grundsätzlich auch in der herkömmlichen udev-Syntax formuliert werden könnten und früher war das auch der Fall. (Hierfür wurde z.B '''/etc/udev/rules.d/70-persistent-net.rules''' verwendet.) Für jede vorhandene Schnittstelle werden nacheinander die '''.link'''-Dateien geprüft, ob alle genannten Selektionskriterien gemeinsam zutreffen. Die erste passende Datei wird der Schnittstelle zugewiesen, und die in der Datei aufgeführten Konfigurationsaufgaben werden durchgeführt. Selbst wenn dabei ein Fehler auftritt, wird keine weitere Datei beachtet. === Beispiel: Schnittstelle umbenennen === {{{# /etc/systemd/network/10-rename-to-radio.link [Match] Type = wlan wifi Path =! pci*usb* [Link] Description = Radio-LAN NamePolicy = Name = radio }}} Wenn man das ausprobiert, wird es wahrscheinlich zunächst nicht funktionieren. Zu den Gründen und zur Abhilfe siehe [#Umbenennung-einer-Schnittstelle-funktioniert-nicht Problembehebung]. Die hier gezeigte Arbeitsweise ist potentiell unsicher, weil eine Klasse von Objekten auf ein einziges Element (den Namen) abgebildet wird. Solange es nur eine passende Schnittstelle gibt, ist das harmlos. Aber bei zwei und mehr passenden Objekten wird die Datei auch auf alle angewendet. Ab dem zweiten Umbenennungsversuch gibt es natürlich Fehlermeldungen und Fehlfunktionen. Sicherer ist in solchen Fällen eine Selektion z.B. über `PermanentMACAddress`. Hier wird auf Ungleichheit getestet, um USB/WLAN-Sticks, die leicht als zusätzliche zu den eingebauten Schnittstellen im System auftauchen könnten, von dieser Regel auszuschließen. === Beispiel: WLAN === WLAN-Schnittstellen werden auf Ebene 2 nicht von systemd-networkd verwaltet. Man muss die Betriebsbereitstellung der Schnittstelle mit anderen Mitteln erledigen, siehe: [:systemd/WLAN_mit_systemd-networkd :WLAN mit systemd-networkd]. Eine WLAN-Schnittstelle, welche über das externe WLAN-Einrichtungsprogramm bereits auf Ebene 2 als Bridge-Port einer Netzwerkbrücke zugeordnet wurde, bedarf gar keiner weiteren Konfiguration per systemd-networkd. Die Konfiguration einer betriebsbereiten WLAN-Schnittstelle auf Ebene 3 erfolgt dagegen genauso wie bei jeder anderen Schnittstelle. == .network-Dateien == === Beispiel: Schnittstelle ignorieren === Die System-Schnittstelle `lo` kann genau wie jede andere Schnittstelle durch Zuweisung einer '''.network'''-Datei konfiguriert werden. Dies ist normalerweise gar nicht erforderlich. Zur Vermeidung von Fehlfunktionen durch irrtümliche Zuweisung einer unpassenden '''.network'''-Datei kann man beispielsweise diese Datei verwenden: {{{# /etc/systemd/network/00-lo-unmanaged.network [Match] Name = lo [Link] Unmanaged = yes }}} Diese Technik ist auch sinnvoll für andere Schnittstellen, wenn diese nicht durch systemd-networkd konfiguriert werden sollen bzw. wenn ein Konfigurationsversuch ggf. nach langer Wartezeit ohnehin scheitern würde. === Beispiel: DHCP oder statische Konfiguration === Mit diesem Satz von '''.network'''-Dateien kann man beim Hochlauf des Systems über eine Option auf der Kommandozeile des Kernels den DHCP-Client steuern: {{{ # /etc/systemd/network/60-dhcp-all-hardware.network # Alle Hardware-Schnittstellen per DHCP konfigurieren. # Voreinstellung. Wird benutzt, wenn "noDHCP" nicht angegeben wird. [Match] KernelCommandLine =! noDHCP Path = pci* [Network] DHCP = ipv4 }}} Zur Selektion der Hardware-Schnittstellen wird `Path` benutzt. Auch USB-Geräte schließt "`pci*`" mit ein, weil sie in der Regel über eine PCI/USB-Bridge in das System integriert sind. Bei exotischer Hardware kann es ggf. anders sein. {{{ # /etc/systemd/network/60-dhcp-wlan-only.network # Alle WLAN-Schnittstellen (aber nur solche) per DHCP konfigurieren. [Match] KernelCommandLine =! noDHCP=*wlan* Path = pci* Type = wlan [Network] DHCP = ipv4 }}} Wenn man auf der Kernel-Kommandozeile "`noDHCP=wlan`" angibt, passt diese Datei nicht. Aber vielleicht die nächste: {{{ # /etc/systemd/network/60-dhcp-ethernet-only.network # Alle Ethernet-Hardware-Schnittstellen (aber nur solche) per DHCP konfigurieren. [Match] KernelCommandLine =! noDHCP=*ether* Path = pci* Type = ether #Type =! wlan [Network] DHCP = ipv4 }}} Diese Datei setzt voraus, dass `Type=ether` funktioniert, was bei Ubuntu 18.04 mit systemd-Version 237 nicht der Fall ist. Alternativ kann man voraussetzen, dass es nur die beiden Typen Ethernet und WLAN gibt, und dann `Type=!wlan` verwenden. Wenn man auf der Kernel-Kommandozeile "`noDHCP=ether`" angibt, passt diese Datei nicht. Aber vielleicht die nächste: {{{ # /etc/systemd/network/60-uplink-static.network # Nur die Hardware-Schnittstelle mit dem Namen "uplink" statisch konfigurieren. [Match] KernelCommandLine = noDHCP=* Path = pci* Name = uplink [Network] DHCP = no Address = 192.168.1.20/24 Gateway = 192.168.1.1 DNS = 8.8.8.8 DNS = 8.8.4.4 }}} Beachte: systemd-networkd ignoriert die Angaben bei `DNS=`! Zur Konfiguration der DNS-Namensauflösung kann man z.B. [:systemd/systemd-resolved :systemd-resolved] starten, welches dann die hier gemachten Angaben für seine Konfiguration benutzt. ###= Benutzung = = Start und Stopp = systemd-networkd kann nötigenfalls über diese Befehle verwaltet werden: {{{#!vorlage befehl systemctl restart systemd-networkd.service systemctl enable systemd-networkd.service systemctl status systemd-networkd.service systemctl stop systemd-networkd.service systemctl disable systemd-networkd.service }}} systemd-networkd macht nichts, wenn … * … es schon läuft und per `start` gestartet wird. Wenn Änderungen übernommen werden sollen, muss man es stoppen und neu starten, der Befehl `restart` von '''systemctl''' macht genau dieses. * … es läuft und man die Konfiguration ändert. * … es gestoppt wird. * … es beim erneuten Start bereits konfigurierte Schnittstellen findet. Lediglich neue Schnittstellen werden bearbeitet. = Dienstprogramm networkctl = Dieses Programm funktioniert eingeschränkt auch dann, wenn systemd-networkd nicht läuft bzw. die systemd-Unit '''systemd-networkd.service''' inaktiv ist und mit sehr eingeschränkter Funktionalität sogar dann, wenn systemd nicht installiert ist. == Zustand ermitteln == === Liste der im System vorhandenen Schnittstellen === Der Befehlsteil `list` ist optional: {{{#!vorlage Befehl networkctl list }}} Beispielausgabe: {{{ IDX LINK TYPE OPERATIONAL SETUP 1 lo loopback carrier unmanaged 2 cable ether no-carrier unmanaged 3 radio wlan routable unmanaged 6 HUB bridge no-carrier configuring }}} '''networkctl''' zeigt hier auch Schnittstellen an, welche gar nicht von systemd-networkd betreut werden. Die Angabe `unmanaged` ist zu lesen als: „Nicht von systemd-networkd verwaltet, aber möglicherweise von einem anderen Programm“. === Kurze Übersicht der aktiven IP-Konfiguration des Systems: === {{{#!vorlage Befehl networkctl status }}} Zusätzlich wird auch ein Auszug der relevanten Meldungen aus dem Systemlog angezeigt. === Ausführliche Übersicht der IP-Konfiguration einer Schnittstelle === Schnittstelle hier beispielhaft: lo {{{#!vorlage Befehl networkctl status lo }}} Hier wird auch angezeigt, welche '''.link'''- und '''.network'''-Datei tatsächlich zur Konfiguration der Schnittstelle verwendet wurde. === Ausführiche Übersicht der aktiven IP-Konfiguration des Systems === {{{#!vorlage Befehl networkctl status --all }}} == Schnittstelle löschen == Es können natürlich nur Software-Schnittstellen (hier als schlechtes Beispiel: lo) entfernt werden: {{{#!vorlage Befehl sudo networkctl delete lo # <- Ersetze "lo" durch anderen Namen! }}} Dies funktioniert bei systemd in der Version 237 gar nicht. Der vorstehende Befehl macht das, was man über diesen Befehl auch machen könnte: {{{#!vorlage Befehl sudo ip link del lo # <- Ersetze "lo" durch anderen Namen! }}} == Schnittstelle aktualisieren == Bei Schnittstellen mit dynamischer IP-Konfiguration z.B. über DHCP kann man eine Aktualisierung auslösen: {{{#!vorlage Befehl sudo networkctl renew HUB }}} Dies funktioniert bei systemd in der Version 237 gar nicht. == Schnittstelle ändern == Nach Änderung einer '''.network'''-Datei werden die Änderungen nicht automatisch übernommen. Man kann das für eine Schnittstelle (hier beispielhaft: HUB) mit diesem Befehl anstoßen: {{{#!vorlage Befehl sudo networkctl reconfigure HUB }}} Dies funktioniert bei systemd in der Version 237 gar nicht und in der Version 245 nicht immer wie erwartet, z.B. kann man über diese Methode nicht zuverlässig eine statisch zugewiesenen IP-Adresse ändern. Alternativ kann man die Software-Schnittstellen löschen und [#Start-und-Stopp systemd neu starten]. == Konfiguration erneut laden == Die erneute Auswertung aller (vielleicht geänderter) '''.netdev'''- und '''.network'''-Dateien kann man mit diesem Befehl erzwingen: {{{#!vorlage Befehl sudo networkctl reload }}} * Für jede '''.netdev'''-Datei ohne dazu passende Schnittstellen wird eine Schnittstelle angelegt. * '''.netdev'''-Dateien werden ignoriert, wenn es bereits eine passende Schnittstelle gibt. * '''.network'''-Dateien werden auf alle passenden Schnittstellen angewendet. Dies funktioniert bei systemd in der Version 237 gar nicht und in der Version 245 nicht immer wie erwartet. Alternativ kann man die Software-Schnittstellen löschen und [#Start-und-Stopp systemd neu starten]. = Problembehebung = == Es funktioniert nicht! == Man überprüfe, ob die eingesetzte Version von systemd bereits die in diesem Artikel beschriebenen Eigenschaften besitzt. Die Version von systemd zeigt dieser Befehl: {{{#!vorlage Befehl systemd --version }}} Vor Version 245 können diese Befehle bzw. Schlüsselworte (sowie weitere, hier nicht behandelte Eigenschaften) nicht verwendet werden: * '''.link'''-Dateien: `Property`, `NamePolicy=keep` * '''.link'''- und '''.network'''-Dateien: Werte für `Type` im Abschnitt `[Match]` inkompatibel bei Versionen 237/245 * '''network'''-Dateien: `WLANInterfaceType`, für `Type` im Abschnitt `[Route]` sind nur zulässig: `unicast`, `blackhole`, `unreachable`, `prohibit` * '''networkctl''': delete, renew, reconfigure, reload == Es funktioniert immer noch nicht! == Diese Checkliste abarbeiten: 1. [#Start-und-Stopp Wurde systemd-networkd überhaupt gestartet?] 1. Welche Meldungen von systemd-networkd stehen im Systemlog? \\ {{{#!vorlage Befehl journalctl -b -u systemd-networkd.service }}} 1. [#Ausfuehriche-bersicht-der-aktiven-IP-Konfiguration-des-Systems Welche Konfigurationsdateien wurden den Schnittstellen tatsächlich zugewiesen?] \\ Wenn hier nicht die erwarteten Dateien angezeigt werden, sind die Selektionskriterien unzureichend oder falsch oder es gibt syntaktische Fehler in den Dateien. 1. Gibt es Kompetenzstreitigkeiten mit anderen Programmen zur Netzwerk-Konfiguration? 1. [#Start-und-Stopp systemd-networkd ist verwirrt und will neu gestartet werden!] == Umbenennung einer Schnittstelle funktioniert nicht == udev hat eine eingebaute Restriktion: Schnittstellen werden nur einmal umbenannt! Diese einzige Chance wird bereits beim Hochlauf verbraucht. Man muss also die geänderten Namensregeln bei bereits installierten Kerneln in deren '''initrd.img''' hinterlegen: {{{#!vorlage Befehl sudo update-initramfs -u }}} Bei der Installation neuer Kernel wird das automatisch mit erledigt. Bei Ubuntu 18.04 mit systemd-Version 237 ist diese Restriktion fest in das Programm eingebaut und daher nicht abschaltbar. Ab Ubuntu 20.04 mit systemd-Version 245 ist die Restriktion über die Einstellung "`NamePolicy=keep`"in der Datei '''/lib/systemd/network/99-default.link''' realisiert: {{{ [Link] NamePolicy=keep kernel database onboard slot path }}} Man kann diese Systemdatei mit einer eigenen Datei '''/etc/systemd/network/99-default.link''' maskieren, indem man die Systemdatei kopiert und in der Kopie das Wort "`keep`" entfernt, und diese Datei wie vorstehend gezeigt in die '''initrd.img''' einfügen. == Verzögerung beim Hochlauf == Wenn die Konfiguration einer Schnittstelle misslingt, beispielsweise weil per DHCP keine Antwort eintrifft, blockiert die systemd-Unit '''systemd-networkd-wait-online.service''' bis zu 2 Minuten lang den Hochlauf bevor sie sich mit Fehler beendet. Wenn man anschliessend per networkctl eine Schnittstelle im Zustand "`configuring`" vorfindet, kann man die Zwangspause oft wie [#Beispiel-Schnittstelle-ignorieren oben beschrieben] abstellen. = Links = == intern == * [:systemd/networkd-dispatcher:] - auf Zustandsänderungen bei den Netzwerkschnittstellen reagieren, um z.B. Programm zu starten * [:systemd/networkd/Anwendungsbeispiele:] == extern == * [https://www.freedesktop.org/software/systemd/man/systemd-networkd.html Projekseite systemd-networkd] {en} * [https://www.freedesktop.org/software/systemd/man/systemd.syntax.html Syntax in Konfigurationsdateien von systemd] {en} * [https://de.wikipedia.org/wiki/OSI-Modell ISO/OSI-Referenzmodell Netzwerk (Netzwerk-Schichten)] {de} * [https://standards.ieee.org/faqs/regauth.html#1 Erklärung EUI-48] {en} #tag: System, systemd, Netzwerk, Server