Por que todo diretório tem um tamanho de 4096 bytes (4 K)?

33

Como o sujeito diz; Quero saber por que todos os diretórios têm um tamanho igual a 4K, mesmo que contenham arquivos com tamanhos maiores que 4K.

Por favor, dê uma olhada no seguinte: -

$ ls -lh
total 2.0M
drwxr-xr-x 4 ankit ankit 4.0K Sep 11 07:28 Desktop

$ ls -lrh Desktop/
-rw-rw-r-- 1 ankit ankit 9.1M Aug 4 11:15 sophosthreatsaurusaz.pdf
-rw------- 1 ankit ankit 107K Dec 27 2010 KP 3 0.pdf
drwxrwsr-x 9 ankit ankit 4.0K Sep 10 19:26 eclipse

PS: Estou ciente do du -shutilitário de linha de comando.

Edit: Estou assumindo o diretório como um contêiner para arquivos.

Ankit
fonte
São os metadados do diretório
Tachyons

Respostas:

34
  • Sem ser muito técnico, pense em uma entrada de diretório como simplesmente um "link" para uma lista dos arquivos que o diretório "contém".
  • Então, como em tudo, lsmostra o tamanho desse link , não o espaço total ocupado pelo conteúdo do diretório.
  • O tamanho mínimo que uma entrada / link de arquivo ou diretório deve ocupar é um bloco, que geralmente é de 4096 bytes / 4K na maioria dos sistemas de arquivos ext3 / 4.
ish
fonte
7
Você diz que "O tamanho mínimo que uma entrada / link de arquivo ou diretório deve ocupar é um bloco", mas tenho certeza de que vi tamanhos de arquivo inferiores a 4K.
Lakshay Garg
1
@LakshayGarg, embora o arquivo possa ser menor que 4K, causará o que é chamado de "fragmentação interna", onde apenas alguns bytes do bloco foram usados ​​para armazenar o arquivo pequeno.
Phloflash #
@phyloflash alguns sistemas de arquivos (por exemplo, NTFS) armazenam pequenos arquivos nas próprias entradas de arquivo (para NTFS, está na entrada MFT). Dessa maneira, seu conteúdo ocupa zero blocos de alocação e a fragmentação interna é reduzida.
Ruslan
26

Para entender isso, é melhor você ter algum conhecimento básico do seguinte (sistema de arquivos):

  • inode (contém atributos do arquivo, metadados do arquivo, estrutura do ponteiro)
  • arquivo (pode ser considerada uma tabela com 2 colunas, nome do arquivo e seu inode, o inode aponta para os blocos de dados brutos no dispositivo de bloco)
  • diretório (apenas um arquivo especial, contêiner para outros nomes de arquivos. Ele contém uma matriz de nomes de arquivos e números de inode para cada nome de arquivo. Também descreve a relação entre pai e filhos.)
  • link simbólico VS hard link
  • dentry (entradas de diretório)
  • ...

No ext4sistema de arquivos típico (o que a maioria das pessoas usa), o inodetamanho padrão é 256 bytes, o tamanho do bloco é 4096 bytes.

Um diretório é apenas um arquivo especial que contém uma matriz de nomes de arquivos e números de inode. Quando o diretório foi criado, o sistema de arquivos alocou 1 inode ao diretório com um "nome de arquivo" (na verdade, nome do diretório). O inode aponta para um único bloco de dados (sobrecarga mínima), que é 4096 bytes. É por isso que você vê 4096 / 4.0K ao usar ls.

Você pode obter os detalhes usando tune2fs& dumpe2fs.

Exemplo

root@ubuntu:~# tune2fs -l /dev/ubuntu/root 
tune2fs 1.42 (29-Nov-2011)
Filesystem volume name:   <none>
Last mounted on:          /
Filesystem UUID:          2fca4cbb-22f1-4328-ab13-cacedb360930
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              967680
Block count:              3931136
Reserved block count:     0
Free blocks:              2537341
Free inodes:              517736
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      416
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8064
Inode blocks per group:   504
RAID stride:              35637
Flex block group size:    16
Filesystem created:       Thu Mar 15 14:31:04 2012
Last mount time:          Sat Oct 20 20:28:04 2012
Last write time:          Sat Oct 20 20:23:32 2012
Mount count:              1
Maximum mount count:      -1
Last checked:             Sat Oct 20 20:22:57 2012
Check interval:           0 (<none>)
Lifetime writes:          54 GB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:           256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
First orphan inode:       272350
Default directory hash:   half_md4
Directory Hash Seed:      d582ad79-75a0-4964-9a48-33ddba04df5c
Journal backup:           inode blocks
Terry Wang
fonte
7

Se um arquivo contiver todos os dados (mesmo um único byte), ele ocupará um bloco no disco (que normalmente é de 4k hoje em dia). Um bloco não pode ser compartilhado entre arquivos. Isso significa que o espaço desse bloco inteiro não estará disponível para outros arquivos, por isso é considerado "usado".

Fonte

ThiagoPonte
fonte