Gibt es Alternativen zu "udev"?

16

Während ich die Größe von udev verstehe und die Bemühungen der Entwickler schätze, habe ich mich nur gefragt, ob es eine Alternative dazu gibt.

Ich könnte mir zum Beispiel vorstellen, dass es eine Möglichkeit geben sollte, ein Startskript zu erstellen, mit dem die meisten Geräteknoten erstellt werden, die auf meinem System (keine Änderung der Hardware) sowieso am gleichen sind.

Der Vorteil oder Grund, den ich überspringen udevmöchte, ist derselbe wie beim Überspringen dbus, nämlich die Reduzierung der Komplexität und dadurch die Erhöhung meiner Änderungen, um das System sicherer einzurichten.

Mensch und Frieden
quelle

Antworten:

23

Es gibt verschiedene Alternativen zu udevda draußen. Anscheinend kann Gentoo etwas benutzen, das man nennt mdev. Eine andere Möglichkeit wäre der Versuch, udevden Vorgänger zu verwenden devfsd. Schließlich können Sie immer alle Gerätedateien erstellen, die Sie benötigen mknod.

Beachten Sie, dass bei letzterem nicht alles beim Booten erstellt werden muss, da die Knoten auf der Festplatte und nicht wie bei den anderen Optionen in einem temporären Dateisystem erstellt werden können. Natürlich verlieren Sie die Flexibilität, Gerätedateien dynamisch zu erstellen, wenn neue Hardware (z. B. ein USB-Stick) angeschlossen wird. Ich glaube, der Standardansatz in dieser Ära war, dass alle Gerätedateien, die Sie vernünftigerweise benötigen, bereits erstellt wurden /dev(dh viele Gerätedateien).

Natürlich ist die Schwierigkeit, einen dieser Ansätze in einer modernen Distribution zum Laufen zu bringen, wahrscheinlich ziemlich groß. Das Gentoo-Wiki erwähnt Schwierigkeiten beim mdevArbeiten mit einer Desktop-Umgebung (geschweige denn außerhalb von Gentoo). Die letzte devfsdVeröffentlichung war 2002, ich habe keine Ahnung, ob es überhaupt mit modernen Kerneln funktionieren wird. Das manuelle Erstellen der Knoten ist wahrscheinlich der sinnvollste Ansatz, aber selbst das Deaktivieren udevkönnte eine Herausforderung darstellen, insbesondere bei der Verwendung von Distos systemd( udevist jetzt Teil von systemd, was auf eine starke Abhängigkeit hindeutet).

Mein Rat ist dabei zu bleiben udev;)

Graeme
quelle
1
Vielen Dank! Tolle Antwort, die sich mit den meisten, wenn nicht allen Aspekten der Frage befasste und voller Informationen war! Ich
humanityANDpeace
udevsollte ohne einwandfrei funktionieren systemd- beide sind nur innerhalb der gleichen Code-Basis entwickelt, udevkönnen aber unabhängig davon erstellt und ausgeführt werden.
Elias Probst
@Elias gibt es natürlich udevschon viel länger als systemdeh und je. Die Frage ist, kann man systemdohne arbeiten udev? Ich vermute, dass Sie zumindest mit einer --without-udevOption neu kompilieren müssten .
Graeme
2
@Graeme: Nein, das kann es nicht. Es ist ein bisschen wie der Versuch, die Komplexität eines Autos durch Entfernen der Räder zu reduzieren. Wenn Sie gut mit systemd booten können (was viel bewirkt ), sich aber ernsthafte Sorgen über die Komplexität von udev machen (was immer weniger bewirkt), sind die Dinge wirklich verwirrt.
Grawity
@grawity Guter Punkt, aber vielleicht geht es mir gar nicht so gut, wenn ich dann mit systemd für init boote! Ich muss es mir ansehen
humanityANDpeace
22

Moderne Linux-Kernel unterstützen das devtmpfsDateisystem (nicht zu verwechseln mit dem alten devfs) , das alle Geräteknoten dynamisch erstellt, sobald der Kernel sie erkennt. (Tatsächlich erfordern die neuesten udevVersionen dies. Sie werden feststellen, dass udev keine Geräteknoten mehr erstellt, sondern nur noch Symlinks.)

Ebenso wurde das Laden der Firmware in den Kernel verlagert, sodass die einzigen verbleibenden Aufgaben udevdas Laden von Modulen (entsprechend den Modalitäten) und das Anwenden von Geräteberechtigungen und anderen udev-Regeln sind.

Theoretisch sollte ein vollständig monolithischer Kernel also einwandfrei ohne udev booten .

Das eigentliche Problem hierbei ist jedoch, was später passiert.

  1. Nicht wenige Userspace-Programme verlassen sich darauf, dass udev seine Gerätedatenbank verwaltet, auf die über zugegriffen werden kann libudev. Während das Auflisten von Geräten und das Abhören von hinzugefügten / entfernten Ereignissen direkt über die Kernel-Schnittstellen (sysfs und netlink) erfolgen kann, bleiben Ihnen immer noch alle Metadaten ohne, die verschiedene udev-Regeln angefügt haben.

  2. udev - Regeln auch verschiedene "persistent" Symlinks in aufrechtzuerhalten /dev/disk/by-*, /dev/mapper, /dev/input/by-path, /dev/snd/by-path, und so weiter. Wenn Sie beispielsweise zwei Festplatten angeschlossen haben, gibt es keine Garantie, dass die erste immer sdaoder ist sdb, aber udev stellt sicher, dass die Symlinks in /dev/disk/by-uuidweiterhin auf die richtige verweisen.

  3. Obwohl Geräteknoten jetzt vom Kernel erstellt werden und daher nicht mehr Ihr Anliegen sind, ist es dennoch wichtig zu beachten, dass einige Gerätetypen dynamisch zugewiesene Haupt- / Nebennummern verwenden, obwohl Sie heute /dev/fuse10.228 und /dev/hpet10.229 haben nach jedem Neustart unterschiedliche Nummern haben, daher ist entweder devtmpfsoder (auf älteren Systemen) ein Programm erforderlich , das Ereignisse abhört .

Viele dieser Dinge könnten leicht von anderen Programmen erledigt werden, wie mdevnatürlich. Mein Punkt ist, dass ein statisches /etc/MAKEDEVSkript nicht mehr funktionieren wird ...


Wenn es also um die Boot-Komplexität geht, ist udev mit ziemlicher Wahrscheinlichkeit das geringste Problem für Sie.

Grawity
quelle
Interessant, wissen Sie, welche Kernelversion die dynamische Erstellung von Knoten einführt?
Graeme
2
@Graeme: Ungefähr 2.6.32 .
Grawity
12

Es gibt verschiedene Alternativen:

  • Hat einfach eine Reihe von geeigneten chmod, chown, ln, und ähnlichen Befehlen in einem Skript , das als Teil des Bootstrap ausgeführt wird.
  • Verwenden Sie systemd-udevden Plug-and-Play-Manager, der Teil des systemd-Projekts ist.
  • Verwenden Sie Gentoo'seudev , eine Abzweigung, systemd-udevvon der systemd jetzt erheblich abgewichen ist.
  • Verwenden Sie Devuan'svdev , einen Plug-and-Play-Manager, der von Jude Nelson entwickelt wurde und Teil von Devuan ist.
  • Verwenden Sie mdev, was im Gegensatz zu einer anderen Antwort keine Gentoo-Sache ist. Es ist der Plug-and-Play-Manager, der in BusyBox integriert ist .
  • Verwenden Sie Sucklessmdev , einen Plug-and-Play-Manager, der von Dimitris Papastamos entwickelt wurde.
  • Verwenden Sie Laurent Bercotmdevd , der mit der BusyBox-Konfiguration kompatibel ist mdev, jedoch eine eigene Socket-Behandlung durchführt und das LISTEN-Protokoll nicht versteht.

Abgesehen von der ersten sind für alle Regeln erforderlich, die beschreiben, wie auf Kernelbenachrichtigungsereignisse für Geräte zu reagieren ist. Offensichtlich.

Es gibt auch Tools, die Programme verwenden, für die sie entwickelt wurden /proc/sys/kernel/hotplug, wie z. B. die beiden mdevs, und die sie anpassen und serialisieren, indem sie einen Netlink-Socket abhören und diese Programme dann erzeugen:

JdeBP
quelle
6

udev? Die beste Alternative ist, es nicht zu benutzen. Und wenn Sie lernen, wie man es nicht benutzt, werden Linux und die * NIX-Welt logischer.

Die beste langfristige Alternative ist die Verwendung statischer Geräte (siehe Hinweis). Wenn Sie den Treiber haben, verwaltet der Linux-Kernel das Hot-Plugging. Ich bevorzuge es, nie udevd laufen zu lassen.

dbus ist eine andere sache. Es verlangsamt Ihr System, aber die sich ständig verändernde Welt der Script-Leute liebt es. Viele Dinge, an die Sie gewöhnt sind, wie z. B. Webbrowser oder Anwendungen mit Skript-Backends, müssen repariert werden (gestartet oder neu erstellt werden, ohne dass das Zeug vorhanden ist, oder für eine andere Anwendung gespeichert werden muss).

Hinweis: Wenn Sie nur ein Flash-Laufwerk oder ein DVD-Gerät anschließen, verwenden Sie dmesg|tail, um den Namen des anzuhängenden Geräts anzuzeigen. Zu lernen, wann ein Gerät ein Charakter oder ein Blockgerät ist, ist grundlegendes Systemwissen in der Welt der Computerhardware. In Linux ist es Open Source, lesen Sie viel über Linux, nicht nur eingebettet . Dies ist das Beste für ein umfassenderes Verständnis der einfachen Logik (nicht der Philosophie) aller * NIXs wie Linux (Solaris, HPUX, AIX usw.).

Udev, dbus, gconf / dconf, systemd, gnome-shell, gnome, glib, mono und fedora sind für menschen mit viel zeit auf der hand, die kein rtfm können oder ein automatisch aktualisiertes wirklich schickes aber langsameres wollen als Melasse, Buggy, auf halbem Weg dahin Linux. (Ein wirklich schrecklicher Ort, schauen Sie sich im Internet nach Unmengen ähnlicher Erlebnisse um).

Das System bootet dann mit udevd. Es wird jedoch behauptet, dass udev notwendig ist, da will changebeim Neustart kleinere Gerätenummern vorhanden sind . Udevs Daseinsberechtigung scheint sich auf Schritt und Tritt zu widersprechen. Und wo sich die Dateien befinden, scheint immer falsch zu sein, egal wen Sie konsultieren. Traue oder freedesktop.org nicht.

Abgesehen davon, dass udev von diesem als systemd bekannten Horror erfasst wird, weiß ich nicht, was man mit einem / etc / udev-Müll macht. Und es ist verrückt zu sagen, dass das Schreiben von udev-Regeln irgendwie besser ist als alles andere. Die Gentoo-Leute scheinen daran festhalten zu wollen und müssen nicht systemd haben, also haben sie es auf eudev geschoben.

Wenn Sie ein unglaublich schnelles System ohne böse Überraschungen wollen, sollten Sie die Linux-Grundlagen verwenden.

Ginleagh
quelle
6
Dies ist eher ein Schimpfen als eine Antwort ...
Jasonwryan
2
@jasonwryan etwas ja, es gibt immer noch einen gewissen Wert, da es einige Möglichkeiten zur manuellen Bearbeitung dieser Aufgaben empfiehlt, die normalerweise in der udevFunktionalität behandelt werden. Es ist in gewisser Weise auch in Ordnung, die Stärken dieses alternativen Ansatzes herauszustellen .
humanityANDpeace
1
Upvoted dies. Das Grundprinzip ist, dass ich zwar völlig einverstanden bin, dass der Stil von manchen als unangemessen angesehen wird, aber seine Vorzüge hat. Auch wenn er nicht wirklich hilfreich ist, neige ich dazu, ihn als sachlich zu akzeptieren. In Kernel 4.x benennt udev die Ethernet-Schnittstellen nach dem Zufallsprinzip um. WAS ?!
Victor
Sie können sich bei der dauerhaften Benennung von Geräten nicht auf den Kernel verlassen. Zumindest gibt dir udev die Kontrolle darüber.
Emmanuel