Kann eine Datei nicht gespeichert werden sequentiell auf Platte? Ich meine, ein Teil der Datei befindet sich unter der physikalischen Adresse X und der andere Teil unter der physikalischen Adresse Y, die nicht in der Nähe von X + Offset liegt).
Ja; Dies wird als Dateifragmentierung bezeichnet und ist nicht ungewöhnlich, insbesondere bei größeren Dateien. Die meisten Dateisysteme weisen Speicherplatz nach Bedarf zu, mehr oder weniger sequentiell, aber sie können das zukünftige Verhalten nicht abschätzen – wenn Sie also 200 MiB in eine Datei schreiben und dann weitere 100 MiB hinzufügen, besteht eine Wahrscheinlichkeit ungleich Null, dass beide Datensätze dies tun in verschiedenen Bereichen der Festplatte gespeichert werden (grundsätzlich könnte jeder andere Schreibvorgang, der mehr Speicherplatz auf der Festplatte benötigt und nach dem ersten Schreibvorgang und vor dem zweiten erfolgt, zwischen den beiden liegen). Wenn ein Dateisystem fast voll ist, wird die Situation normalerweise schlimmer:Es gibt möglicherweise keinen zusammenhängenden Bereich mit freiem Speicherplatz, der groß genug ist, um eine neue Datei aufzunehmen, also muss es fragmentiert werden.
Kann ich die Dateireihenfolge irgendwie steuern? Ich möchte eine große Datei mit 10 GB zuweisen. Ich möchte, dass es auf der Festplatte sequentiell ist und nicht zwischen verschiedenen Offsets aufgeteilt wird.
Sie können dem Dateisystem die Zielgröße Ihrer Datei mitteilen, wenn sie erstellt wird; Dies hilft dem Dateisystem, es optimal zu speichern. Viele moderne Dateisysteme verwenden eine Technik, die als verzögerte Zuordnung bekannt ist, bei der das Festplattenlayout einer neuen Datei so spät wie möglich berechnet wird, um die verfügbaren Informationen zu maximieren, wenn die Berechnung durchgeführt wird. Sie können diesen Prozess unterstützen, indem Sie den posix_fallocate(3)
verwenden Funktion, um dem Dateisystem mitzuteilen, wie viel Speicherplatz insgesamt zugewiesen werden soll. Moderne Dateisysteme werden versuchen, diese Zuordnung sequentiell durchzuführen.
Verhält es sich zwischen den verschiedenen Typen unterschiedlich?
Unterschiedliche Dateisysteme verhalten sich unterschiedlich, ja. Protokollbasierte Dateisysteme wie NILFS2 weisen Speicherplatz nicht auf die gleiche Weise zu wie Extent-basierte Dateisysteme wie Ext4, und das ist nur ein Beispiel für eine Variation.
Der Befehl filefrag
wird Ihnen sagen, wie Ihre Datei physisch auf Ihrem Gerät gespeichert ist:
# filefrag -v /var/log/messages.1
Filesystem type is: ef53
File size of /var/log/messages.1 is 41733 (11 blocks, blocksize 4096)
ext logical physical expected length flags
0 0 2130567 1
1 1 15907576 2130568 1
2 2 15910400 15907577 1
3 3 15902720 15910401 7
4 10 2838546 15902727 1 eof
/var/log/messages.1: 5 extents found
Wenn Sie Ihre Datei in einem Durchgang schreiben, wird Ihre Datei meiner Meinung nach nicht fragmentiert.
Die Manpage von fallocate
(1) ist ziemlich klar :
fallocate
wird verwendet, um Blöcke einer Datei vorab zuzuordnen. Für Dateisysteme, die den fallocate
unterstützen Systemaufruf erfolgt dies schnell, indem Blöcke zugewiesen und als nicht initialisiert markiert werden, was keine IO zu den Datenblöcken erfordert. Das geht viel schneller, als eine Datei zu erstellen, indem man sie mit Nullen füllt.
Ab dem Linux-Kernel v2.6.31 ist der fallocate
Systemaufruf wird von den Dateisystemen btrfs, ext4, ocfs2 und xfs unterstützt.
Ist es sequentiell? Das System versucht zunächst, die Blöcke der Reihe nach zuzuweisen. Wenn dies nicht möglich ist, werden Sie nicht gewarnt.
Sie erwähnen Sparse-Dateien, und keine der anderen Antworten hat sie erwähnt.
Die meisten Dateien sind nicht spärlich. Die gebräuchlichste Art, eine Datei zu erstellen, besteht darin, alles auf einmal zu schreiben, von Anfang bis Ende. Da sind keine Löcher.
Sie dürfen jedoch sagen:"Gehe zur Position 1.000.000.000.000 und schreibe dort ein Byte." Dadurch wird eine Datei erstellt, die aussieht, als wäre sie ein Etabyte groß, verwendet aber tatsächlich nur (wahrscheinlich) 4k auf der Festplatte. Dies ist eine Sparse-Datei.
Sie können dies mehrmals für dieselbe Datei tun, wobei kleine Datenmengen über die riesige Leere verstreut bleiben.
Das kann zwar nützlich sein, hat aber zwei Nachteile.
Die erste ist, dass die Datei fragmentiert wird, worüber Sie sich Sorgen gemacht haben.
Zweitens verarbeiten nicht alle Programme diese Dateien gut. Z.B. Einige Backup-Software wird versuchen, die Leere zu sichern und dadurch ein Backup zu erstellen, das viel größer als nötig ist, möglicherweise zu groß für das Sicherungsmedium.