# Inode

Ein Inode (englisch index node, gesprochen „eye-node“) ist die grundlegende Datenstruktur zur Verwaltung von Dateisystemen mit unixartigen Betriebssystemen. Jeder Inode wird innerhalb eines Dateisystems eindeutig durch seine Inode-Nummer identifiziert. Jeder Namenseintrag in einem Verzeichnis verweist auf genau einen Inode. Dieser enthält die Metadaten der Datei und verweist auf die Daten der Datei beziehungsweise die Dateiliste des Verzeichnisses.
Die Anwendungssoftware unterscheidet beim Lesen oder Schreiben von Daten nicht mehr zwischen Gerätetreibern und regulären Dateien. Durch das Inode-Konzept gilt bei den Unixvarianten alles als Datei (“On UNIX systems it is reasonably safe to say that everything is a file…”). Dadurch unterscheiden sich solche Betriebssysteme in der Verwaltung ihres Datenspeichers von anderen Systemen wie Windows mit NTFS, aber auch von VMS oder MVS.

## Grundsätzliches

Speichert man eine Datei auf einem Computer ab, so muss nicht nur der Dateiinhalt (Nutzdaten) gespeichert werden, sondern auch Metadaten wie zum Beispiel der Zeitpunkt der Dateierstellung oder der Besitzer der Datei. Gleichzeitig muss der Computer einem Dateinamen – inklusive Dateipfad – die entsprechenden Nutzdaten und Metadaten effizient zuordnen können. Die Spezifikation, wie diese Daten organisiert und auf einem Datenträger gespeichert werden, nennt man Dateisystem. Dabei gibt es abhängig von Einsatzbereich und Betriebssystem unterschiedliche Dateisysteme. Umgesetzt wird die Dateisystemspezifikation von einem Treiber, der wahlweise als ein Kernel-Modul des Betriebssystemkerns (Kernel) oder seltener als gewöhnliches Programm im Userspace umgesetzt sein kann.
Dateisysteme unixoider Betriebssysteme – wie Linux und macOS – verwenden sogenannte Inodes. Diese enthalten die Metadaten sowie Verweise darauf, wo Nutzdaten gespeichert sind. An einem speziellen Ort des Dateisystems, dem Superblock, wird wiederum die Größe, Anzahl und Lage der Inodes gespeichert. Die Inodes sind durchnummeriert und an einem Stück auf dem Datenträger gespeichert. Das Wurzelverzeichnis eines Dateisystems besitzt eine feste Inodenummer. Unterordner sind „gewöhnliche“ Dateien, welche eine Liste der darin enthaltenen Dateien mit der Zuordnung der dazugehörenden Inodenummern als Nutzdaten enthalten.
Soll also beispielsweise die Datei /bin/ls geöffnet werden, so läuft dies, vereinfacht, wie folgt ab:
* Der Dateisystemtreiber liest den Superblock aus. Dadurch erfährt er die Startposition der Inodes und deren Länge. Somit kann nun jeder beliebige Inode gefunden und gelesen werden.
* Nun wird der Inode des Wurzelverzeichnisses geöffnet. Da dies ein Ordner ist, befindet sich darin ein Verweis auf die Speicherstelle der Liste aller darin enthaltenen Dateien mitsamt ihren Inodenummern. Darin wird das Verzeichnis bin gesucht.
* Nun kann der Inode des bin-Verzeichnisses gelesen werden und analog zum letzten Schritt der Inode der Datei ls gefunden werden.
* Da es sich bei der Datei ls nicht um ein Verzeichnis, sondern um eine reguläre Datei handelt, enthält ihr Inode nun einen Verweis auf die Speicherstelle der gewünschten Daten.

## Aufbau

Jedem einzelnen von einem Schrägstrich / (slash) begrenzten Namen ist genau ein Inode zugeordnet. Dieser speichert folgende Metainformationen zur Datei, aber nicht den eigentlichen Namen:
* Die Art der Datei (reguläre Datei, Verzeichnis, Symbolischer Link, …), siehe unten;
* die numerische Kennung des Eigentümers (UID, user id) und der Gruppe (GID, group id);
* die Zugriffsrechte für den Eigentümer (user), die Gruppe (group) und alle anderen (others); Die klassische Benutzer- und Rechteverwaltung geschieht mit den Programmen chown (change owner), chgrp (change group) und chmod (change mode). Durch Access Control Lists (ACL) wird eine feinere Rechtevergabe ermöglicht.
* verschiedene Zeitpunkte der Datei: Erstellung, Zugriff (access time, atime) und letzte Änderung (modification time, mtime);
* die Zeit der letzten Status-Änderung des Inodes (status, ctime);
* die Größe der Datei;
* den Linkzähler (siehe unten);
* einen oder mehrere Verweise auf die Blöcke, in denen die eigentlichen Daten gespeichert sind.

### Reguläre Dateien

Reguläre Dateien (engl. regular files) sind sowohl Anwenderdaten als auch ausführbare Programme. Letztere sind durch das executable-Recht gekennzeichnet und werden beim Aufruf durch das System in einem eigenen Prozess gestartet. Als „ausführbar“ gelten nicht nur kompilierte Programme, sondern auch Skripte, bei denen der Shebang den zu verwendenden Interpreter angibt. Bei „dünnbesetzten Dateien“, sogenannten sparse files, unterscheidet sich die logische Größe vom durch die Datenblöcke tatsächlich belegten Festplattenplatz.

### Verzeichnisse

Verzeichnisse sind Dateien, deren „Dateiinhalt“ aus einer tabellarischen Liste der darin enthaltenen Dateien besteht. Die Tabelle enthält dabei eine Spalte mit den Dateinamen und eine Spalte mit den zugehörigen Inodenummern. Bei manchen Dateisystemen umfasst die Tabelle noch weitere Informationen. So speichert ext4 darin auch den Dateityp aller enthaltenen Dateien ab, so dass dieser beim Auflisten eines Verzeichnisinhalts nicht aus den Inodes aller Dateien ausgelesen werden muss. Für jedes Verzeichnis existieren immer die Einträge . und .. als Verweise auf das aktuelle bzw. übergeordnete Verzeichnis.

### Harte und symbolische Links

Bei symbolischen Links handelt es sich um spezielle Dateien, die anstelle von Daten einen Dateipfad enthalten, auf den der Link verweist. Je nach Dateisystem und Länge des Dateipfads wird der Link entweder direkt im Inode gespeichert oder in einem Datenblock, auf welchen der Inode verweist.
Bei harten Links hingegen handelt es sich nicht um spezielle Dateien. Von einem harten Link spricht man, wenn auf einen Inode mehrfach von verschiedenen Verzeichnissen oder verschiedenen Dateien verwiesen wird. Alle Verweise (Links) auf den Inode sind gleichwertig; es gibt also kein Original. Im Inode gibt der Linkzähler an, wie viele Dateiennamen auf diesen verweisen. Er steht nach dem Anlegen einer Datei also bei 1 und wird erhöht, sobald weitere Hardlinks für diese Datei erstellt werden. Bei einem Verzeichnis beträgt er zwei mehr, als Unterordner darin enthalten sind, da neben dem Eintrag im Ordner darüber und dem Eintrag '.' im Ordner selbst noch die Einträge '..' in allen Unterordnern darauf verweisen. Wird eine Datei gelöscht, so wird ihr Eintrag aus dem übergeordneten Verzeichnis entfernt und der Linkzähler um eins reduziert. Beträgt der Linkzähler dann 0, wird gegebenenfalls abgewartet, bis die Datei von keinem Programm mehr geöffnet ist und erst anschließend der Speicherplatz freigegeben.

### Weitere Arten von Dateien

Neben diesen üblichen Dateien existieren weitere Dateitypen:
* Block-orientierte Gerätedateien
* Zeichen-orientierte Gerätedateien
* benannte Pipes
* Sockets
* Doors (nur unter Solaris)

## Verweis auf die Daten

Bei älteren Dateisystemen enthält der Inode üblicherweise eine begrenzte Anzahl von Einträgen auf Datenblöcke, in welchen sich die Nutzdaten der Datei befinden. Da die Anzahl der Einträge im Inode somit die Dateigröße stark begrenzen würde, wird für größere Dateien im Inode ein Verweis auf einen Datenblock gespeichert, in welchem anstatt Nutzdaten wiederum eine Liste mit Verweisen auf Datenblöcken gespeichert ist. Dieses Prinzip kann theoretisch beliebig ineinander verschachtelt wiederholt werden.
Modernere Dateisysteme haben alternativ dazu sogenannte Extents, dabei werden im Inode nur die Nummer des ersten und die des letzten Blocks eines zusammenhängenden Bereichs an Datenblöcken gespeichert. Ist die Datei also nicht fragmentiert, so müssen unabhängig von der Dateigröße nur zwei Block-Ids gespeichert werden: die Nummer des ersten Datenblocks und die Nummer des letzten Datenblocks.

### Beispiel

Bei dem Dateisystem ext2 beträgt die Größe eines Inodes standardmäßig 128 Byte Darin verweisen bis zu 12 Einträge einer regulären Datei auf je einen Datenblock, in dem der eigentliche Inhalt gespeichert ist. Reichen diese 12 Blöcke nicht aus, zeigt ein Eintrag im Inode auf einen Cluster, der dann die Verweise zu den eigentlichen Datenclustern enthält. Ein solcher Verweis wird als einfach indirekter Block bezeichnet. Bis zu dreifach indirekte Blöcke sind möglich, so dass die maximale Dateigröße je nach Blockgröße zwischen 16 GiB und 4 TiB liegen kann.
Beispiel einer Inode-Struktur mit 12 KiB in direkt adressierten Datenblöcken und ungefähr 16 Millionen KiB + 65536 KiB + 256 KiB in indirekt adressierten Datenblöcken/Clustern mit jeweils einem KiB Größe:
Die 256 Einträge in den Blöcken, auf die verwiesen wird, ergeben sich daraus, dass ein 1-KiB-Block genau 256 Adressen der Länge 4 Byte (32-Bit-Adressraum) enthalten kann.

## Praxis

Die Inodenummer einer Datei lässt sich mit dem Befehl ls -i <Dateiname> anzeigen. Das Programm find bietet die Option -inum, um nach Dateien mit einer speziellen Inodenummer zu suchen.
Die in einem Inode gespeicherten Metadaten können mit dem Befehl stat angezeigt werden. Das Tool debugfs kennt den Befehl stat <[inodenumer]>, um die im Inode gespeicherten Daten anzuzeigen.
Die Anzahl der möglichen Inodes und somit der möglichen Dateien ist bei manchen Dateisystemen beschränkt; wird die Maximalanzahl erreicht, lassen sich keine weiteren Dateien anlegen. Beim Erstellen von ext2/ext3/ext4-Dateisystemen lässt sich die Anzahl der Inodes einstellen. Bei Datenträgern mit sehr vielen kleinen Dateien muss man also beim Formatieren bereits darauf achten, die Anzahl der Inodes hoch genug zu wählen. Das Programm df (display free disk space, Anzeige der Festplattenbelegung) zeigt mit der Option -i die Anzahl der belegten und verfügbaren Inodes auf allen gemounteten Dateisystemen an.
Dateisysteme haben in der Regel eine Überprüfungssoftware, welche unter anderem die Inodes auf Inkonsistenzen überprüft. Unter Linux und einigen anderen unixoiden Systemen wird dafür fsck eingesetzt. fsck versucht, den Dateisystemtyp zu ermitteln und prüft danach alle Inodes auf ihre Richtigkeit.
Die Anzahl an verfügbaren Inodes wird bei den meisten Dateisystemen bei deren Erstellung festgelegt und lässt sich i. d. R. anschließend nicht mehr ändern. Die Anzahl an Inodes begrenzt somit auch die maximale Anzahl an Dateien, die auf dem Dateisystem gespeichert werden können (einschließlich aller Ordner, Spezialdateien u. ä.).