Warum haben spezielle Gerätedateien Inodes?

11

Gerätedateien sind keine Dateien an sich. Sie sind eine E / A-Schnittstelle zur Verwendung der Geräte in Unix-ähnlichen Betriebssystemen. Sie verwenden keinen Speicherplatz auf der Festplatte, verwenden jedoch weiterhin einen Inode, wie vom statBefehl gemeldet :

$ stat /dev/sda
      File: /dev/sda
      Size: 0               Blocks: 0          IO Block: 4096   block special file
Device: 6h/6d   Inode: 14628       Links: 1     Device type: 8,0

Verwenden Gerätedateien physische Inodes im Dateisystem und warum benötigen sie diese überhaupt?

Direprobs
quelle
2
Der Inode und die Daten sind die Datei. Ohne Inode haben Sie keine Datei. (
Gerätedateien

Antworten:

16

Die kurze Antwort lautet, dass dies nur dann der Fall ist, wenn Sie über ein physisches Dateisystem verfügen /dev(und wenn Sie eine moderne Linux-Distribution verwenden, tun Sie dies wahrscheinlich nicht).

Die lange Antwort lautet:

Dies alles geht auf die ursprüngliche UNIX-Philosophie zurück, dass alles eine Datei ist. Diese Philosophie ist Teil dessen, was UNIX so vielseitig gemacht hat, da Sie direkt mit Geräten aus dem Benutzerbereich interagieren können, ohne dass in Ihrer Anwendung spezieller Code erforderlich ist, um direkt mit der physischen Hardware zu kommunizieren.

Ursprünglich /devwar es nur ein weiteres Verzeichnis mit einem bekannten Namen, in dem Sie Ihre Gerätedateien ablegen. Einige UNIX-Systeme verfolgen diesen Ansatz immer noch (ich glaube, OpenBSD tut dies immer noch), und Sie können normalerweise feststellen, ob ein System so ist, da es viele Gerätedateien für Geräte enthält, über die das System nicht verfügt (z. B. Dateien für alle mögliche Partition auf jeder möglichen Festplatte). Dies spart Speicherplatz und Zeit beim Booten auf Kosten der Verwendung von etwas mehr Speicherplatz, was für frühe Systeme ein guter Kompromiss war, da sie im Allgemeinen sehr speicherbeschränkt und nicht sehr schnell waren. Dies wird allgemein als statisch bezeichnet /dev.

Auf modernen Linux-Systemen (und ich glaube auch an FreeBSD und möglicherweise neueren Versionen von Solaris) /devhandelt es sich um ein temporäres In-Memory-Dateisystem, das vom Kernel gefüllt wird (oder udev, wenn Sie Systemd verwenden, weil sie dem Kernel nicht vertrauen, fast alles zu tun). . Dies spart Speicherplatz zum Preis von etwas Speicher (normalerweise weniger als ein paar MB) und einen sehr geringen Verarbeitungsaufwand. Es hat auch eine Reihe anderer Vorteile, wobei einer der größten darin besteht, dass es einfacher ist, Hot-Plug-Hardware zu erkennen. Dies wird allgemein als dynamisch bezeichnet /dev.

In beiden Fällen wird auf Geräteknoten jedoch über die reguläre VFS-Schicht zugegriffen, was per Definition bedeutet, dass sie über einen Inode verfügen müssen (auch wenn es sich um einen virtuellen handelt, der nur vorhanden ist, damit solche Dinge wie vorgesehen stat()funktionieren. Aus praktischer Sicht Dies hat keine Auswirkungen auf Systeme, die eine Dynamik verwenden, /devda sie die Inodes nur im Speicher speichern oder nach Bedarf generieren, und nahezu keine Auswirkungen, wenn sie /devstatisch sind, da Inodes nahezu keinen Speicherplatz auf der Festplatte belegen und die meisten Dateisysteme entweder keine Obergrenze haben sie oder Vorsorge weit mehr als irgendjemand jemals brauchen wird.

Austin Hemmelgarn
quelle
3
Hebt vorsichtig die Hand. Ich war an einem Projekt beteiligt, bei dem einem Server die Inodes ausgegangen sind. Es war schließlich die Krise, die unser Team brauchte, um das Management davon zu überzeugen, in den Ersatz dieses Back-End-Systems zu investieren, das entwickelt worden war (schlecht, wie Sie sich vorstellen können!), Bevor einer von uns dort ankam.
KRyan
@KRyan Es kann passieren, aber heutzutage ist es selten, es sei denn, der Administrator hat die Anzahl bei der Erstellung des Dateisystems explizit reduziert. Viele moderne Dateisysteme (zumindest NTFS, BTRFS und ZFS, ich denke auch XFS) weisen Inodes tatsächlich dynamisch zu, sodass es auf vielen neueren Systemen tatsächlich unmöglich ist, sie zu beenden.
Austin Hemmelgarn
@KRyan Ich hatte auch dieses Problem. Und es war tatsächlich ein gut gestaltetes System, wenn auch etwas veraltet und extreams (jede Transaktion erforderte ein unabhängiges Protokoll, das auf der Festplatte gespeichert wurde, schließlich füllte es sich nur mit winzigen kleinen Inodes)
coteyr
1
Od and Docker ist berühmt dafür, genau dieses Inode-Problem zu verursachen.
Coteyr
@AustinHemmelgarn Die ext-Familie ist ziemlich berüchtigt dafür, dass sie eine statische Anzahl von Inodes hat (und anschließend ausgeht). Es ist übrigens auch das mit Abstand am häufigsten verwendete Linux-Dateisystem (Szenarien, in denen große Datenmengen auf XFS gespeichert werden, wobei ZFS und BTRFS relativ neu sind) und die Standardeinstellung für die meisten Distributionen. Natürlich sind in einem modernen System die standardmäßigen maximalen Inodes um viele Größenordnungen größer als die Anzahl der Gerätedateien, die Sie jemals haben werden.
Bob
15

Gerätedateien haben ebenfalls Berechtigungen, die in einem Inode gespeichert sind.

Hauke ​​Laging
quelle
Hervorragender Punkt, den ich vergessen habe zu erwähnen.
Austin Hemmelgarn
5
Nicht nur Berechtigungen, sondern auch der Dateityp und andere Metadaten. Klassischerweise enthält das Verzeichnis selbst nur den Namen und die Inode-Nummer - nichts deutet darauf hin, dass die Datei ein Gerät ist, bis Sie den Inode lesen.
Gilles 'SO - hör auf böse zu sein'
12

Verzeichnisse sind einfach eine Zuordnung von Dateinamen zu Inodes. Alles, was sich auf den Namen bezieht (eine Datei, ein Symlink, ein Gerät, ein FIFO, ein Socket), muss sich im Inode befinden.

Informationen zum Gerät werden im Inode gespeichert. Dort befinden sich die Haupt- und Nebengerätenummern sowie Berechtigungen, Zeitstempel usw. Dort wird das Typfeld gespeichert, das besagt, dass es sich eher um ein Block- oder Zeichengerät als um eine reguläre Datei handelt.

Der Inode für Geräte verwendet einfach nicht die Felder, die die Blockzuordnung der Datei enthalten.

Barmar
quelle
0

Ohne Inode hätten Sie nur den Dateinamen, um alle Informationen über das betreffende Gerät zu speichern. Dies bedeutet, dass "nette" Gerätenamen /dev/sdanicht in Frage kommen: Sie benötigen einen Namen, der an einen bestimmten Treiber gebunden sein kann, wie z /dev/ohci/sda.

Noch wichtiger ist , alle Werkzeuge , die auf Inodes verlassen (wie stat, lsund so weiter) müßten geändert werden , um zu behandeln Wege unter /devin besonderer Weise. Das wäre eine unerschwinglich große Menge an Arbeit ohne offensichtlichen Nutzen im Vergleich zum gegenwärtigen Stand der Dinge.

Dmitry Grigoryev
quelle