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 assim¹:
1167010 .
1158721 ..
1167626 subdir
132651 barfile
132650 bazfile
Esta lista é codificada de maneira mais ou menos eficiente dentro de uma cadeia de (geralmente) blocos de 4KB. Observe que o conteúdo dos arquivos regulares é armazenado de maneira 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 existem para unir blocos, formando uma única entidade, a saber, um 'arquivo' no sentido geral. Eles são identificados por um número que é algum tipo de endereço e cada um é geralmente 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 de inode ) referente a uma entidade de inode preexistente². Isso significa que o mesmo inode pode ser acessado a partir de diferentes nomes de caminho. Em particular, como os metadados (permissões, propriedade, registros de data e hora ...) são armazenados no inode, eles são únicos e independentes do nome do 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. 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 com menos de 60 bytes de comprimento são armazenados no próprio inode (usando os campos que normalmente seriam usados para armazenar os ponteiros nos blocos de dados).
-
1. isto foi obtido usando ls -ai1 testdir
.
2. cujo tipo deve ser diferente de 'diretório' hoje em dia.