"Junção de diretório" vs "link simbólico de diretório"?

393

No contexto do NTFS:

MKLINK [[/D] | [/H] | [/J]] Link Target

/D Cria um link simbólico de diretório. O padrão é um link simbólico do arquivo.
/H Cria um link físico em vez de um link simbólico.
/J Cria uma junção de diretório.
Link especifica o novo nome do link simbólico.
Target especifica o caminho (relativo ou absoluto) ao qual o novo link se refere.

  1. Uma junção de diretório não é exatamente a mesma coisa que um link simbólico de diretório ?

    Qual é a diferença entre mklink /D f1 f2e mklink /J f1 f2?

  2. Como um "diretório" é na verdade apenas um arquivo , qual seria a diferença entre um link simbólico de diretório e um link simbólico de arquivo?

Pacerier
fonte
2
Relacionados: superuser.com/q/347930/24500
surfasb

Respostas:

364

Uma junção definitivamente não é a mesma coisa que um link simbólico de diretório, embora eles se comportem da mesma forma. A principal diferença é que, se você estiver procurando um servidor remoto, as junções serão processadas no servidor e os links simbólicos do diretório serão processados ​​no cliente . Veja também o comentário de Matthew sobre o fato de que isso significa que links simbólicos no sistema de arquivos local podem apontar para sistemas de arquivos remotos.

Suponha que em uma máquina chamada Alice você coloque um ponto de junção c:\myjpe um link simbólico de diretório c:\mysymlink, ambos apontando para c:\targetfolder. Enquanto estiver usando Alice, você não notará muita diferença entre eles. Mas se você estiver usando outra máquina chamada Bob, o ponto de junção

\\Alice\c$\myjp apontará para \\Alice\c$\targetfolder

mas o link simbólico

\\Alice\c$\mysymlink apontará para \\Bob\c$\targetfolder

(Nota: por padrão, o sistema não segue links simbólicos em volumes remotos, portanto, na maioria dos casos, o segundo exemplo resultará em "Arquivo não encontrado" ou "O link simbólico não pode ser seguido porque seu tipo está desativado". )

A diferença entre um link simbólico de diretório e um link simbólico de arquivo é simplesmente que um representa um diretório e um representa um arquivo. Como o destino do link não precisa existir quando o link é criado, o sistema de arquivos precisa saber se deve informar aos aplicativos que é um diretório ou não.

Também deve ser observado que a criação de um link simbólico requer privilégio especial (por padrão, disponível apenas para processos elevados), enquanto a criação de uma junção requer apenas acesso ao sistema de arquivos.

Harry Johnston
fonte
13
Só para esclarecer: pode haver outras diferenças funcionais mais sutis entre junções de diretório e links simbólicos de diretório. A coisa remota versus local é apenas a mais óbvia da perspectiva de um usuário (em oposição a um desenvolvedor).
Harry Johnston
12
@MatthewSteeples, você quer dizer que se eu criar um link simbólico C:\testlink(que aponte para o C:\testmeu computador) e alguém acessar remotamente o meu computador e clicar C:\testlinknele, ele será resolvido C:\testno computador HIS, enquanto que se eu criar uma junção de diretório C:\testlink(que aponte para C:\testno meu computador) e alguém acessar remotamente o meu computador e clicar C:\testlinknele) o levaria ao C:\testmeu computador? Ou entendi errado?
Pacerier 5/10
9
@Pacerier neste contexto, sim, mas os links simbólicos permitem que você tenha uma pasta no computador que aponta para um compartilhamento de rede (porque eles são resolvidos no lado do cliente). Por exemplo C: \ MyNetworkShare poderia realmente apontar para \\ Alice \ Share
Matthew Steeples
6
@MatthewSteeples, mas não conseguimos criar uma junção de diretório C:\MyNetworkShareque também aponte \\Alice\Share?
Pacerier
8
@Pacerier, não, os pontos de junção precisam ser locais.
Harry Johnston
55

Conversa complexa machuca o cérebro - eu gosto de gráficos:

Suponha que any MyLinké um link simbólico e any MyJuncé uma junção apontando para Target as created.

por exemplo

mklink /D MyLink C:\T_Dir para criar um link simbólico para o diretório de destino

mklink /J MyJunc C:\T_Dir para criar uma junção de diretório com o diretório de destino

Onde a sintaxe é mklink [/J,/D] [link path] [target path]digitada na máquina local


 link path    |   target path   |         When accessed ..
              |                 |  (locally)    |    (remotely)
              |                 |               |
C:\MyLink     |   C:\T_Dir      |  C:\T_Dir     |  [leads back to local]
C:\MyJunc     |   C:\T_Dir      |  C:\T_Dir     |  [leads to remote]
              |                 |
\\Svr\MyLink  |   C:\T_Dir      |   C:\T_Dir    |  [leads back to local]
\\Svr\MyJunc  |   C:\T_Dir      |  *** Must create and point local ***
              |                 |
C:\MyLink     |  \\Sv2\T_Dir    |  \\Sv2\T_Dir  |   Error*1
C:\MyJunc     |  \\Sv2\T_Dir    |  *** Error - Must point local ***
              |                 |
\\Svr\MyLink  |  \\Sv2\T_Dir    |  Error*1
\\Svr\MyJunc  |  \\Sv2\T_Dir    |  *** Must create link using target device ***

Erro * 1 - Se você desbloqueou o acesso a links simbólicos remotos na sua máquina local, isso funcionaria .. mas apenas na máquina local onde está desbloqueado

Still.Tony
fonte
3
Isso é tão estranho. Mesmo links simbólicos relativos não funcionam remotamente. Por exemplo, eu crio um diretório d:\_tmp\data. Criar link assim: d:\_tmp>mklink /d data-link data. O usuário remoto tem acesso total a d:\_tmptodas as suas subpastas, mas ainda não poderá abrir d:\_tmp\data-link.
Nux
4
Isso ocorre porque quando um link simbólico é avaliado no lado do cliente, ele aponta para d: \ _ tmp \ data no cliente, não no servidor.
apraetor 24/09/16
Eu acho que a razão pela qual é estranho é clara. Mas eu concordo com o @Nux que é estranho, pelo menos no caso de links simbólicos relativos.
Jon Coombs
Complex talk hurts brain -- I like chartsEu amo essa frase e o gráfico também.
Luke
46

Links simbólicos têm mais funcionalidade, enquanto junções quase parecem ser um recurso herdado por causa de suas limitações, mas as implicações de segurança dessas limitações são especificamente o motivo pelo qual uma junção pode ser preferida a um link simbólico. O direcionamento remoto torna os links simbólicos mais funcionais, mas também aumenta seu perfil de segurança, enquanto as junções podem ser consideradas mais seguras porque são restritas aos caminhos locais . Portanto, se você deseja um link local e pode viver com um caminho absoluto, provavelmente está melhor com uma junção; caso contrário, considere um link simbólico para suas habilidades adicionais.

insira a descrição da imagem aqui

** A declaração de diferença de velocidade / complexidade vem de uma declaração não verificada na entrada da Wikipedia sobre pontos de nova análise NTFS (uma boa leitura). *


Outras comparações de links NTFS

Aqui estão algumas outras comparações sobre o tópico, mas elas podem ser enganosas ao considerar junções, porque não listam os benefícios que listo acima.

Retirado daqui (uma boa leitura introdutória)

insira a descrição da imagem aqui

Da página SS64 no MKLink

insira a descrição da imagem aqui


Comentários sobre Terminologia

As junções são links simbólicos

Junções e links simbólicos estão realmente fazendo a mesma coisa da mesma maneira (pontos de nova análise), além das diferenças mencionadas acima na maneira como são processadas. De fato, tecnicamente, uma junção é um link simbólico e, algumas vezes, a documentação pode chamar uma junção de link simbólico, como é o caso aqui . Portanto, isso é apenas algo a ter em conta em relação à terminologia.

NTFS

Embora o OP especifique isso, vale ressaltar que "link simbólico" é um termo muito geral que não é específico do NTFS. Portanto, para ser específico, essa comparação é sobre junções NTFS versus links simbólicos NTFS.

u8it
fonte
3
Alguém testou a velocidade de processamento de junções vs links simbólicos?
1000Gbps
O gráfico de prós / contras foi extremamente útil, obrigado!
GordonM