Por que o tamanho dos diretórios é diferente na saída ls -l no sistema de arquivos XFS?

1

Não consigo entender porque ls -l mostra o tamanho da pasta menor que o tamanho do bloco.

Por exemplo:

[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

"controllers" é um diretório, e o tamanho do bloco é 4096 bytes, então por que o tamanho é 78 bytes?

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

Muitos arquivos estão dentro. E du-hs mostram que o tamanho dessa pasta é 840K.

Outra coisa estranha é que ls -s mostra que para esses dois diretórios alocados 0 blocos:

[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

No tamanho das pastas ext4 é normal (isto é, igual ao tamanho do bloco).

    
por loadaverage 21.04.2013 / 23:56

1 resposta

2

O tamanho é 78 bytes porque o diretório está quase vazio. Com "diretório" quero dizer o conteúdo descendente imediato dessa pasta, ou seja, se você tiver

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

então "controllers" só tem três entradas (.., Class1 e Class2. Eu não sei exatamente se ou como .. está realmente armazenado).

Mesmo se, no disco, o diretório ocupar um bloco inteiro, portanto 4K ( mas veja abaixo ... ), o diretório tamanho lógico permanece em 78 bytes, e, em muitos aspectos, é tratado como um arquivo (os white papers XFS refere-se a ele como um arquivo de diretório ). Se você criar um novo objeto imediatamente abaixo de controllers , espero que esse tamanho seja incrementado.

link

Além disso, diretórios muito pequenos podem ser armazenados dentro de inodes , ocupando, assim, blocos reais zero:

Very small files

Most symbolic links and directory files are small files. XFS allows these files to be stored in inodes for increased performance. XFS also uses delayed writes to wait to gather the entire small file in the buffer cache before writing to disk...

Para recapitular, pelo que entendi, você pode ter

Teste

O espaço disponível dentro de um inode do XFS para um arquivo de diretório parece estar em torno de 156-157 bytes no meu sistema Linux. Quando excedido, um bloco de 4K é usado, mas liberar espaço também libera o bloco, armazenando a informação no 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
    
por 22.04.2013 / 00:18