udev und modules.conf?

09/07/2010 - 10:31 von Ole Streicher | Report spam
Hallo Gruppe,

ich versuche mich gerade (wieder) in die Device-Problematik von Linux
hereinzufinden und habe hier ein (wohl grundlegendes?)
Verstàndnisproblem:

Aus früheren Tagen weiß ich noch, dass man mittels modprobe.conf
festlegen konnte, welcher Modul zu laden ist, wenn ein bestimmtes Geràt
(über die major/minor number des /dev/geràt) angesprochen wird. So wie

alias char-major-10-219 mwave

(mal schnell aus einer herauskopiert).

Andererseits legen die udev-Regeln ja fest, welches /dev/geràt zu
erzeugen ist, wenn man ein Modul làdt.

Das scheint mir ein Henne-und-Ei-Problem zu sein: solange /dev/geràt
nicht vorhanden ist, kann ich es nicht ansprechen, und so lange wird per
modprobe kein Modul geladen. /Dev/geràt wird aber erst angelegt, wenn
das Modul geladen wird. Und neuerdings werde major/minor-Nummer ja auch
erst dynamisch vergeben, sodass man gar keine feste modprobe.conf-Regel
mehr formulieren kann.

Wo ist hier mein Denkfehler? Ist modprobe.conf eventuell inzwischen
durch udev obsolet geworden und wird in den aktuellen Distributionen nur
noch für die Folklore gehalten?

Viele grüße

Ole
 

Lesen sie die antworten

#1 Thomas Bächler
09/07/2010 - 11:20 | Warnen spam
Am 09.07.2010 10:31, schrieb Ole Streicher:
Das scheint mir ein Henne-und-Ei-Problem zu sein: solange /dev/geràt
nicht vorhanden ist, kann ich es nicht ansprechen, und so lange wird per
modprobe kein Modul geladen. /Dev/geràt wird aber erst angelegt, wenn
das Modul geladen wird. Und neuerdings werde major/minor-Nummer ja auch
erst dynamisch vergeben, sodass man gar keine feste modprobe.conf-Regel
mehr formulieren kann.



Ich habe mir eben diese Frage vor über einem halben Jahrzehnt gestellt
und bin damals zu einem nicht ganz klaren "Ja" gekommen.

Nein, weil: Physikalische Geràte können auf diese Weise nicht (mehr)
entdeckt werden (das ist alles zu dynamisch, inklusive der Vergabe der
Major/Minor-Nummern). Der "richtige" Weg ist, dass die Module für im
Computer eingebaute Geràte sowieso beim Hochfahren geladen werden
(Stichwort: modalias) und die Geràtedateien somit da sind.
Fazit: Automatisches Laden von Modulen, die an ein physikalisches Stück
Hardware gebunden sind, sollte nicht über statische
'char/block-major-A-B'-Aliase erledigt werden, sondern von udev über
modalias beim Hochfahren bzw. Anschließen erledigt werden.

Ja, weil: Geràte, die nicht an ein physikalisches Geràt gebunden sind
(man denke an tun, fuse, loop) werden ja nicht "entdeckt". In diesem
Fall besteht das von dir erwàhnte Henne-Ei-Problem definitiv.

Nun sind seitdem einige Jahre vergangen. In aktuellen Distributionen
wird /lib/udev/devices/ angelegt, das beim Hochfahren nach /dev/
übernommen wird. Dort könnten solche "virtuellen" Geràte wieder statisch
eingetragen werden, um das automatische Laden der Module wieder zu
ermöglichen (ist bei mir für die oben genannten fuse, loop und tun der
Fall).

(Folgenden Abschnitt habe ich nur mal so aufgeschnappt und noch nicht im
Detail recherchiert, es könnte sich also gut um ein Hirngespinst
meinerseits handeln):
Und in naher Zukunft (2.6.35 iirc) wird der Kernel wohl solche
virtuellen Geràte von sich aus anpreisen, sodass z.B. loop, obwohl es
als Modul gebaut und nicht geladen ist, seine Geràtedatei per modalias
ankündigt - somit wàre das Henne-Ei-Problem vollstàndig gelöst, weil
udev damit wieder über alles Bescheid wüsste.

Wo ist hier mein Denkfehler? Ist modprobe.conf eventuell inzwischen
durch udev obsolet geworden und wird in den aktuellen Distributionen nur
noch für die Folklore gehalten?



modprobe.conf ist für sehr viele andere Dinge gut, vor allem zum Setzen
von Moduloptionen. Die 'char/block-major-A-B'-Aliase sind nur ein
winziger Teil der Funktionalitàt.

Viele Aliase (inklusive der hier thematisierten Major/Minor-Aliase) sind
mittlerweile als Metadaten in den Modulen selber enthalten, sodass sie
so oder so nicht mehr in modprobe.conf eingetragen werden müssen oder
sollen. Mit aktuellen Kernels und Tools kann man die modprobe.conf
standardmàßig komplett leer lassen - in meinem Fall enthàlt sie nurnoch
von mir selber eingetragene Optionen, die spezifisch zu meinem System
sind. Von Distributionsseite steht hier eine leere Datei.

Ein Beispiel:

$ modinfo loop|grep ^alias
alias: block-major-7-*
$ modinfo fuse|grep ^alias
alias: devname:fuse
alias: char-major-10-229

Diese Eintràge werden von modprobe so interpretiert als stünde das
entsprechende Alias in modprobe.conf.

HTH

Ähnliche fragen