Onde as entradas do diretório de arquivos dos subdiretórios são armazenadas?

2

Perdoe se esta pergunta tiver uma cópia exata em outro lugar, mas até agora todas as respostas que encontrei no SE ou em outros sites em geral não respondem especificamente a essa pergunta. Estou fazendo um curso de sistemas operacionais na minha faculdade e, portanto, sou muito novo em sistemas de arquivos em geral.

Eu entendo que na maioria dos sistemas de arquivos, existe um diretório raiz que contém entradas de diretório de arquivos. Essas entradas contêm um mapeamento do nome do arquivo para o número do inode e são de tamanho variável.

De acordo com esta resposta , acho que essas entradas são armazenadas de forma linear, como abaixo:

Eu posso entender completamente o que são os inodes e como eles mapeiam os números de bloco de dados de um arquivo no disco físico, usando suas entradas de Sumário (TOC).

No entanto, minha pergunta é: Como e onde as entradas do diretório de arquivos do subdiretório são armazenadas?

Eu acredito que eles são armazenados no mesmo local que o diretório raiz, em algum deslocamento. No entanto, não consigo imaginar como esse deslocamento pode ser recuperado do inode.

Portanto, tenho a sensação de que as entradas de diretório dos subdiretórios são realmente armazenadas na região de dados do disco, em vez de nas entradas do diretório raiz.

Portanto, se este for o caso, a passagem de um diretório para outro requer que o disco leia de locais aparentemente arbitrários, o que parece um pouco ineficiente para mim.

No entanto, gostaria de esclarecer meus equívocos sobre a localização das entradas do diretório de arquivos de um subdiretório.

Muita ajuda é apreciada.

    
por Irvin Lim 23.04.2017 / 10:56

2 respostas

2

Os diretórios geralmente são implementados como arquivos. Eles têm um inode e uma área de dados, mas é claro que geralmente são acessados (pelo menos por escrito) por chamadas especiais do sistema. Alguns sistemas permitem os diretórios reading com a usual chamada de sistema read(2) (o Linux não, o FreeBSD fez quando eu verifiquei pela última vez). A área de dados do arquivo de diretório contém as entradas do diretório. Em ext4 , o diretório raiz também tem um inode, ele é fixado no número de inode 2 (tente ls -lid / ).

Ter o diretório agindo como um arquivo facilita a alocação de espaço para as entradas de diretório, etc., já que as funções para alocar blocos para arquivos sempre devem estar lá. Além disso, como eles usam os blocos de dados sama conforme necessário, não é necessário alocar espaço entre os dados do arquivo e as listagens de diretório de antemão.

As partes internas de como as entradas do diretório são armazenadas variam entre os sistemas de arquivos e, por exemplo, evoluíram entre ext2 e ext4 . Sistemas modernos usam árvores em vez de listas lineares para pesquisas mais rápidas. Veja aqui . Mesmo o venerável sistema de arquivos FAT armazena diretórios como arquivos, mas pelo menos em FATs antigos, o diretório raiz é especial. (A estrutura das entradas de diretório no FAT é obviamente diferente dos sistemas de arquivos unix).

Hence, if this is the case, traversing from one directory to another requires the disk to read from seemingly arbitrary locations, which seems a little inefficient to me.

Sim. Mas as entradas de diretório acessadas com frequência (ou os blocos de dados subjacentes) provavelmente são armazenadas em cache nos sistemas operacionais modernos.

Salvar o conteúdo de todos os diretórios centralmente exigiria a pré-alocação de uma área grande e ainda exigiria procura de disco na área de dados do diretório.

    
por 23.04.2017 / 12:08
1

A solução comum é que alguns dos inodes no diretório raiz apontam para entradas que também são diretórios. Em muitos aspectos, eles são como arquivos, mas o tipo de arquivo indica ao sistema de arquivos para interpretá-los como diretórios.

(Em tutoriais realmente antigos, como para o Unix original, você será informado que também pode cat um diretório. Geralmente, isso não é mais verdade.)

Em outras palavras, cada diretório é uma lista linear simples de ponteiros de inode. Alguns deles apontam para nós de folha na árvore de diretórios (arquivos), outros apontam para nós internos (outro diretório). As únicas coisas que são especiais sobre o diretório raiz é que ele é seu próprio pai, e que há algo externo à árvore que diz ao sistema para começar a percorrer a árvore a partir daqui.

    
por 23.04.2017 / 11:21