GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verwalten Sie Ihre angeschlossene Hardware unter Linux mit systemd-udevd

Linux leistet hervorragende Arbeit, indem es angeschlossene Hardwaregeräte von unzähligen Anbietern automatisch erkennt, lädt und verfügbar macht. Tatsächlich war es dieses Feature, das mich vor vielen Jahren überzeugte, darauf zu bestehen, dass mein Arbeitgeber seine gesamte Infrastruktur auf Linux umstellte. Der Schmerzpunkt war die Art und Weise, wie eine bestimmte Firma in Redmond keine Treiber für die integrierte Netzwerkkarte auf unseren Compaq-Desktops laden konnte, während Linux dies mühelos erledigte.

In den Jahren seitdem ist die Linux-Bibliothek erkannter Geräte zusammen mit der Ausgereiftheit des Prozesses enorm gewachsen. Und der Star dieser Show ist udev. Die Aufgabe von Udev besteht darin, auf Ereignisse des Linux-Kernels zu warten, die Änderungen am Zustand eines Geräts betreffen. Es könnte ein neues USB-Gerät sein, das eingesteckt oder herausgezogen wird, oder es könnte eine drahtlose Maus sein, die offline geht, weil sie in verschüttetem Kaffee ertrunken ist.

Die Aufgabe von Udev besteht darin, alle Zustandsänderungen zu verarbeiten, indem beispielsweise die Namen oder Berechtigungen zugewiesen werden, über die auf Geräte zugegriffen wird. Auf eine Aufzeichnung dieser Änderungen kann über dmesg zugegriffen werden. Da dmesg normalerweise Tausende von Einträgen ausspuckt, ist es klug, die Ergebnisse zu filtern. Das folgende Beispiel zeigt, wie Linux meine WLAN-Schnittstelle identifiziert. Es zeigt den Chipsatz an, den mein drahtloses Gerät verwendet (ath9k ), der ursprüngliche Name, der ihm früh im Prozess zugewiesen wurde (wlan0 ) und der große, hässliche permanente Name, den es derzeit verwendet (wlxec086b1ef0b3 ):

$ dmesg | grep wlan
[    5.396874] ath9k_htc 1-3:1.0 wlxec086b1ef0b3: renamed from wlan0

In diesem Artikel werde ich erörtern, warum jemand einen solchen Namen verwenden möchte. Unterwegs werde ich die Anatomie von udev-Konfigurationsdateien untersuchen und dann zeigen, wie man Änderungen an udev-Einstellungen vornimmt, einschließlich, wie man die Art und Weise bearbeitet, wie das System Geräte benennt. Dieser Artikel basiert auf einem Modul aus meinem neuen Kurs Linux-Systemoptimierung.

Das udev-Konfigurationssystem verstehen

Auf systemd-Rechnern werden udev-Operationen von systemd-udevd verwaltet Dämon. Sie können den Status des udev-Daemons auf die normale systemd-Weise mit systemctl status systemd-udevd überprüfen .

Weitere Linux-Ressourcen

  • Spickzettel für Linux-Befehle
  • Spickzettel für fortgeschrittene Linux-Befehle
  • Kostenloser Online-Kurs:RHEL Technical Overview
  • Spickzettel für Linux-Netzwerke
  • SELinux-Spickzettel
  • Spickzettel für allgemeine Linux-Befehle
  • Was sind Linux-Container?
  • Unsere neuesten Linux-Artikel

Technisch funktioniert udev so, dass es versucht, jedes empfangene Systemereignis mit Regelsätzen abzugleichen, die entweder in /lib/udev/rules.d/ zu finden sind oder /etc/udev/rules.d/ Verzeichnisse. Regeldateien enthalten Übereinstimmungsschlüssel und Zuweisungsschlüssel. Der Satz verfügbarer Übereinstimmungsschlüssel enthält Aktion , Name , und subsystem . Das bedeutet, wenn ein Gerät mit einem bestimmten Namen erkannt wird, das Teil eines bestimmten Subsystems ist, wird ihm eine voreingestellte Konfiguration zugewiesen.

Dann werden die Schlüssel/Wert-Paare der "Zuweisung" verwendet, um die gewünschte Konfiguration anzuwenden. Sie könnten dem Gerät beispielsweise einen neuen Namen zuweisen, es mit einem Dateisystem-Symlink verknüpfen oder den Zugriff auf einen bestimmten Eigentümer oder eine bestimmte Gruppe beschränken. Hier ist ein Auszug aus einer solchen Regel von meiner Workstation:

$ cat /lib/udev/rules.d/73-usb-net-by-mac.rules
# Use MAC based names for network interfaces which are directly or indirectly
# on USB and have an universally administered (stable) MAC address (second bit
# is 0). Don't do this when ifnames is disabled via kernel command line or
# customizing/disabling 99-default.link (or previously 80-net-setup-link.rules).

IMPORT{cmdline}="net.ifnames"
ENV{net.ifnames}=="0", GOTO="usb_net_by_mac_end"

ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="usb", NAME=="", \
    ATTR{address}=="?[014589cd]:*", \
    TEST!="/etc/udev/rules.d/80-net-setup-link.rules", \
    TEST!="/etc/systemd/network/99-default.link", \
    IMPORT{builtin}="net_id", NAME="$env{ID_NET_NAME_MAC}"

Das Hinzufügen Aktion weist udev an, jedes Mal zu starten, wenn ein neues Gerät angeschlossen wird, das Teil des Netzwerk-Subsystems und ist ist ein USB-Gerät. Außerdem gilt die Regel, wenn ich es richtig verstehe, nur, wenn das Gerät eine MAC-Adresse hat, die aus Zeichen innerhalb eines bestimmten Bereichs besteht, und außerdem nur, wenn die 80-net-setup-link.rules und 99-default.link Dateien nicht existieren.

Unter der Annahme, dass alle diese Bedingungen erfüllt sind, wird die Schnittstellen-ID so geändert, dass sie mit der MAC-Adresse des Geräts übereinstimmt. Erinnern Sie sich an den vorherigen dmesg-Eintrag, der zeigt, wie mein Schnittstellenname von wlan0 geändert wurde zu diesem fiesen wlxec086b1ef0b3 Name? Das war ein Ergebnis der Ausführung dieser Regel. Wie soll ich wissen? Denn ec:08:6b:1e:f0:b3 ist die MAC-Adresse des Geräts (abzüglich der Doppelpunkte):

$ ifconfig -a
wlxec086b1ef0b3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.103  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::7484:3120:c6a3:e3d1  prefixlen 64  scopeid 0x20<link>
        ether ec:08:6b:1e:f0:b3  txqueuelen 1000  (Ethernet)
        RX packets 682098  bytes 714517869 (714.5 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 472448  bytes 201773965 (201.7 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Diese udev-Regel ist standardmäßig in Linux vorhanden. Ich musste es nicht selbst schreiben. Aber warum sich die Mühe machen – vor allem, wenn man bedenkt, wie schwierig es ist, mit einer solchen Schnittstellenbezeichnung zu arbeiten? Werfen Sie einen zweiten Blick auf die Kommentare, die in der Regel enthalten sind:

# Use MAC based names for network interfaces which are directly or indirectly
# on USB and have an universally administered (stable) MAC address (second bit
# is 0). Don't do this when ifnames is disabled via kernel command line or
# customizing/disabling 99-default.link (or previously 80-net-setup-link.rules).

Beachten Sie, dass diese Regel speziell für USB-basierte Netzwerkschnittstellen entwickelt wurde. Im Gegensatz zu PCI-Netzwerkschnittstellenkarten (NICs) werden USB-Geräte wahrscheinlich von Zeit zu Zeit entfernt und ersetzt. Das bedeutet, dass es keine Garantie dafür gibt, dass sich ihre ID nicht ändert. Sie könnten wlan0 sein einen tag und wlan3 der nächste. Um eine Verwirrung der Anwendungen zu vermeiden, weisen Sie Geräten absolute IDs zu – wie die meiner USB-Schnittstelle.

Udev-Einstellungen manipulieren

Für meinen nächsten Trick werde ich die MAC-Adresse und die aktuelle ID für die Ethernet-Netzwerkschnittstelle auf einer virtuellen VirtualBox-Maschine abrufen und diese Informationen dann verwenden, um eine neue udev-Regel zu erstellen, die die Schnittstellen-ID ändert. Wieso den? Nun, vielleicht plane ich, mit dem Gerät von der Befehlszeile aus zu arbeiten, und diesen langen Namen eingeben zu müssen, kann lästig sein. So funktioniert das.

Bevor ich meine ID ändern kann, muss ich die aktuelle Netzwerkkonfiguration von Netplan deaktivieren. Das zwingt Linux, auf die neue Konfiguration zu achten. Hier ist meine aktuelle Konfigurationsdatei für die Netzwerkschnittstelle in /etc/netplan/ Verzeichnis:

$ less /etc/netplan/50-cloud-init.yaml
# This file is generated from information provided by
# the datasource.  Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        enp0s3:
            addresses: []
            dhcp4: true
    version: 2

Die 50-cloud-init.yaml Datei enthält eine sehr einfache Schnittstellendefinition. Aber es enthält auch einige wichtige Informationen zum Deaktivieren der Konfiguration in den Kommentaren. Dazu verschiebe ich in die /etc/cloud/cloud.cfg.d Verzeichnis und erstellen Sie eine neue Datei namens 99-disable-network-config.cfg und fügen Sie das Netzwerk hinzu:{config:disabled} Zeichenfolge.

Obwohl ich diese Methode nicht auf anderen Distributionen als Ubuntu getestet habe, sollte sie auf jeder Linux-Variante mit systemd funktionieren (was fast alle sind). Was auch immer Sie verwenden, Sie erhalten einen guten Einblick in das Schreiben und Testen von udev-Konfigurationsdateien.

Als nächstes muss ich einige Systeminformationen sammeln. Ausführen der ip Befehl meldet, dass meine Ethernet-Schnittstelle enp0s3 heißt und seine MAC-Adresse ist 08:00:27:1d:28:10 :

$ ip a
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:1d:28:10 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.115/24 brd 192.168.0.255 scope global dynamic enp0s3

Jetzt erstelle ich eine neue Datei namens peristent-net.rules in /etc/udev/rules.d Verzeichnis. Ich werde der Datei einen Namen geben, der mit einer niedrigen Zahl beginnt, 10:

$ cat /etc/udev/rules.d/10-persistent-network.rules
ACTION=="add", SUBSYSTEM=="net",ATTR{address}=="08:00:27:1d:28:10",NAME="eth3"

Je niedriger die Zahl, desto früher wird Linux die Datei ausführen, und ich möchte, dass diese Datei früher ausgeführt wird. Die Datei enthält Code, der den Namen eth3 ergibt zu einem Netzwerkgerät, wenn es hinzugefügt wird – solange seine Adresse mit 08:00:27:1d:28:10 übereinstimmt , das ist die MAC-Adresse meiner Schnittstelle.

Sobald ich die Datei gespeichert und den Computer neu gestartet habe, sollte mein neuer Schnittstellenname im Spiel sein. Möglicherweise muss ich mich direkt bei meiner virtuellen Maschine anmelden und dhclient verwenden um Linux manuell dazu zu bringen, eine IP-Adresse in diesem neu benannten Netzwerk anzufordern. Das Öffnen von SSH-Sitzungen ist möglicherweise nicht möglich, ohne dies zuerst zu tun:

$ sudo dhclient eth3

Erledigt. Sie können also jetzt udev zwingen, Ihren Computer dazu zu bringen, auf eine NIC so zu verweisen, wie Sie es möchten. Aber noch wichtiger ist, dass Sie die Tools haben, um herauszufinden, wie Sie alle verwalten können fehlerhaftes Gerät.


Linux
  1. Verwenden Sie lspci unter Linux, um Ihre Hardware anzuzeigen

  2. Überwachen Sie Ihr Linux-System in Ihrem Terminal mit procps-ng

  3. Scannen Sie Ihre Linux-Sicherheit mit Lynis

  4. Linux-Befehle zum Anzeigen Ihrer Hardwareinformationen

  5. Verwalten von Partitionen unter Linux mit fdisk

Würzen Sie Ihren Linux-Desktop mit Cinnamon

Modernisieren Sie Ihren Linux-Desktop mit Enlightenment

Schwimmen Sie mit asciiquarium an Ihrem Linux-Terminal

Finden Sie Informationen zur Linux-Systemhardware mit Hwinfo

So überwachen Sie Ihre Linux-Server mit Checkmk

Verwalten Sie Ihre Server mit Cockpit Linux