Warum kann die Größe der Inode-Tabelle normalerweise nicht geändert werden?

19

Unix-Dateisysteme haben normalerweise eine Inode-Tabelle, und die Anzahl der Einträge in dieser Tabelle wird normalerweise zum Zeitpunkt der Erstellung des Dateisystems festgelegt. Dies führt manchmal dazu, dass Benutzer mit viel Speicherplatz verwirrende Fehlermeldungen zu fehlendem Speicherplatz erhalten, und selbst wenn sie das Problem erkannt haben, gibt es keine einfache Lösung dafür.

Es scheint mir jedoch sehr wünschenswert zu sein, dieses Durcheinander zu vermeiden, indem man den Benutzern und Systemadministratoren bei Bedarf völlig transparent Inodes zuweist. Wenn Sie auf nette Hacks stehen, können Sie sogar die Inode-Tabelle selbst zu einer Datei machen und so den Code wiederverwenden, den Sie bereits haben und der freien Speicherplatz auf der Festplatte findet. Wenn Sie Glück haben, könnten Sie sogar die Inodes in der Nähe der Dateien selbst finden, ohne explizit zu versuchen, dieses Ergebnis zu erzielen.

Aber niemand (von dem ich weiß) macht das wirklich, also gibt es wahrscheinlich einen Haken, den ich vermisse. Irgendeine Idee woran es liegen könnte?

Mark VY
quelle
4
Sie haben gerade das Masterdateiverzeichnis und den Index von Dateien-11 in VMS, dem Vorläufer der Masterdateitabelle in NTFS, neu erfunden.
JdeBP
Ich habe den Vorläufer der MFT neu erfunden? Cool!
Mark VY

Antworten:

26

Angenommen, Sie haben die Inode-Tabelle zu einer Datei gemacht. dann ist die nächste Frage ... wo speichern Sie Informationen zu dieser Datei? Sie benötigen also "echte" Inodes und "erweiterte" Inodes, wie eine MS-DOS-Partitionstabelle. Vorausgesetzt, Sie benötigen nur eine (oder möglicherweise einige - z. B. um Ihr Tagebuch auch als Datei zu speichern). Aber Sie hätten eigentlich Sonderfälle, anderen Code. Jede Beschädigung dieser Datei wäre ebenfalls katastrophal. Bedenken Sie, dass es vor dem Aufzeichnen häufig vorkam, dass Dateien geschrieben wurden, z. B. wenn der Strom ausfiel und stark beschädigt wurde. Ihre Dateivorgänge müssten viel robuster sein als Stromausfall / Absturz / etc. als sie waren, zB ext2.

Herkömmliche Unix-Dateisysteme haben eine einfachere (und robustere) Lösung gefunden: Setzen Sie alle X Blöcke einen Inode-Block (oder eine Gruppe von Blöcken). Dann finden Sie sie durch einfache Arithmetik. Dann ist es natürlich nicht möglich, mehr hinzuzufügen (ohne das gesamte Dateisystem neu zu strukturieren). Und selbst wenn Sie den Inode-Block verlieren / beschädigen, in den Sie bei einem Stromausfall geschrieben haben, gehen nur wenige Inodes verloren - weitaus besser als ein wesentlicher Teil des Dateisystems.

Modernere Designs verwenden Dinge wie B-Baum- Varianten. Moderne Dateisysteme wie btrfs, XFS und ZFS unterliegen keinen Inode-Beschränkungen.

derobert
quelle
2
Wenn Sie sagen, dass Sie nicht unter Inode-Beschränkungen leiden, bedeutet dies, dass neue Inodes vollständig hinter den Kulissen zugewiesen werden, oder muss jemand einen Befehl wie "expand-table-now-please" ausführen?
Mark VY
3
@MarkVY komplett hinter den Kulissen (wenn überhaupt wirklich Inodes verwendet werden).
Derobert
Okay, mein Wissen ist also anscheinend weit hinter der Zeit zurück. Vielen Dank für die ausführliche Antwort. Ich habe nie darüber nachgedacht, was bei einem Stromausfall oder ähnlichem passieren würde. Mein süßer Hack ist also ziemlich gefährlich, es sei denn, "An Datei anhängen" ist bereits eine atomare Operation im Dateisystem. Was Sie behaupten, war früher ziemlich selten.
Mark VY
Ich erinnere mich , XFS und Btrfs sehr gelegentlich von leichtem Dateisystem Korruption leiden - zfs auch? Für manche ist dies kein Risiko, aber es kann ein Risiko für wichtige Daten und die Kosten der dynamischen Zuordnung sein. Für XFS in diesem Shop war das größte Problem, dass es nicht möglich war, ein Dateisystem auf irgendeine Weise zu verkleinern.
user2066657
Btrfs leidet möglicherweise nicht unter Inode-Beschränkungen, hat jedoch einen völlig anderen Fehler, der ähnlich verwirrende Symptome hervorruft (im Grunde geht der Metadatenraum aus, obwohl aufgrund der ineffizienten Verwendung von Blockgruppen immer noch genügend Datenraum zur Verfügung steht). Dies führt nicht nur dazu, dass Fehler mit vollem Speicherplatz gemeldet werden df, sondern kann auch nicht durch Löschen von Dateien behoben werden, da für das Löschen einer Datei Metadaten zugewiesen werden müssen.
Mark
17

Viele Dateisysteme haben eine dynamisch zuweisbare Inode-Tabelle (oder deren moralische Entsprechung) (XFS, BTRFS, ZFS, VxFS ...)

Das ursprüngliche Unix-UFS hatte jedoch Inodes, die zum Zeitpunkt der Dateisystemerstellung behoben wurden, und davon abgeleitete Dateisysteme (Linux EXT, Solaris UFS) setzten das Schema häufig fort. Es ist robust und einfacher zu implementieren. So viele Anwendungsfälle passen gut zusammen, dass das Entwerfen eines neuen Dateisystems, um zu vermeiden, dass ein Problem nicht einfach zu rechtfertigen ist.

BowlOfRed
quelle
So viele Fortschritte im Bereich der Datenverarbeitung wurden jedoch von Menschen erzielt, die Probleme lösten, die nicht einfach zu rechtfertigen sind.
user253751
2
Aber auch große Fortschritte bei nicht einfach zu lösenden Lösungen :) Frühe "komplexe" Dateisysteme - NT-Ära NTFS, reiserfs - scheiterten katastrophal, WENN sie scheiterten ...
rackandboneman
6

Es gibt Dateisysteme, die Inodes dynamisch zuweisen: Auf Anhieb funktionieren mindestens Veritas VxFS (= das Standarddateisystem von HP-UX und eine der unter Solaris verfügbaren Optionen) und XFS (der Standarddateisystemtyp unter RHEL 7) dieser Weg. Btrfs und IBMs JFS auch.

telcoM
quelle