Irgendwas mit Inode

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# blockdev --getpbsz /dev/sdb 512 

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# tune2fs -l /dev/sdb1 tune2fs 1.42.9 (4-Feb-2014) Filesystem volume name: <none> Last mounted on: <not available> Filesystem UUID: a600bf40-f660-41f6-a3e6-96c303995479 Filesystem magic number: 0xEF53 Filesystem revision #: 1 (dynamic) Filesystem features: ext_attr resize_inode dir_index filetype sparse_super large_file Filesystem flags: signed_directory_hash Default mount options: user_xattr acl Filesystem state: clean Errors behavior: Continue Filesystem OS type: Linux Inode count: 65536 Block count: 261888 Reserved block count: 13094 Free blocks: 257445 Free inodes: 65525 First block: 0 Block size: 4096 Fragment size: 4096 Reserved GDT blocks: 63 Blocks per group: 32768 Fragments per group: 32768 Inodes per group: 8192 Inode blocks per group: 512 Filesystem created: Fri Aug 2 15:02:13 2019 Last mount time: n/a Last write time: Fri Aug 2 15:02:14 2019 Mount count: 0 Maximum mount count: -1 Last checked: Fri Aug 2 15:02:13 2019 Check interval: 0 (<none>) Reserved blocks uid: 0 (user root) Reserved blocks gid: 0 (group root) First inode: 11 Inode size: 256 Required extra isize: 28 Desired extra isize: 28 Default directory hash: half_md4 Directory Hash Seed: c0155456-ad7d-421f-afd1-c898746ccd76 

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:/# debugfs /dev/sdb1 debugfs 1.42.9 (4-Feb-2014) debugfs: stat <2> Inode: 2 Type: directory Mode: 0755 Flags: 0x0 Generation: 0 Version: 0x00000000:00000002 User: 0 Group: 0 Size: 4096 File ACL: 0 Directory ACL: 0 Links: 3 Blockcount: 8 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x5d43cb51:16b61bcc -- Fri Aug 2 16:34:09 2019 atime: 0x5d43c247:b704301c -- Fri Aug 2 15:55:35 2019 mtime: 0x5d43cb51:16b61bcc -- Fri Aug 2 16:34:09 2019 crtime: 0x5d43b5c6:00000000 -- Fri Aug 2 15:02:14 2019 Size of extra inode fields: 28 BLOCKS: (0):579 TOTAL: 1 

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:/# dd if=/dev/sdb1 of=/home/serp/dd_image bs=4096 count=1 skip=579 1+0 records in 1+0 records out 4096 bytes (4,1 kB) copied, 0,000184088 s, 22,3 MB/s root@ubuntu:/# hexdump -c /home/serp/dd_image 

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# tune2fs -m 0 /dev/sdb1 tune2fs 1.42.9 (4-Feb-2014) Setting reserved blocks percentage to 0% (0 blocks) 

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.

Source: https://habr.com/ru/post/de462849/


All Articles