EXT3: Se la dimensione del blocco è 4K, perché ls -l mostra dimensioni del file inferiori a quella?


16

Se esegui ls -l su un file che contiene una lettera, verrà elencato come dimensione 2B. Se il tuo file system è in blocchi 4k, ho pensato che arrotondasse i file fino alla dimensione del blocco? È perché ls -l legge effettivamente il conteggio dei byte dall'inode? In quali circostanze viene arrotondato per bloccare le risposte rispetto alle risposte effettive del conteggio dei byte nelle utility GNU del kernel Linux 2.6?


2
Tenete presente che ext4 introduce un concetto di "impacchettamento di piccoli file", per cui un piccolo file occuperà lo stesso blocco del disco che occupa il suo inode (e quindi, evitando di sprecare blocchi del disco): lwn.net/Articles/469805
Oakad,

Risposte:


20

Immagino che tu abbia quella lettera nel file con echo a > fileo vim file, il che significa che avrai quella lettera e una nuova riga aggiuntiva (due caratteri, quindi due byte). ls -lmostra la dimensione del file in byte, non in blocchi (per essere più specifici: lunghezza del file ):

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

(nota che cat -Amostra le nuove righe come $carattere)

Al contrario ls -l, dumostrerà la dimensione reale occupata sul disco:

$ du testfile
4

(in realtà, dumostra la dimensione in unità da 1 kB, quindi qui la dimensione è 4 × 1024 byte = 4096 byte = 4 kiB, che è la dimensione del blocco su questo file system)

Per lsmostrare questo, dovrai usare l' -sopzione invece di / in aggiunta a -l:

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

La prima colonna è la dimensione allocata, sempre in unità di 1 kB. L'ultimo può essere modificato specificando --block-size, ad es

$ ls -ls --block-size=1 testfile
4096 -rw-r--r-- 1 aw aw 2 Apr 28 22:08 testfile

3
E, inoltre, è bello avere le due informazioni. I filesystem possono fare "compattazione di coda" (sp?) (Usare un blocco condiviso tra file corti), "copia su scrittura" e "perforazione" ... rendendo complessa la relazione spazio su disco <->.
Rmano,

9

Penso che la risposta profonda sia la seguente:

La lunghezza del file logico e lo spazio su disco occupato sono cose molto diverse.

Come mostrano le altre risposte, in linea di principio un file creato con due byte ha una lunghezza di due byte (mostra per ls -l) e occupa 4 KiB (mostra per duo ls -ls).

Vedere:

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, testha lunghezza 1 e dimensioni (su disco) 4 KiB. Ma:

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

(il primo comando aggiunge 8191 byte zero a test), ora il test ha una lunghezza di 8192 ma occupa ancora 4 KiB sul disco (ha un "buco") al suo interno (1).

Alcuni filesystem possono anche compattare file corti in modo da occupare meno spazio condividendo blocchi (vedi ad esempio tail pack ) e altri come btrfs copiano in scrittura , quindi la relazione tra un file, la sua lunghezza logica e lo spazio su cui occupa un disco è complesso.

Note:

(1) Non è proprio un buco , è alla fine ... ma funziona ancora fino alla fine dell'esempio.


5

ls -lè solo un formato lungo. ls -lsviene utilizzato per visualizzare la dimensione del blocco.

analisi

echo "1" > 1.txt

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

Come possiamo vedere, la dimensione del file è elencata come 2B. Tuttavia, se è necessario verificare la dimensione del blocco, è necessario eseguire il comando seguente.

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

Il precedente 4 mostra le dimensioni del blocco utilizzate. Possiamo anche verificare lo stesso usando il statcomando.

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

Ora sorge la domanda sul perché ls -lselenca la dimensione del blocco come 4 mentre statmostra la dimensione del blocco come 8. Il motivo di questo comportamento è chiaramente spiegato nella risposta qui .

Molti dischi hanno una dimensione del settore di 512 byte, il che significa che qualsiasi lettura o scrittura sul disco trasferisce un intero settore di 512 byte alla volta. È del tutto naturale progettare filesystem in cui un settore non è suddiviso tra file (il che complicherebbe la progettazione e danneggerebbe le prestazioni); pertanto i filesystem tendono ad usare blocchi da 512 byte per i file. Quindi utility tradizionali come lse duindicano dimensioni in unità di blocchi da 512 byte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.