Link simbólico do diretório para inode, não caminho (por exemplo, hardlinks de diretório)

2

Estou tentando entender melhor por que os hardlinks de diretório não são possíveis. Grosso modo, penso em diretórios e arquivos da seguinte forma:

directory
---------
inode            # exposed as .
inode_of_parent  # exposed as ..
content: 
    mapping from names to inodes
    a hardlink is just another name->inode entry in the mapping

file
----
inode
content

Meu entendimento de links simbólicos de diretório é que eles são algo como:

symlink
-------
inode            # exposed as .  but only if the symlink can be followed
inode_of_parent  # exposed as .. but only if the symlink can be followed
target:
   a named path that, effectively, points to another inode's content

Notavelmente, o alvo para o symlink não aponta para outro inode e, portanto, não incrementa a contagem de links de nenhum inode. Se o que o alvo resolver for inválido, então o link simbólico é simplesmente inválido.

Li Por que é difícil links para diretórios não permitidos no UNIX / Linux? e parece vir principalmente para conveniência (e presumivelmente performance). [Além disso: parece que '..' efetivamente quebra a estrutura do DAG de qualquer maneira, mas eu acho que isso é feito de uma maneira previsível, que os links físicos fariam mais complicados.] Alguns dos comentários sobre essa questão sugerem que ela > é possível lidar com loops, mas para fins de discussão, estou disposto a aceitar que queremos evitá-los. Assim, por que você não poderia ter um tipo diferente de link simbólico que apontasse para um inode:

alternative symlink
-------------------
inode            # exposed as .
inode_of_parent  # exposed as ..
inode_of_target
is_symlink       # this marks it as special and distinct from a directory

Este link simbólico teria que incrementar a contagem de links do alvo, o que o torna robusto para mover e renomear o alvo. Portanto, é basicamente um link físico, mas devido a sua sinalização especial, ele nunca será confundido como um diretório real e, portanto, não causa preocupações com loops. A situação parece tão administrável.

Obviamente, isso deve ser muito simplista. Então, eu gostaria de saber por que isso não é possível. Provavelmente, a história que eu contei não é sofisticada o suficiente, e então, por favor, complique conforme necessário.

    
por Tom 11.12.2014 / 22:41

0 respostas