EXT3: Wenn die Blockgröße 4 KB beträgt, warum zeigt ls -l Dateigrößen darunter an?

16

Wenn Sie ls -l für eine Datei ausführen, die einen Buchstaben enthält, wird sie mit einer Größe von 2B angezeigt. Wenn sich Ihr Dateisystem in 4k-Blöcken befindet, dachte ich, dass es Dateien auf die Blockgröße aufrundet? Liegt es daran, dass ls -l tatsächlich die Byteanzahl von der Inode liest? Unter welchen Umständen werden Sie aufgerundet, um Antworten gegen die tatsächliche Anzahl von Bytes in Linux 2.6 Kernel GNU-Utils zu blockieren?

Gregg Leventhal
quelle
2
Beachten Sie, dass ext4 das Konzept des " Packens
oakad

Antworten:

20

Ich nehme an, Sie haben diesen einen Buchstaben in der Datei mit echo a > fileoder vim file, was bedeutet, Sie haben diesen Buchstaben und eine zusätzliche neue Zeile (zwei Zeichen, also zwei Bytes). ls -lzeigt Dateigröße in Bytes, keine Blöcke (um genauer zu sein: Dateilänge ):

$ echo a > testfile
$ ls -l testfile
-rw-r--r-- 1 user user 2 Apr 28 22:08 testfile
$ cat -A testfile
a$

(Hinweis, dass cat -AZeilenumbrüche als $Zeichen angezeigt werden )

Im Gegensatz zu ls -l, dudie reale Größe wird zeigen , belegt auf der Festplatte:

$ du testfile
4

( duZeigt die Größe in 1-KB-Einheiten an. Hier beträgt die Größe also 4 × 1024 Byte = 4096 Byte = 4 KB, was der Blockgröße in diesem Dateisystem entspricht.)

Um dies zu lszeigen, müssen Sie die -sOption anstelle von / zusätzlich zu -l:

$ ls -ls testfile
4 -rw-r--r-- 1 user user 2 Apr 28 22:08 testfile

Die erste Spalte ist die zugewiesene Größe, wiederum in Einheiten von 1 KB. Letzter kann geändert werden, indem --block-sizez

$ ls -ls --block-size=1 testfile
4096 -rw-r--r-- 1 aw aw 2 Apr 28 22:08 testfile
Andreas Wiese
quelle
3
Und außerdem ist es schön, die beiden Informationen zu haben. Dateisysteme können "Tail-Komprimierung" (sp?) (Verwenden Sie einen Block, der von kurzen Dateien gemeinsam genutzt wird), "Copy on Write" und "Hole Punching" ausführen.
Rmano
9

Ich denke, dass die tiefe Antwort die folgende ist:

Die Länge der logischen Datei und der belegte Speicherplatz unterscheiden sich erheblich.

Wie die anderen Antworten zeigen, hat eine mit zwei Bytes erstellte Datei im Prinzip eine Länge von zwei Bytes (show by ls -l) und belegt 4 KB (show by duoder ls -ls).

Sehen:

1& [:~/tmp] % echo -n A > test
1& [:~/tmp] % ls -l test
-rw-rw-r-- 1 romano romano 1 Apr 28 14:31 test
1& [:~/tmp] % du test
4 test

Ok, testhat Länge 1 und Größe (auf Platte) 4 KiB. Aber:

1& [:~/tmp] % truncate -s +8191 test
1& [:~/tmp] % ls -l test
-rw-rw-r-- 1 romano romano 8192 Apr 28 14:33 test
1& [:~/tmp] % du test
4   test

(Der erste Befehl addiert 8191 zu Null Bytes test). Der Test hat jetzt die Länge 8192, belegt aber immer noch 4 KiB auf der Festplatte (er hat ein "Loch") (1).

Einige Dateisysteme können auch kurze Dateien komprimieren, sodass sie weniger Platz durch gemeinsame Nutzung von Blöcken belegen (siehe zum Beispiel Tail Packing ), und andere wie btrfs kopieren beim Schreiben , also die Beziehung zwischen einer Datei, ihrer logischen Länge und wie viel Platz sie belegt Eine Scheibe ist eine komplexe.

Fußnoten:

(1) Es ist nicht wirklich ein Loch , es ist am Ende ... aber es funktioniert trotzdem bis zum Ende des Beispiels.

Rmano
quelle
5

ls -list nur ein langes Format. ls -lswird verwendet, um die Blockgröße anzuzeigen.

Testen

echo "1" > 1.txt

bash-3.2$ ls -l 1.txt
-rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt

Wie wir sehen können, ist die Größe der Datei mit 2B angegeben. Wenn Sie jedoch die Blockgröße überprüfen müssen, müssen Sie den folgenden Befehl ausführen.

bash-3.2$ ls -ls 1.txt
4 -rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt

Die 4 oben zeigt die verwendete Blockgröße an. Dies können wir auch mit dem statBefehl überprüfen .

bash-3.2$ stat 1.txt
  File: `1.txt'
  Size: 2               Blocks: 8          IO Block: 4096   regular file
Device: 805h/2053d      Inode: 48267720    Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  505/  ramesh)   Gid: (  508/  ramesh)
Access: 2014-04-28 15:17:31.000000000 -0500
Modify: 2014-04-28 15:15:58.000000000 -0500
Change: 2014-04-28 15:15:58.000000000 -0500

Nun stellt sich die Frage, warum ls -lsdie Blockgröße als 4 aufgelistet wird, während statdie Blockgröße als 8 angezeigt wird. Der Grund für dieses Verhalten wird in der Antwort hier klar erläutert .

Viele Festplatten haben eine Sektorgröße von 512 Byte, was bedeutet, dass beim Lesen oder Schreiben auf der Festplatte jeweils ein 512-Byte-Sektor übertragen wird. Es ist ganz natürlich, Dateisysteme zu entwerfen, in denen ein Sektor nicht zwischen Dateien aufgeteilt ist (was das Design verkomplizieren und die Leistung beeinträchtigen würde). Aus diesem Grund verwenden Dateisysteme normalerweise 512-Byte-Blöcke für Dateien. Daher geben traditionelle Dienstprogramme wie lsund duGrößen in Einheiten von 512-Byte-Blöcken an.

Ramesh
quelle