Obwohl ich die Großartigkeit von udev verstehe und die Bemühungen der Entwickler schätze, habe ich mich einfach gefragt, ob es eine Alternative dazu gibt.
Ich könnte mir zum Beispiel vorstellen, dass es eine Möglichkeit geben müsste, ein Startskript zu erstellen, das die meisten Geräteknoten erstellt, die auf meinem System (ohne Änderung der Hardware) ohnehin weitgehend gleich sind.
Der Vorteil oder Grund, warum ich es überspringen möchte, udev
wäre derselbe wie beim Überspringen dbus
, nämlich die Verringerung der Komplexität und dadurch die Erhöhung meiner Möglichkeiten, das System sicherer einzurichten.
Antwort1
Moderne Linux-Kernel unterstützen das devtmpfs
Dateisystem (nicht zu verwechseln mit dem alten devfs
) , das alle Geräteknoten dynamisch erstellt, sobald der Kernel sie erkennt. (Tatsächlich verwenden die neuesten udev
Versionenerforderndies; Sie werden feststellen, dass udev keine Geräteknoten mehr erstellt, sondern nur symbolische Links.)
Ebenso wurde das Laden der Firmware in den Kernel verschoben, sodass die einzigen verbleibenden Aufgaben udev
das Laden von Modulen (gemäß Modaliasen) und das Anwenden von Geräteberechtigungen und anderen Udev-Regeln sind.
Theoretisch sollte ein vollständig monolithischer KernelStiefelgeht ganz gut ohne udev.
Das wirkliche Problem besteht hier jedoch darin, was später passiert.
Viele Userspace-Programme verlassen sich darauf, dass udev seine Gerätedatenbank verwaltet, die über zugänglich ist
libudev
. Obwohl das Aufzählen von Geräten und das Abhören von Hinzufügungs-/Entfernungsereignissen direkt über die Kernelschnittstellen (Sysfs und Netlink) erfolgen könnte, fehlen Ihnen dennoch alle Metadaten, die an verschiedene udev-Regeln angehängt sind.udev-Regeln verwalten auch verschiedene „persistente“ symbolische Links in
/dev/disk/by-*
,/dev/mapper
,/dev/input/by-path
,/dev/snd/by-path
, usw. Wenn Sie beispielsweise zwei Festplatten angeschlossen haben, gibt es keine Garantie, dass die erste immersda
oder istsdb
, aber udev stellt sicher, dass die symbolischen Links in/dev/disk/by-uuid
weiterhin auf die richtige zeigen.Obwohl Geräteknoten jetzt vom Kernel erstellt werden und Sie sich daher nicht mehr darum kümmern müssen, ist es dennoch wichtig zu beachten, dass einige Gerätetypen begonnen haben, dynamisch zugewiesene Haupt-/Nebennummern zu verwenden. Obwohl Sie heute
/dev/fuse
also 10.228 und/dev/hpet
10.229 haben,Willehaben nach jedem Neustart unterschiedliche Zahlen, so dass entwederdevtmpfs
oder (auf älteren Systemen) ein Programm, das auf uevents hört,erforderlich.
Viele dieser Dinge könnten mdev
natürlich auch problemlos von anderen Programmen wie erledigt werden. Mein Punkt ist, dass ein statisches /etc/MAKEDEV
Skript nicht mehr funktionieren wird ...
Wenn es also um die Komplexität des Bootens geht, ist udev wahrscheinlich dieam wenigstenIhrer Anliegen.
Antwort2
Es gibt verschiedene Alternativen udev
. Gentoo kann anscheinend etwas verwenden, dasmdev
Eine andere Möglichkeit wäre, udev
den Vorgänger von zu verwenden devfsd
. Schließlich können Sie alle benötigten Gerätedateien jederzeit mit erstellen mknod
.
Beachten Sie, dass bei letzterem nicht alles beim Booten erstellt werden muss, da die Knoten auf der Festplatte und nicht in einem temporären Dateisystem wie bei den anderen Optionen erstellt werden können. Natürlich verlieren Sie die Flexibilität dynamisch erstellter Gerätedateien, wenn neue Hardware angeschlossen wird (z. B. ein USB-Stick). Ich glaube, der Standardansatz in dieser Ära bestand darin, jede Gerätedatei, die Sie vernünftigerweise benötigen könnten, bereits erstellt zu haben /dev
(d. h. viele Gerätedateien).
Natürlich ist es wahrscheinlich ziemlich schwierig, einen dieser Ansätze in einer modernen Distribution zum Laufen zu bringen. Das Gentoo-Wiki erwähnt Schwierigkeiten, es in mdev
einer Desktop-Umgebung zum Laufen zu bringen (ganz zu schweigen von außerhalb von Gentoo). Die letzte devfsd
Version war 2002, ich habe keine Ahnung, ob es überhaupt mit modernen Kerneln funktioniert. Das manuelle Erstellen der Knoten ist wahrscheinlich der praktikabelste Ansatz, aber selbst das Deaktivieren könnte eine Herausforderung sein, insbesondere in Distributionen, die ( ist jetzt Teil von , was auf eine starke Abhängigkeit hindeutet) udev
verwenden .systemd
udev
systemd
Mein Rat: Bleib dabei udev
;)
Antwort3
Es gibt mehrere Alternativen:
- Besitzen Sie einfach eine Reihe geeigneter
chmod
,chown
,ln
, und ähnlicher Befehle in einem Skript, das als Teil des Bootstraps ausgeführt wird. - Verwenden Sie
systemd-udev
, den Plug-and-Play-Manager, der Teil des systemd-Projekts ist. - VerwendenGentoos
eudev
, ein Fork von ,systemd-udev
von dem sich systemd mittlerweile deutlich abgewichen ist. - VerwendenDevuans
vdev
, ein von Jude Nelson entwickelter Plug-and-Play-Manager, der Teil von Devuan ist. - Verwenden Sie
mdev
, was im Gegensatz zu einer anderen Antwort kein Gentoo-Ding ist. Es ist der Plug-and-Play-Manager, der inBusyBox. - VerwendenSauglos
mdev
Dabei handelt es sich um einen Plug-and-Play-Manager, der von Dimitris Papastamos entwickelt wurde. - VerwendenLaurent Bercots
mdevd
, dessen Konfiguration mit der von BusyBox kompatibel ist,mdev
aber seine eigene Socket-Verarbeitung durchführt und das LISTEN-Protokoll nicht versteht.
Alle diese Punkte, mit Ausnahme des ersten, erfordern Regelsätze, die beschreiben, wie auf Kernel-Benachrichtigungsereignisse zu Geräten reagiert werden soll. Offensichtlich.
/proc/sys/kernel/hotplug
Es gibt auch Tools, die für entwickelte Programme (wie die beiden s) übernehmen mdev
und diese anpassen und serialisieren, indem sie auf einen Netlink-Socket hören und dann die folgenden Programme erzeugen:
- Laurent Bercots alte
s6-netlink-listener
Unds6-uevent-spawner
netlink-datagram-socket-listen
Undplug-and-play-event-handler
ausdas Nosh-Toolset
Antwort4
Das ist zwar alt, aber ich möchte meine Lösung hier für alle zusammenfassen, die vergeblich danach suchen.
Es ist nicht einfach, udev zu vermeiden. DEVTMPFS aus der Konfiguration herauszulassen, hindert den Kernel nicht daran, eine RAM-Disk auf /dev zu mounten und zu füllen. Leider erstellt es nicht die notwendigen Mount-Punkte /dev/shm und /dev/pts. Was notwendig ist, ist, devtmpfs.mount=0 zu den Boot-Argumenten hinzuzufügen.