Welche Probleme löst udev tatsächlich?

28

Was genau stimmte überhaupt nicht mit einer Reihe statischer Dateien /dev? Es ist anscheinend nicht zufriedenstellend genug, dass Entwickler dieses Rad jetzt dreimal neu erfunden haben ( devfs-> udev + HAL-> udev), und jetzt geht es anscheinend auch in das Grand Unified Init-Programm, also viermal.

Ich erinnere mich, als ich vor Jahren mit Linux anfing, war ich überrascht, dass es trotz der Behauptung, dass "alles eine Datei ist", keine gibt /dev/eth0(was später Sinn machte, da es sich nicht um ein Zeichen- oder Blockgerät handelt - obwohl es sich um einen "Paket" -Gerätetyp handelt wäre interessant...). Warum ist das Programm, das den char- und block device-Dateibaum verwaltet, dann auch für Netzwerkgeräte verantwortlich? Ich habe vage Verweise auf "Flexibilität" gesehen, aber was fügt dies zu dem hinzu, was ifconfig (8) tut, wenn man nur nachschaut /proc/net/dev? Ich weiß zum Beispiel, dass NetworkManager nicht in naher Zukunft in Net oder OpenBSD verfügbar sein wird, da es davon abhängt udev, welche Teams nicht schreiben wollen. was ich nicht '/devDas sind bereits mehrere Wege durch den Kernel (und keiner von ihnen in /dev!).

Liegt es nur am Hotplugging? Gab es Probleme damit, dass der Kernel nur die physischen Busse abhörte und die entsprechenden Module auf eine Meldung "Gerät hinzugefügt" lud? Oder, Gott bewahre, der eigentliche Administrator, der das tut? Ich erinnere mich, dass meine Server in den frühen 2000er Jahren manchmal ihre Netzwerkkarten in einer unerwarteten Reihenfolge initialisierten, und ich nehme an, dass es Sinn macht, diese Benennung im Userland festzulegen (obwohl es damals nicht besonders schwer zu beheben war), aber Das scheint ein Vorschlaghammer für eine Kakerlake zu sein. (Oder vielleicht trifft dieses Problem auf Anwendungsfälle, über die ich nicht viel mehr nachdenke als Server oder PCs, die nach meiner Erfahrung in einem Rack installiert sind.)

Um meine Frage klar zu formulieren: Welche Probleme löst udev tatsächlich, und wie haben devfs, HAL und / oder eine einfache alte Datei diese Probleme nicht gelöst? Gibt es einen besonderen Grund dafür, dass viele verschiedene Dinge (Hotplugging, allgemeine Geräteverwaltung, Netzwerkgeräteverwaltung, Gerätenamen, Treiberpriorität usw.) ein Programm sind?

Bandrami
quelle
5
Ihre Überlegungen sind gut für einen Systemadministrator, der mit Servern umgeht, jedoch nicht die Anforderungen von Laptop-, typischen modernen Desktop- oder mobilen Benutzern erfüllt. Statische Dateien in /devadressieren nicht (einfach oder bequem) Dinge wie eine Person, die einen USB-Netzwerkadapter einsteckt, oder virtuelle Netzwerkadapter, die hinzugefügt oder heruntergefahren werden, während das System läuft. Nichts hindert Sie jedoch daran, das Programm zu deinstallieren udevund zur normalen statischen /devVerzeichnisroute zurückzukehren.
LawrenceC
Ursprünglich gab es konkurrierende devfs-Implementierungen. Es sind also mehr als drei ... (Obwohl ich nicht glaube, dass Sie udev + HAL als eins zählen können.)
Derobert

Antworten:

33

Zwei weitere Dinge: Der Einstieg von Linux in Unternehmen und andere große Server führte dazu, dass statische Aufladungen beschädigt wurden /dev. Die Weiterentwicklung der Technologie sowohl im Consumer- als auch im Enterprise-Bereich machte Static / Dev zum Scherz. [Diese Antwort füllt einen größeren Teil der Hintergrundgeschichte aus, insbesondere nicht, warum devfs durch udev ersetzt wurde].

Erschöpfung des Major & Minor Number Space

/devDateien werden im Kernel anhand ihrer Haupt- und Nebennummern identifiziert. Der Kernel hat sich nie wirklich um den Namen gekümmert (und Sie könnten es zum Beispiel, mv /dev/sda /dev/disk-1und es würde weiterhin funktionieren - obwohl Programme natürlich nicht wissen würden, wo sie ihn finden können).

Mit einer statischen /devNummer müssen Sie jedem potenziellen Gerät, das möglicherweise vorhanden ist, eine Haupt- / Nebenstellennummer zuweisen. Diese Nummern müssen global eindeutig sein, da sie als Teil von Distributionen versendet werden und nicht nach Bedarf erstellt werden. Das Problem ist, dass es sich jeweils um 8-Bit-Zahlen handelt. Der Bereich liegt zwischen 0 und 255.

Ursprünglich begann Linux beispielsweise mit 8,0 als sda, 8,1 als sda1, 8,16 als sdb usw. Aber die Leute fügten immer mehr Festplatten zu Maschinen hinzu, besonders wenn man Dinge wie Fibre Channel in Betracht zog. Irgendwann kamen also die Hauptnummern 65–71 für mehr Festplatten hinzu. Später Hauptnummern 128-135. Und doch wollten die Leute immer mehr Festplatten ...

Partitionstabellenformate wie GPT kamen auf den Markt und unterstützten mehr Partitionen pro Festplatte. Und natürlich fraßen andere Geräte durch den Nummernraum: verschiedene RAID-Controller, logische Datenträgerverwaltung usw.

Das Endergebnis ist in der LANANA Linux Device List zu sehen . Wenn Sie sich die 2.6-Liste ansehen (die einzige, die noch vorhanden ist), werden viele der Block-Hauptnummern bis 200 (max: 255) verwendet. Offensichtlich wären die Zahlen ausgegangen.

Zu größeren Nummern zu wechseln war nicht einfach. Es ändert den Kernel ABI. Je nach Dateisystem ändert sich das Layout der Festplatte. Aber natürlich gab es die meisten dieser Geräte nicht auf einem System, und selbst auf einem, dem (zum Beispiel) die SCSI-Festplatten ausgegangen waren, gab es wahrscheinlich viele kostenlose Dinge - es war wahrscheinlich keine IBM XT-Festplatte erforderlich. beispielsweise.

Mit einer Dynamik /devmuss die Distribution die Gerätenummern nicht versenden. Sie müssen nicht mehr global eindeutig sein. Sie müssen nicht einmal über Stiefel hinweg einzigartig sein.

Gerätenamen waren nicht vorhersehbar

Früher war es ganz einfach, alles mit einer Nummer zu versehen. Eine Karte hatte zwei IDE-Kanäle; Jeder IDE-Kanal unterstützt einen Master und einen Slave. Sie können in Kanalreihenfolge und Master-dann-Slave-Reihenfolge zuweisen. So hdawird erster Kanal, Meister; hdberster Kanal, Sklave; hdczweiter Kanal, Master; etc. Die waren vorhersehbar und stabil. Sie können sich ändern, wenn Sie ein neues Laufwerk hinzufügen oder entfernen, aber ohne Hardwareänderung waren sie statisch.

Sie könnten setzen /dev/hda1in Ihrem /etc/fstabund sicher sein , es Arbeits bleiben würde, zumindest nicht anwesend Hardware - Änderungen.

IDE hat so funktioniert. Nichts danach.

SATA scheint einfach zu sein: ein Port, eine Festplatte. Aber nicht so; Es erlaubt Port-Multiplikatoren. Und es ermöglicht Hot-Swap. Trotz fehlender Hardware-Änderungen können Sie das Mapping weiterhin verwenden.

USB ist viel schlimmer. Es erlaubt nicht nur Hot-Swap, es ist typisch. Die Leute stecken ständig USB-Sticks ein. Außerdem kann die Prüfung von Geräten eine Weile dauern - und sie können sich ändern, wann immer sie möchten (z. B. wenn Sie den USB-Speichermodus Ihres Telefons aktivieren oder deaktivieren). Firewire ist ähnlich. Mit beidem können Sie sich wirklich keine stabile Zuordnung einfallen lassen.

An das Netzwerk angeschlossene Festplatten haben keine inhärente Anschlussreihenfolge. Die einzige Reihenfolge, die der Kernel verwendet, ist die Reihenfolge, in der sie angezeigt wurden. Gleiches gilt für logische Volumes.

Das Streben nach Startgeschwindigkeit verschlimmerte die Situation ebenfalls. Ursprünglich saß der Kernel gerne herum und wartete ziemlich lange, bis z. B. alle USB-Geräte initialisiert waren. Vollständige Überprüfung aller SCSI-Busse usw. Diese Überprüfungen wurden für Hintergrundaufgaben durchgeführt. Boot würde nicht länger auf sie warten. Die Geräte werden hinzugefügt, sobald die Tests abgeschlossen sind.

So blieb dem Kernel mehr oder weniger "in welcher Reihenfolge sie auch auftauchen". Dies bedeutete, dass viele Arten von Geräten die Reihenfolge bei jedem Start ändern können und müssen - was sich auf einem Start /dev/sdbbefand, befand sich auf einem anderen Start /dev/sdc. Das macht die Idee einer Statik zu /deveinem Witz.

Zusammenfassung

Wenn Sie die Kombination aus statischer /devAufladung nehmen, die aufgrund unvorhersehbarer Reihenfolge der Geräteprüfungen immer bedeutungsloser wird, und weiterhin statische Haupt- / Nebenzahlen zuweisen, die zu erheblicher Arbeit führen, wird deutlich, warum Linux-Entwickler auf dynamische Aufladung umsteigen /dev.

derobert
quelle
2
Die Einrichtung von USB-Druckern war in der Vergangenheit sehr mühsam, da lsusb -vvich immer danach suchen musste, wo meine Drucker von Start zu Start versteckt waren. Ich müsste nach solchen Bits suchen: "Bus 001 Gerät 003: ID 04f9: 0217"
slm
24

Gute Frage.

In gewisser Weise könnte dieses Argument umgedreht werden: Seit Kernel 2.6.13 eine neue Version von eingeführt hat uevent, musste zwangsläufig eine neue Version devfsgeschrieben werden, um die neuen Funktionen der Benutzeroberfläche nutzen zu können. In gewisser Weise sollte die Frage also lauten, warum sich der Kernel geändert hat.

Unter Berücksichtigung des Nennwerts wird Ihre Frage jedoch in dem Artikel dieser Wikipedia beantwortet :

Im Gegensatz zu herkömmlichen Unix-Systemen, bei denen die Geräteknoten im Verzeichnis / dev ein statischer Satz von Dateien waren, stellt der Linux-Gerätemanager udev dynamisch nur die Knoten für die Geräte bereit, die tatsächlich auf einem System vorhanden sind. Obwohl devfs eine ähnliche Funktionalität zur Verfügung stellte, führte Greg Kroah-Hartman eine Reihe von Gründen an, die die Implementierung gegenüber devfs vorzogen:

1) udev unterstützt die dauerhafte Benennung von Geräten, die beispielsweise nicht von der Reihenfolge abhängt, in der die Geräte an das System angeschlossen sind. Das Standard-Setup von udev bietet dauerhafte Namen für Speichergeräte. Jede Festplatte wird durch ihre eindeutige Dateisystem-ID, den Namen der Festplatte und den physischen Speicherort auf der Hardware erkannt, mit der sie verbunden ist.

2) udev wird im Gegensatz zum devfs-Kernelraum vollständig im User-Space ausgeführt. Eine Konsequenz ist, dass udev die Namensrichtlinie aus dem Kernel verschoben hat und beliebige Programme ausführen kann, um aus den Geräteeigenschaften einen Namen für das Gerät zu erstellen, bevor der Knoten erstellt wird. Dort ist der gesamte Prozess auch unterbrechbar und läuft mit einer niedrigeren Priorität.

Ich sollte wohl hinzufügen, dass mit udev die Möglichkeit eines race condition, die Benennung von Geräten in devfs und hotplug grundsätzlich untergrabenen, vermieden wird. Mit anderen Worten: Mit devfs konnte nicht sichergestellt werden, dass der Ethernet-Port ganz links eth0und ganz rechts aufgerufen wurde eth1, was die Einrichtung von Routern (ein Port zum WAN, ein Port zum LAN) schwierig machte implementieren.

Die Übernahme des auf der GUID basierenden Benennungsschemas für Festplatten ist ein weiteres Plus und die Verlagerung des gesamten Vorgangs in den Benutzerbereich noch umfangreicher: Haben Sie auf dieser Website nachgefragt, wie viele Personen ihre eigenen udev-Regeln schreiben?

Überprüfen Sie als einfaches Beispiel für die Vorteile von udev im Benutzerbereich entweder diese oder diese andere Frage auf dieser Website.

MariusMatutiae
quelle