- Eine mit Nullen gefüllte Datei wird als Loop-Device eingebunden, um den Zustand vor und nach
mkfs.ext4zu vergleichen, und zeigt Byte für Byte, welche Strukturen ext4 auf leerem Speicherplatz anlegt - Die Testdatei hat die Größe von 8 Blöcken und wurde mit
/dev/zeroerstellt; das Bild ist als Block mit 1024 Byte Breite und 64 Byte Höhe aufgebaut, sodass ein Pixel genau einem Byte entspricht - Da sich die ext4-Struktur allein aus der
od-Ausgabe nur schwer lesen lässt, wird die Byte-Verteilung des mit 0x00 gefüllten Zustands und des Zustands nachmkfs.ext4als Bild verglichen - Bytes mit dem Wert 0x00 können auch dann wie freier Speicher aussehen, wenn sie zu ext4 gehören, sodass sich zugewiesene Strukturen mit der Grundvisualisierung nicht vollständig unterscheiden lassen
- Nach dem Kopieren einer 1024-Byte-Datei aus
/dev/urandomwird dasselbe Muster gesucht und farblich markiert, sodass sich ext4-Metadaten und die Position von Nutzerdaten gemeinsam prüfen lassen
Ein ext4-Image auf einer leeren Datei erzeugen
- Dies ist ein Experiment, das zeigt, welche Byte-Struktur ext4 hinzufügt, wenn
mkfs.ext4auf einem leeren Laufwerk ausgeführt wird, das nur mit 0x00 gefüllt ist - Da es riskant wäre, mit
ddauf einem Live-Laufwerk wie/dev/sdazu arbeiten, wird statt eines zusätzlichen VM-Laufwerks eine normale Datei als Loop-Device verwendet mountundumountkönnen eine Loop-Datei direkt auch ohne separateslosetupverwendenmount -o loop <foo_file> <bar_dir>umount <bar_dir>
Aufbau der Blockdatei für das Experiment
- Das Experiment beginnt immer mit einer leeren Datei, die mit
ddunter Verwendung von/dev/zeroals Eingabe erzeugt wird - Die Dateigröße wird so berechnet, dass das fertige Bild aus 8 Blöcken besteht
- Jeder Block ist 1024 Pixel/Byte breit
- 64 Pixel/Byte hoch
- Der Erzeugungsbefehl lautet wie folgt
dd if=/dev/zero of=blockfile.ext4 bs=$((64 * 1024)) count=8
- Direkt nach der Erzeugung zeigt die
od-Ausgabe den erwartbaren Zustand, in dem alles mit 0x00 gefüllt ist - Das verwendete Laufwerk ist zu klein, um ein Journal aufzunehmen, daher bleibt eine Visualisierung mit Journal ein Projekt für später
Sichtbare Struktur nach mkfs.ext4
- Nach der Ausführung von
mkfs.ext4erscheinen in der zuvor nur mit 0x00 gefüllten Datei verschiedene Werte, wodurch die von ext4 erzeugte Dateisystemstruktur sichtbar wird - Die Byte-Ausgabe von
odist jedoch zu detailliert, um das gesamte Layout gut zu erfassen - Wenn man sie in ein Bild umwandelt, in dem ein Pixel ein Byte darstellt, lässt sich die Blockdatei aus einer breiteren Perspektive betrachten
- Das Bild der leeren Datei zeigt ein vollständig mit 0x00 gefülltes Laufwerk, und das Bild nach
mkfs.ext4zeigt, wo auf der Festplatte ext4-Daten abgelegt wurden
Abgrenzung zu Nutzerdaten
- Das Grundbild unterscheidet ext4-Bytes und Nicht-ext4-Bytes nicht direkt
- Wenn ein Byte zwar zu ext4-Daten gehört, aber den Wert 0x00 hat, wird es in derselben Farbe wie andere 0x00-Bytes dargestellt
- Um ext4-Daten und „Nutzer“-Daten zu unterscheiden, wird eine 1024 Byte große Datei aus
/dev/urandomerzeugt und auf das eingehängte Loop-Device kopiert - Der Visualisierungscode prüft beim Lesen der Blockdatei, ob die nächsten 1024 Byte mit den 1024 Byte der Referenzdatei übereinstimmen
- Bei einer Übereinstimmung werden diese 1024 Pixel farblich als Nutzerdaten markiert
- Auf diese Weise entsteht ein Bild, das sowohl die von ext4 erzeugten Strukturen als auch die kopierten Nutzerdaten der Datei zeigt
Animation und Vergleich mit ext2
- Nach den statischen Bildern wird auf derselben Grundlage ein animiertes GIF erstellt
- Zwischen jeweils zwei Frames wird die Nutzerdatendatei dreimal auf das Laufwerk kopiert
- Das ist ausdrucksstärker, als pro Frame nur einmal
cpauszuführen - Außerdem wird die GIF-Datei kleiner
- Das ist ausdrucksstärker, als pro Frame nur einmal
- Zum Vergleich wird auch eine ähnliche Animation für ext2 bereitgestellt
Weiterführende Links
- Wikipedia: ext4-Überblick
- ext4 wiki: ext4-Wiki
- Admin Guide: Kernel-Admin-Handbuch für ext4
- e2fsprogs: Werkzeuge für ext-Dateisysteme
- ext4 Data Structures and Algorithms: Dokumentation zu ext4-Datenstrukturen und -algorithmen
1 Kommentare
Hacker-News-Kommentare
Vor einigen Jahren gab es auf der FOSDEM eine echte grafische Visualisierung von ext4; das Video ist hier, und die Visualisierung beginnt etwa ab Minute 20
https://archive.fosdem.org/2019/schedule/event/nbdkit/
Die Stelle im Vortrag, an der von einem „blauen“ Filesystem-Trim die Rede ist, kann verwirrend sein, aber offenbar konnte der FOSDEM-Projektor das helle Blau, das ich verwendet habe, nicht richtig darstellen. Während des Vortrags habe ich das nicht bemerkt, und auf dem Laptop-Bildschirm sah alles normal aus. Im Blog gibt es auch ein Begleitvideo mit korrekt gerenderten Farben: https://rwmj.wordpress.com/2018/11/04/nbd-graphical-viewer/
Weil so viele Menschen versuchen, die Nutzung von Computern zu vereinfachen, verschwinden anscheinend die Dinge, die ganz von selbst Neugier geweckt und einem nach und nach etwas beigebracht haben, ohne dass man sie ausdrücklich lehren musste
Ein Beispiel dafür ist die rote Festplatten-LED früherer Computer, ein kleines Detail, das einem zeigte, dass die Platte gerade arbeitet. Wenn sie in einem bestimmten Muster blinkte und dazu das befriedigende Geräusch schneller Festplattenzugriffe zu hören war, wusste man, dass das Spiel diesmal wirklich geladen werden würde. Es scheint ein guter Kompromiss zu sein, eine erweiterte Ansicht zu verstecken, aber dennoch beizubehalten, damit neugierige Menschen sie entdecken können; genau solche Leute werden wahrscheinlich die nächste Generation von Computer-Nerds, die die Welt am Laufen halten
Es gibt ein Utility namens pixd, das in der Kommandozeile eine ähnliche Datenvisualisierung erzeugt: https://github.com/FireyFly/pixd
Es zeigt allerdings nur eine statische Darstellung binärer Daten und ist nicht so beeindruckend wie das animierte GIF von buredoranna, in dem Veränderungen im Filesystem über die Zeit sichtbar werden. Solche Pixelanordnungen können nützlicher sein, wenn man sie statt zeilenweise entlang einer Hilbert-Kurve anordnet. Ich habe diese Methode durch das Ghidra-Plugin cantordust kennengelernt, und 3blue1brown liefert eine mathematische Intuition dafür, warum Pixelanordnungen auf Hilbert-Kurven so effektiv sind
https://inside.battelle.org/blog-details/battelle-publishes-open-source-binary-visualization-tool
https://www.youtube.com/watch?v=3s7h2MHQtxc&t=311s
Die nbdkit-Demo, die Filesystem-I/O visualisiert, war interessant: https://rwmj.wordpress.com/2018/11/04/nbd-graphical-viewer/
Durch diesen Beitrag angeregt habe ich folgendes Experiment ausprobiert
dd if=/dev/zero bs=1K count=$(( 256 * 3 )) of=a.ext4mfks.ext4 a.ext4mkdir asudo mount a.ext4 acd asudo chown 1000:1000 .python3 -c 'open("a", "wb").write(b"\xff\x00\x00" * 2000)'python3 -c 'open("b", "wb").write(b"\xff\xff\x00" * 2000)'python3 -c 'open("c", "wb").write(b"\xff\x00\xff" * 2000)'cd ..sudo umount a(echo -n 'P6\n512 512\n255\n' ; cat a.ext4 ) > a.ppmconvert a.ppm a.pngDas resultierende a.png ist reversibel. Wenn man es wieder in eine
.ppm-Datei umwandelt und dann die ersten 15 Bytes überspringt, sollte wieder eine gültige.ext4herauskommenSehr cool. Solche Datenvisualisierungen helfen enorm dabei zu verstehen, wie Disk-Formate Daten tatsächlich auf dem Datenträger anordnen, etwa Details wie die sorgfältige Vorabzuweisung von Metadaten für einen Teil der Nutzung
Ich hätte auch gern gesehen, was passiert, wenn der Platz komplett voll ist, aber leider endet die Animation schon vorher
Eine schöne Kindheitserinnerung ist es, vor dem Computer zu sitzen und dem alten Defragmentierungsprogramm von Windows 95/98 beim Arbeiten zuzusehen: https://academy.avast.com/hs-fs/hubfs/New_Avast_Academy/how_to_defrag_your_pc_hard_drive_academy_refresh/img-06.png?width=600&name=img-06.png
Das erinnerte mich an innodb_ruby: https://github.com/jeremycole/innodb_ruby
Das ist eine sehr nützliche Werkzeugsammlung, um InnoDB-Strukturen zu visualisieren und zu verstehen. Ein Anwendungsbeispiel gibt es hier: https://blog.jcole.us/2014/10/02/visualizing-the-impact-of-ordered-vs-random-index-insertion-in-innodb/
Falls der Autor diesen Kommentar sieht: Wenn man das GIF in ein Video umwandelt, reduziert das die übertragenen Bytes, und Nutzer können Videosteuerungen wie Pause, Scrubbing und Geschwindigkeitsregelung verwenden
Zum Beispiel kann man mit
ffmpeg -i ext4.gif -pix_fmt yuv420p -c:v libx264 ext4.mp4konvertierenMit Kaitai IDE kann man verschiedene Binärformate auf Byte-Ebene und sogar auf Bit-Ebene visualisieren. Wenn ich mich richtig erinnere, gibt es auch eine ext4-Definitionsdatei
Beim Ansehen dieses Diagramms habe ich mich gefragt, ob es Filesysteme gibt, die Metadaten auf einem separaten Gerät speichern können
Zum Beispiel die Daten auf einer HDD und die Metadaten auf einer angeschlossenen SSD. Metadaten lassen sich allerdings viel leichter im Speicher cachen, daher ist der Vorteil vermutlich nicht groß genug, um die zusätzliche Komplexität aufzuwiegen
https://klarasystems.com/articles/openzfs-understanding-zfs-vdev-types/