Por que um novo diretório tem uma contagem de links físicos de 2 antes que algo seja adicionado a ele?

38

Digamos que eu apenas criei o diretório newDirectory e, em seguida, eu faço o comando ls -ld. Vejo que o número de links físicos é 2. O que exatamente torna o link físico 2 desde o início? Além disso, o número de subdiretórios no diretório atual é igual ao número de links físicos - 2?

John
fonte

Respostas:

39

Historicamente , o primeiro sistema de arquivos Unix criou duas entradas em cada diretório: .apontando para o próprio diretório e ..apontando para seu pai. Isso proporcionou uma maneira fácil de percorrer o sistema de arquivos, tanto para aplicativos quanto para o próprio sistema operacional.

Assim, cada diretório tem uma contagem de links de 2 + n, em que n é o número de subdiretórios. Os links são a entrada para esse diretório em seu pai, a .entrada do próprio diretório e a ..entrada em cada subdiretório. Por exemplo, suponha que este seja o conteúdo da subárvore com raiz em /parenttodos os diretórios:

/parent
/parent/dir
/parent/dir/sub1
/parent/dir/sub2
/parent/dir/sub3

Então dirtem uma contagem da ligação de 5: a direntrada no /parent, a .entrada no /parent/dir, e as três ..entradas em cada um /parent/dir/sub1, /parent/dir/sub2e /parent/dir/sub3. Como /parent/dir/sub1não possui subdiretório, sua contagem de links é 2 (a sub1entrada /parent/dire a .entrada /parent/dir/sub1).

Para minimizar a quantidade de maiúsculas e minúsculas para o diretório raiz, que não possui um pai "adequado", o diretório raiz contém uma ..entrada apontando para si mesma. Dessa forma, também possui uma contagem de links de 2 mais o número de subdiretórios, sendo 2 /.e /...

Os sistemas de arquivos posteriores tendem a acompanhar os diretórios-pai na memória e geralmente não precisam .e ..existem como entradas reais; sistemas unix modernos típicos tratam .e ..como valores especiais como parte do código do sistema de arquivos independente do tipo de sistema de arquivos. Alguns sistemas de arquivos ainda incluir .e ..entradas, ou fingir mesmo que não aparece nada no disco.

A maioria dos sistemas de arquivos ainda relatam uma contagem da ligação de 2 + n para diretórios independentemente de .e ..existem entradas, mas há exceções, por exemplo, o Btrfs não fazer isso.

Gilles 'SO- parar de ser mau'
fonte
4
..apontar para o pai não afeta a contagem de links do diretório atual. A contagem de 2 vem .e o nome (original) do diretório é listado. A maneira como você coloca isso é um pouco ambígua e faz parecer .e ..são os dois. ..deve ser usado apenas para explicar como a matemática funciona para 2+n:)
th3an0maly
@ th3an0maly Apontar para o pai afeta a contagem de links do pai. Realmente não vejo como “a entrada .. em cada subdiretório” é ambígua e não entendo o que você quer dizer com “o nome do diretório listado em si”.
Gilles 'SO- stop be evil'
Na verdade, esta resposta: unix.stackexchange.com/a/101516/160264 é exatamente o que eu tenho sugerido . Leia depois de ler sua resposta, já que a sua foi a que estava no topo.
precisa saber é o seguinte
@ th3an0maly Eu ainda não tenho idéia do que você está sugerindo. Você poderia expressá-lo claramente, em vez de sugerir?
Gilles 'SO- stop be evil'
A resposta de @ goldilocks é clara. O que eu quis dizer é que sua resposta pode ser mais parecida com a dele. Mas então eu não tinha lido a resposta dele quando estava lendo sua resposta. A primeira linha é exatamente o que meu comentário original dizia: "Existe uma para o diretório em si e outra para .dentro dele". Se ainda não está claro para você, lamento não poder esclarecer mais. Tudo o que eu poderia fazer melhor é copiar e colar sua resposta aqui nos comentários.
precisa saber é o seguinte
13

Há um para o próprio diretório e outro para .dentro dele.

Além disso, o número de subdiretórios no diretório atual é igual ao número de links físicos - 2?

Isso faz sentido, já que cada subdiretório cria um ..link físico e, além disso, você não pode criar links físicos para diretórios. 1 No entanto, eu não confiaria nisso por nada sério, esp. pois é fácil contar os subdiretórios e obter o número real.

Se você está apenas olhando para a lssaída, para ter uma idéia de quantos subs existem, é uma boa idéia.

1 Ou pelo menos você não pode ln. Eu não tentei programaticamente e man 2 linké ambíguo - não há erro óbvio ao vincular a um diretório, embora haja alguns que possam ser aplicados ( EMLINK, EPERM). Portanto, a menos que haja algum padrão em algum lugar que diga que os únicos possíveis links físicos para um diretório são .e .., novamente, eu trataria apenas essa contagem de links físicos como uma pista casual.

Cachinhos Dourados
fonte
2
Se os links para diretórios são permitidos e se é possível contar subdiretórios a partir da contagem de links, ambos dependem do sistema de arquivos que você está usando - alguns permitem, outros não.
Alanc
Observe que o Time Machine do macOS, na verdade, vincula diretórios a backups anteriores; Dessa forma, eles podem fingir que cada backup incremental é uma cópia completa e podem excluir qualquer um dos incrementais sem afetar os outros. Também é muito quebradiço, eu estava brincando com ele usando syscalls regulares e manuseio completamente meu sistema de arquivos.
w00t