A estrutura interna dos diretórios depende do sistema de arquivos em uso. Se você quiser saber exatamente o que acontece, dê uma olhada nas implementações do sistema de arquivos.
Basicamente, na maioria dos sistemas de arquivos, um diretório é uma matriz associativa entre nomes de arquivos (chaves) e números de inodes (valores) . Algo como isto¹:
1167010 .
1158721 ..
1167626 subdir
132651 barfile
132650 bazfile
Esta lista é codificada de alguma forma - mais ou menos - eficiente dentro de uma cadeia de (geralmente) blocos de 4KB. Observe que o conteúdo de arquivos regulares é armazenado de forma semelhante. No caso de diretórios, não faz sentido saber qual tamanho é realmente usado dentro desses blocos. É por isso que os tamanhos dos diretórios relatados por du
são múltiplos de 4KB.
Os inodes estão lá para unir os blocos, formando uma única entidade, ou seja, um 'arquivo' no sentido geral. Eles são identificados por um número que é algum tipo de endereço e cada um é normalmente armazenado como um único bloco especial.
O gerenciamento de tudo isso acontece no modo kernel. O software apenas pede a criação de um diretório com uma função chamada int mkdir(const char *pathname, mode_t mode);
, levando a uma chamada do sistema, e todo o resto é realizado nos bastidores.
Sobre a estrutura de links:
Um link físico não é um arquivo, é apenas uma nova entrada de diretório (isto é, uma associação nome - número do inode ) referente a uma entidade inode preexistente². Isso significa que o mesmo inode pode ser acessado de diferentes nomes de caminhos. Em particular, uma vez que metadatas (permissões, propriedade, timestamps…) são armazenadas dentro do inode, elas são únicas e independentes do nome de caminho escolhido para acessar o arquivo.
Um link simbólico é um arquivo e é distinto do seu destino. Isso significa que ele tem seu próprio inode. Ele costumava ser tratado como um arquivo normal: o caminho de destino era armazenado em um bloco de dados. Mas agora, por razões de eficiência em sistemas de arquivos ext recentes, caminhos menores que 60 bytes são armazenados dentro do próprio inode (usando os campos que normalmente seriam usados para armazenar os ponteiros em blocos de dados).
-
1. isso foi obtido usando ls -ai1 testdir
.
2. cujo tipo deve ser diferente de 'diretório' hoje em dia.