Perché le dimensioni delle directory sono diverse nell'output ls -l sul file system XFS?


1

Non riesco a capire perché ls -l mostri le dimensioni della cartella meno della dimensione del blocco.

Per esempio:

[user@01 NEW]$ ls -l
total 4
drwxr-xr-x  5 root root   78 Apr 22 00:43 controllers
drwxr-xr-x 14 root root 4096 Apr 22 00:44 schemas
drwxr-xr-x  2 root root   38 Apr 22 00:44 spinner

"controller" è una directory e la dimensione del blocco è 4096 byte, quindi perché la dimensione è 78 byte?

[user@01 NEW]$ find controllers/ -type f|wc -l
73

Molti file sono all'interno. E du -hs mostra che la dimensione di questa cartella è 840K.

Un'altra cosa strana è che ls -s mostra che per queste due directory sono stati assegnati 0 blocchi:

[user@01 NEW]# ls -ls
total 4
0 drwxr-xr-x  5 root root   78 Apr 22 00:43 controllers
4 drwxr-xr-x 14 root root 4096 Apr 22 00:44 schemas
0 drwxr-xr-x  2 root root   38 Apr 22 00:44 skins

xfs_info:

 xfs_info /
meta-data=/dev/disk/by-uuid/5d87d678-e4cc-445f-b770-4e4c0357faaa isize=256    agcount=4, agsize=393088 blks
         =                       sectsz=512   attr=2
data     =                       bsize=4096   blocks=1572352, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

Nelle dimensioni di cartelle ext4 è normale (vale a dire uguale alla dimensione del blocco).

Risposte:


2

La dimensione è 78 byte perché la directory è quasi vuota. Con "directory" intendo il contenuto diretto discendente di quella cartella, ad esempio, se lo si possiede

.../controllers/
                Class1/Whatever
                      /Resources...
                Class2/Whatever
                      /Resources...

quindi "controllori" ha solo tre voci (.., Class1 e Class2. Non so esattamente se o come .. è effettivamente memorizzato).

Anche se, su disco, la directory occuperà un intero blocco, quindi 4K ( ma vedi sotto ... ), la directory dimensione logica rimane 78 byte e in molti modi viene trattato come un file (il White paper XFS si riferisce ad esso come a file di directory ). Se si crea un nuovo oggetto immediatamente sotto controllers, Mi aspetto che la dimensione aumenti.

https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/ch07s03s02s02.html

Inoltre, è possibile memorizzare directory molto piccole all'interno degli inode , occupando quindi zero blocchi reali:

File molto piccoli

La maggior parte dei collegamenti simbolici e file di directory sono piccoli file. XFS consente   questi file devono essere memorizzato in inode per aumentare le prestazioni. Anche XFS   utilizza le scritture ritardate per attendere di raccogliere l'intero file piccolo nel file   buffer cache prima di scrivere su disco ...

Per ricapitolare, per quanto ho capito, puoi avere

analisi

Lo spazio disponibile all'interno di un inode XFS per un file di directory sembra essere intorno a 156-157 byte sul mio sistema Linux. Quando viene superato, viene utilizzato un blocco 4K, ma rilasciando spazio rilascia anche il blocco, memorizzando le informazioni nell'inode.

mkdir temp

drwxr-xr-x   2 root   root               6 2013-04-22 08:59 temp

touch temp/x; ls -la temp

drwxr-xr-x   2 root   root              14 2013-04-22 09:00 temp

mv temp/x temp/{ 100 x's }

drwxr-xr-x   2 root   root             113 2013-04-22 09:01 temp

{ 130 x's }

drwxr-xr-x   2 root   root             143 2013-04-22 09:02 temp

{ 140 x's }    
drwxr-xr-x   2 root   root             153 2013-04-22 09:02 temp

{ 146 x's }
drwxr-xr-x   2 root   root            4096 2013-04-22 09:03 temp

{ 142 x's }
drwxr-xr-x   2 root   root             155 2013-04-22 09:03 temp

Grazie, l'articolo di Redhat dice: "Per la dimensione di inode predefinita di 256 byte, sono disponibili circa 100 byte di spazio per gli attributi a seconda del numero di puntatori di estensione dei dati memorizzati anche nell'inode." Quindi, significa che la dimensione della cartella non può essere superiore a 100 b (se memorizzata in inode). Ma alcune directory hanno dimensioni 130 e più byte (anche per loro vengono assegnati 0 blocchi).
loadaverage

Probabilmente, l'area letterale di un inode del file di directory è più grande (il core inode è 96 byte, che lascia 160). Puoi sperimentare creando un file con un nome più lungo e più lungo.
LSerni

L'ho fatto per curiosità, lo spazio reale sembra essere compreso tra 155 e 159 byte. La parte che hai citato faceva riferimento a un file con attributi estesi e puntatori di estensione dei dati, ma una piccola directory può fare a meno di entrambi e quindi avere più spazio disponibile.
LSerni

Sì, l'ho provato, la dimensione è la stessa (~ 160 byte). Grazie per l'aiuto.
loadaverage
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.