Von Zeit zu Zeit werde ich in verschiedenen großen Unternehmen, hauptsächlich in St. Petersburg und Moskau, ein Interview über die Position von DevOps führen, um zum Zentralnervensystem zu gelangen. Mir ist aufgefallen, dass in vielen Unternehmen (in vielen guten Unternehmen, zum Beispiel Yandex) zwei ähnliche Fragen gestellt werden:
- was ist inode;
- Aus welchen Gründen ist es möglich, dass ein Fehler beim Schreiben auf die Festplatte auftritt (oder zum Beispiel, warum der Speicherplatz möglicherweise knapp wird, eine Essenz).
Wie so oft war ich mir sicher, dass ich dieses Thema gut kannte, aber als ich anfing zu erklären, wurden Wissenslücken offensichtlich. Um mein Wissen zu systematisieren, die Lücken zu füllen und keine Schande mehr zu machen, schreibe ich diesen Artikel, er kann immer noch nützlich sein.
Ich werde "von unten" beginnen, d.h. von der Festplatte (Flash-Laufwerke, SSDs und andere moderne Dinge, die wir verwerfen, betrachten wir beispielsweise alle 20 oder 80 Gigabyte alten Laufwerke, da dort die Blockgröße 512 Bytes beträgt).
Die Festplatte weiß nicht, wie sie ihren Speicherplatz byteweise adressieren soll, bedingt ist sie in Blöcke unterteilt. Die Blocknummerierung beginnt mit 0. (Dies wird als LBA bezeichnet, Details hier:
en.wikipedia.org/wiki/LBA )

Wie Sie der Abbildung entnehmen können, habe ich die LBA-Blöcke als Festplattenpegel festgelegt. Übrigens können Sie sehen, welche Blockgröße Ihre Festplatte hat:
root@ubuntu:/home/serp
Die obige Ebene markiert die Partition, eine für die gesamte Festplatte (wiederum der Einfachheit halber). Am häufigsten werden zwei Arten von Partitionsmarkups verwendet: msdos und gpt. Dementsprechend ist msdos ein altes Format, das Festplatten mit bis zu 2 TB unterstützt. Gpt ist ein neues Format, das bis zu 1 Zettabyte von 512-Byte-Blöcken adressieren kann. In unserem Fall haben wir einen Abschnitt vom Typ msdos, wie aus der Abbildung ersichtlich ist. Der Abschnitt beginnt in diesem Fall mit Block Nr. 1, während der Nullabschnitt für MBR verwendet wird.
Im ersten Abschnitt habe ich das ext2-Dateisystem erstellt. Standardmäßig beträgt die Blockgröße 4096 Byte, was auch in der Abbildung dargestellt ist. Sie können die Dateisystemblockgröße folgendermaßen sehen:
root@ubuntu:/home/serp
Der Parameter, den wir benötigen, ist "Blockgröße".
Am interessantesten ist nun, wie man die Datei / home / serp / testfile liest? Eine Datei besteht aus einem oder mehreren Blöcken des Dateisystems, in dem ihre Daten gespeichert sind. Wenn Sie den Dateinamen kennen, wie finden Sie ihn? Welche Blöcke zu lesen?
Hier bieten sich Inodes an. Das ext2fs-Dateisystem verfügt über eine „Tabelle“, die Informationen zu allen Inodes enthält. Die Anzahl der Inodes bei ext2fs wird beim Erstellen des Dateisystems festgelegt. Wir betrachten die erforderlichen Zahlen im Parameter "Inode count" der Ausgabe von tune2fs, d. H. Wir haben 65536 Stück. Der Inode enthält die Informationen, die wir benötigen: eine Liste der Dateisystemblöcke für die gesuchte Datei. Wie finde ich die Inode-Nummer für die angegebene Datei?
Die Entsprechung des Namens und der Inode-Nummer ist in dem Verzeichnis enthalten, und das Verzeichnis in ext2fs ist eine Datei eines speziellen Typs, d. H. hat auch eine eigene Inode-Nummer. Um diesen Teufelskreis zu durchbrechen, wurde dem Stammverzeichnis eine „feste“ Inode-Nummer „2“ zugewiesen. Wir betrachten den Inhalt der Inode Nummer 2:
root@ubuntu:/
Wie Sie sehen können, ist das benötigte Verzeichnis in dem Block mit der Nummer 579 enthalten. Darin finden wir die Knotennummer für den Basisordner usw. entlang der Kette, bis wir im serp-Verzeichnis die Knotennummer für die angeforderte Datei sehen. Wenn plötzlich jemand überprüfen möchte, ob die Nummer korrekt ist und ob dort die richtigen Informationen vorhanden sind, ist dies nicht schwierig. Wir machen:
root@ubuntu:/
In der Ausgabe können Sie die Dateinamen im Verzeichnis lesen.
Also kam ich zur Hauptfrage: "Aus welchen Gründen kann es zu einem Schreibfehler kommen"?
Dies geschieht natürlich, wenn das Dateisystem keine freien Blöcke enthält. Was kann in diesem Fall getan werden? Neben dem offensichtlichen "Löschen von etwas Unnötigem" sollte beachtet werden, dass es in ext2,3- und 4-Dateisystemen so etwas wie "Reserved block count" gibt. Wenn Sie sich die Auflistung oben ansehen, dann haben wir solche Blöcke "13094". Dies sind beschreibbare Blöcke nur für den Root-Benutzer. Wenn Sie das Problem jedoch schnell beheben müssen, wie kann eine temporäre Lösung für alle verfügbar gemacht werden, wodurch ein wenig freier Speicherplatz entsteht:
root@ubuntu:/mnt
Das heißt, Standardmäßig stehen Ihnen nicht 5% des Speicherplatzes zum Schreiben zur Verfügung. Angesichts des Volumens moderner Festplatten können es Hunderte von Gigabyte sein.
Was könnte noch sein? Eine Situation ist möglich, wenn freie Blöcke vorhanden sind, die Knoten jedoch beendet sind. Dies ist normalerweise der Fall, wenn sich im Dateisystem mehrere Dateien befinden, die kleiner als die Blockgröße des Dateisystems sind. Wenn man bedenkt, dass 1 Inode für 1 Datei oder Verzeichnis ausgegeben wird und wir sie insgesamt haben (für dieses Dateisystem) 65536 - die Situation ist mehr als real. Dies ist aus der Ausgabe des Befehls df deutlich ersichtlich:
serp@ubuntu:~$ df -hi Filesystem Inodes IUsed IFree IUse% Mounted on udev 493K 480 492K 1% /dev tmpfs 493K 425 493K 1% /run /dev/xvda1 512K 240K 273K 47% / none 493K 2 493K 1% /sys/fs/cgroup none 493K 2 493K 1% /run/lock none 493K 1 493K 1% /run/shm none 493K 2 493K 1% /run/user /dev/xvdc1 320K 4,1K 316K 2% /var /dev/xvdb1 64K 195 64K 1% /home /dev/xvdh1 4,0M 3,1M 940K 78% /var/www serp@ubuntu:~$ df -h Filesystem Size Used Avail Use% Mounted on udev 2,0G 4,0K 2,0G 1% /dev tmpfs 395M 620K 394M 1% /run /dev/xvda1 7,8G 2,9G 4,6G 39% / none 4,0K 0 4,0K 0% /sys/fs/cgroup none 5,0M 0 5,0M 0% /run/lock none 2,0G 0 2,0G 0% /run/shm none 100M 0 100M 0% /run/user /dev/xvdc1 4,8G 2,6G 2,0G 57% /var /dev/xvdb1 990M 4,0M 919M 1% /home /dev/xvdh1 63G 35G 25G 59% /var/www
Wie im Abschnitt / var / www deutlich zu sehen ist, variieren die Anzahl der freien Blöcke im Dateisystem und die Anzahl der freien Knoten stark.
Falls mir die Inode ausgeht, werde ich dir keine Zaubersprüche sagen, weil Sie sind nicht (wenn nicht richtig, lassen Sie es mich wissen). Für die Abschnitte, in denen sich kleine Dateien vermehren, sollten Sie das Dateisystem korrekt auswählen. So können beispielsweise in btrfs Inodes nicht enden, weil Erstellen Sie bei Bedarf dynamisch neue.