Warum sind Textdateien 4kB?

47

Wenn ich unter OS X eine Textdatei erstelle, sind es aus irgendeinem Grund immer mindestens 4 KB, es sei denn, sie ist leer. Warum ist das? Könnten 4.000 Bytes Metadaten zu 1 Byte Klartext vorhanden sein?

Bildbeschreibung hier eingeben

tkbx
quelle
16
4096 Bytes, nicht 4000.
Mechanische Schnecke
8
@Mechanicalsnail 4095. Sie haben das eine Byte der aktuellen Daten vergessen
Tobias Kienzler
5
@Mechanicalsnail es ist ein Schaltjahr, nicht wahr? xkcd.com/394 :P
tkbx

Antworten:

52

Die Blockgröße des Dateisystems muss 4 kB betragen. Wenn Daten in eine Datei geschrieben werden, die in einem Dateisystem enthalten ist, muss das Betriebssystem Speicherblöcke zuweisen, um die Daten zu enthalten, die in die Datei geschrieben werden.

Wenn ein Dateisystem erstellt wird, wird der in diesem Dateisystem enthaltene Speicher in der Regel in Blöcke fester Größe unterteilt. In diesem Wikipedia-Artikel wird dieser Vorgang kurz erläutert.

Die zugrunde liegende Blockgröße des Dateisystems für diese Datei muss eine Blockgröße von 4 KB aufweisen. Diese Datei verwendet 1 4K-Block und nur ein Byte in diesem Block enthält tatsächliche Daten.

HeatfanJohn
quelle
10
Ein Kommentar: In Windows wird standardmäßig die tatsächliche Dateigröße und die Größe auf der Festplatte im Bereich Optionen angezeigt.
Joe Z.
Kann ein Block also verschiedene Dateien aufnehmen?
sudeepdino008
@ sudeepdino008 nein, ein Block (mindestens) für jede Datei (Linux 'ext-Dateisystem hat / hatte (?) eine Option zum Platzieren mehrerer Dateien in einem Block, aber das ist eine Ausnahme von der Regel)
Ro-ee
13

Alle Dateisysteme haben eine Cluster- oder Blockgröße oder den kleinsten verfügbaren Speicherplatz für eine Datei. Auch wenn die tatsächliche Dateigröße kleiner als die Cluster- / Blockgröße ist, wird dennoch ein Cluster oder 4 KB auf Ihrem Dateisystem belegt. Die Clustergröße hängt vom Dateisystem und den Dateisystemoptionen ab.

Wenn es, wie Gilles betonte, null Bytes enthält, werden auf typischen * nix-Dateisystemen keine Blöcke / Cluster, sondern nur ein Inode verwendet, wodurch die Einschränkung besser beantwortet wird, "es sei denn, es ist leer".

Christopher
quelle
6
„Auch wenn eine Dateigröße null Byte beträgt, wird dennoch ein Cluster belegt.“ Nein: Auf typischen Unix-Dateisystemen verbraucht eine leere Datei einen Inode und null Blöcke, und es gibt keine Vorstellung von Cluster, die sich von Blöcken unterscheidet.
Gilles 'SO - hör auf böse zu sein'
8

Ein kleines Experiment zur Veranschaulichung:

Lassen Sie uns zunächst die tatsächliche Blockgröße meiner root ext4 (LVM) -Partition ermitteln:

[root@fedora17 blocksize]# dumpe2fs /dev/mapper/vg_fedora17-lv_root | grep -i "block size"
dumpe2fs 1.42.3 (14-May-2012)
Block size:               4096

Es ist erwartungsgemäß 4096 (4 KiB). Lassen Sie uns nun drei Dateien erstellen: Die erste ist null Byte, die zweite ist nur ein Byte und die dritte ist 4 KiB (die Blockgröße):

[root@fedora17 blocksize]# touch 0_bytes.bin
[root@fedora17 blocksize]# dd if=/dev/zero of=1_byte.bin bs=1 count=1
[root@fedora17 blocksize]# dd if=/dev/zero of=4096_bytes.bin bs=1 count=4096


Nun haben wir lsdas Verzeichnis. Wir verwenden die -sOption, um die zugewiesene Größe (die am weitesten links stehende Spalte) in der Anzahl von 1024-Byte- "Blöcken" anzuzeigen.
(ls weiß nicht, dass die tatsächliche Blockgröße 4096 ist - wir könnten angeben, --block-sizeaber das skaliert alles um diesen Wert, und wir möchten auch die tatsächliche Dateigröße in Bytes sehen) .

[root@fedora17 blocksize]# ls -ls
total 8
0 -rw-r--r--. 1 root root    0 Jan 21 23:56 0_bytes.bin
4 -rw-r--r--. 1 root root    1 Jan 21 23:38 1_byte.bin
4 -rw-r--r--. 1 root root 4096 Jan 21 23:38 4096_bytes.bin

Zwei Dinge können hier festgestellt werden:

  • Die Null-Byte-Datei belegt keine Blöcke im Dateisystem und bestätigt damit, was Giles angegeben hat .
  • Obwohl die beiden anderen Dateien unterschiedliche Dateigrößen haben, belegen beide 4 * 1024 = einen 4KiB ext4-Block.

Sparse-Dateien

Sparse-Dateien sind Dateien mit großen Nullenblöcken. Da bekannt ist, dass die Daten alle Null sind, macht es keinen Sinn, sie auf der Festplatte zu speichern. Auf diese Weise kann die scheinbare Größe einer Datei tatsächlich größer sein als die Größe der Festplatte.

Inline-Daten

Beachten Sie, dass bei einigen Dateisystemen der Inhalt sehr kleiner Dateien im Inode selbst gespeichert werden kann. Siehe Ist es möglich, Daten direkt in einem Inode in einem Unix / Linux-Dateisystem zu speichern? .

Jonathon Reinhart
quelle
Ja, Sie sind ganz richtig. 4 KB entspricht der Größe, die das Dateisystem zum Speichern von Informationen zum Speichern der Datei im Dateisystem verwendet. Es werden Dinge wie der Index der Datei vom Anfang eines Blocks, der Index des Blocks und die Größe des von der Datei verwendeten Speichers gespeichert, die 4k aufbrauchen. Diese Informationen werden verwendet, um auf die Textdatei aus dem Dateisystem zu verweisen.
Pvn
2
Das ist falsch. Dateimetadaten, wie Sie sie erwähnen, "verschlingen" keines der 4 KB. Diese Strukturen sind Teil des Dateisystem-Formatierungsaufwands. Siehe meine Antwort oben als Beweis. Wenn das, was Sie sagten, wahr wäre, würde meine 4096-Byte-Datei mehr als einen Block benötigen.
Jonathon Reinhart
Zeiger auf die Datei (Segment-Nr., BLK-Nr.) Im Dateisystem sind die Dinge, die gespeichert werden müssen und die die Zuweisung eines Blocks erfordern. Wenn die Textdatei sehr wenig Inhalt hat, der in den ersten Block passt, der ihr bereits zugewiesen wurde, ist keine zweite Blockzuweisung erforderlich. Ich stimme zu, dass 4k nicht vollständig für die Metadaten verwendet wird und interne Fragmentierungen auftreten.
Pvn
2
Ich sage, dass keine der 4 KiB-Blockgrößen für Metadaten verwendet wird. Ich denke mein Beispiel beweist das.
Jonathon Reinhart
2
@pvn: Jonathon ist richtig. Metadaten werden im Inode für die Datei gespeichert, der von dem Block getrennt ist, der zum Speichern von Dateidaten verwendet wird.
Mechanische Schnecke