Ulrich Dangel erklärt sehr gut den Unterschied zwischen devtmpfs und udev.
Was ist mit sysfs?
Ich verstehe, dass der Kernel sysfs verwendet, um Geräteknoten in den Benutzerbereich zu exportieren, die von udev verwendet werden. Also sind devtmpfs und sysfs gleich? Wenn ja, warum verwenden sie unterschiedliche Namen? Wenn nein, was ist der wirkliche Unterschied zwischen sysfs und devtmpfs?
Akzeptierte Antwort:
Der Kernel verwendet sysfs, um Geräteknoten in den Benutzerbereich zu exportieren, die von udev verwendet werden
Nein. Sysfs enthält keine Geräteknoten. Sysfs enthält hauptsächlich Dateien, die Informationen über Geräte bereitstellen, sowie einige Dateien, die es Prozessen ermöglichen, den Betrieb von Geräten zu steuern. Aber zum größten Teil können Geräte nicht über das verwendet werden, was sysfs bereitstellt.
Nehmen wir zum Beispiel eine Festplatte. Es gibt irgendwo unter /sys/devices
ein Verzeichnis dafür , mit einem Pfad, der davon abhängt, wie es mit dem Computer verbunden ist (z. B. /sys/devices/pci0000:00/…
für eine Festplatte, die mit einem Controller verbunden ist, der mit dem primären PCI-Bus des Computers verbunden ist). In diesem Verzeichnis finden Sie verschiedene Informationen wie Größe, ob es entfernbar ist, seinen Energiezustand usw. Es gibt auch Unterverzeichnisse für Partitionen. Aber da ist nichts drin, was den Zugriff auf den Inhalt der Festplatte ermöglicht. An anderer Stelle in /sys
, gibt es symbolische Links zu dem Verzeichnis, das dieser Festplatte entspricht:in /sys/block
, in /sys/class/block
, usw. Aber immer noch nichts, um auf den Inhalt der Festplatte zuzugreifen.
In /dev
, ist der Eintrag für das Laufwerk eine spezielle Datei – ein Blockgerät. Diese Datei ermöglicht es Prozessen, den Inhalt der Festplatte zu lesen und zu schreiben. (Obwohl das bei einer Festplatte normalerweise nicht passiert; stattdessen wird der Inhalt der Festplatte — oder einer Partition — gemountet, sodass der Kernel auf das Gerät zugreift, Prozesse nicht.)
Gerätedateien ermöglichen einige andere Vorgänge als das Lesen und Schreiben von Inhalten, die über ioctl ausgeführt werden können. Es wäre möglich, alle Informationen und Steuerschnittstellen bereitzustellen, die sysfs über ioctl in der Gerätedatei bereitstellt. Dies wäre jedoch aus mehreren Gründen weniger bequem:
- Mit separaten Dateien in
/sys
, Berechtigungen können feingranular festgelegt werden. Mit einer einzigen Datei pro Gerät in/dev
, es geht um alles oder nichts. - Separate Dateien können von Anwendungen leicht gelesen und geschrieben werden. Sie können einfach
cat
verwenden oderecho
. Mit ioctl ist es viel schwieriger:Es gibt keine Shell-Schnittstelle, oft keine Schnittstelle in anderen Hochsprachen. - Bei ioctl muss der Befehl in einer Zahl statt in einem Namen kodiert werden, und das Format der Argumente muss auf binärer Ebene definiert werden. Die Verwendung von Namen und einfachen Textformaten erleichtert das Schreiben von Software.
Umgekehrt wäre es möglich, über eine Datei in sysfs Zugriff auf den Geräteinhalt zu gewähren. Dies würde jedoch zusätzliche Arbeit im Kernel erfordern:sysfs ist hauptsächlich darauf ausgelegt, kleine Dateien und symbolische Links bereitzustellen, und das ohne ioctl
Unterstützung, die vorhandene Anwendungen erwarten. Ich glaube nicht, dass die Erweiterung von sysfs zur Unterstützung bestehender Gerätetypen einen wesentlichen Vorteil bringen würde, daher die fortgesetzte Existenz von Gerätedateien.
Sysfs wird automatisch vom Kernel gefüllt und spiegelt die tatsächlich verfügbaren Geräte in Echtzeit wider. Die Bedeutung einer Datei in sysfs ergibt sich aus ihrem Pfad, der von dem Treiber gewählt wird, der diese Datei bereitstellt. /dev
funktioniert anders:Die Bedeutung einer Datei ergibt sich aus dem Typ der Gerätedatei (Block oder Zeichen) und ihrer Major- und Minor-Nummer (das ist ls -l
Listen anstelle der Dateigröße für ein Gerät). Traditionell /dev
war statisch, mit Gerätedateien, die während der Systeminstallation erstellt wurden; aber das funktioniert nicht so gut, wenn Geräte Hotplugs können, daher der Wunsch nach einem dynamischen /dev
die verbundene Geräte in Echtzeit widerspiegelt.
Linux hat mehrere Iterationen eines dynamischen /dev
durchlaufen . Linux 2.4 hat devfs, wo der Kernel automatisch Einträge erstellt, um verbundene Geräte widerzuspiegeln. Aber das war nicht so schön, weil es die Benennungs- und Berechtigungsrichtlinien für Geräte fest in den Kernel codierte, sodass es durch das Userland-Programm udev zur Verwaltung der Richtlinien und /dev
ersetzt wurde auf einem einfachen tmpfs-Dateisystem (ein In-Memory-Dateisystem ohne besondere Bedeutung für den Kernel). Und dann feierte devfs ein teilweises Comeback mit devtmpfs, einer Instanz von tmpfs, in der Einträge für verfügbare Geräte automatisch vom Kernel erstellt werden, aber udev übernimmt darüber hinaus die gesamte Verwaltung, die es benötigt.