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


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 de 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. Não é um junção de diretório exatamente a mesma coisa que um link simbólico de diretório?

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

  2. Já que 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?


336


origem


Relacionado: superuser.com/q/347930/24500 - surfasb


Respostas:


Uma junção definitivamente não é a mesma coisa que um link simbólico de diretório, embora eles se comportem de maneira semelhante. A principal diferença é que, se você está olhando para um servidor remoto, junções são processadas no servidor e links simbólicos de diretório sã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ê colocasse um ponto de junção c:\myjp e um link simbólico de diretório c:\mysymlink, ambos apontando para c:\targetfolder. Enquanto você estiver usando Alice você não notará muita diferença entre eles. Mas se você estiver usando outra máquina chamada Bob, então 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

(Advertência: por padrão, o sistema não segue links simbólicos em volumes remotos, então, 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á desabilitado.")

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 se é um diretório ou não.

Também deve ser notado que a criação de um link simbólico requer um 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.


315



Só para deixar claro: pode haver outras diferenças funcionais mais sutis entre junções de diretório e links simbólicos de diretório. O remoto vs local é apenas o mais óbvio de um usuário (em oposição a um desenvolvedor) perspectiva. - Harry Johnston
@MatthewSteeples você quer dizer que se eu criar um link simbólico C:\testlink (que aponta para C:\test no meu computador) e alguém acessar remotamente o meu computador e clica em C:\testlink, resolveria para o C:\test no computador HIS, Considerando que se eu criar um diretório junção C:\testlink (que aponta para C:\test no meu computador), e alguém acessa meu computador remotamente e clica em C:\testlink) o levaria ao C:\test no meu computador? Ou eu entendi errado? - Pacerier
@Pacerier neste contexto sim, mas os links simbólicos permitem que você tenha uma pasta no seu computador que aponte para um compartilhamento de rede (porque eles são resolvidos do lado do cliente). Por exemplo, C: \ MyNetworkShare poderia realmente apontar para \\ Alice \ Share - Matthew Steeples
@MatthewSteeples mas não poderíamos criar uma junção de diretório C:\MyNetworkShare que aponta para \\Alice\Share também? - Pacerier
@Pacerier, não, os pontos de junção precisam ser locais. - Harry Johnston


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

Assuma qualquer MyLink é um link simbólico e qualquer 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 no diretório de destino

Onde a sintaxe é mklink [/J,/D] [link path] [target path] como digitado 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ê desbloquear o acesso a links simbólicos remotos em sua máquina local, isso funcionaria .. mas somente na máquina local onde ele foi desbloqueado


42



Isso é tão estranho. Mesmo os links simbólicos relativos não funcionam remotamente. Por exemplo. Eu crio um diretório d:\_tmp\data. Crie um link assim: d:\_tmp>mklink /d data-link data. O usuário remoto tem acesso total a d:\_tmp e todas as suas subpastas, mas ele ainda não será capaz de abrir d:\_tmp\data-link. - Nux
Isso porque, quando um link simbólico é avaliado no lado do cliente, ele estaria apontando para d: \ _tmp \ data no cliente, não no servidor. - apraetor
Eu acho que a razão pela qual é estranho é claro. Mas eu concordo com o @Nux que é estranho, pelo menos no caso de links simbólicos relativos. - Jon Coombs


Fiquei com a impressão de que os entroncamentos estavam por aí por razões legadas e os links simbólicos eram melhores (as coisas aparecem assim pelo valor de face). Acontece que isso não é inteiramente verdade. Existem algumas boas razões para usar uma junção em vez de um link simbólico. A principal diferença se resume a segurança e caminhos remotos vs. locais. Sim, a segmentação remota torna os links simbólicos mais funcionais, mas também aumenta seu perfil de segurança. Então, se você quer um link local e pode viver com um caminho absoluto, você provavelmente está melhor com um entroncamento; Caso contrário, considere um link simbólico para suas habilidades adicionais.

enter image description here

** A declaração de diferença em velocidade / complexidade vem de uma declaração não verificada no Entrada da Wikipedia em pontos de nova análise de 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 quando consideramos junções porque elas não listam os benefícios listados acima.

Tirado daqui (uma boa leitura introdutória)

enter image description here

A partir de Página SS64 no MKLink

enter image description here


Comentários sobre Terminologia

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 acima mencionadas em como eles são processados. De fato, tecnicamente, um Junction é um link simbólico, e às vezes a documentação pode chamar um Junction de um link simbólico, como é o caso aqui. Então, isso é apenas algo para estar ciente sobre a terminologia.

NTFS

Embora o OP especifique isso, vale a pena ressaltar que "link simbólico" é um termo muito genérico que não é específico do NTFS. Assim, para ser específico, essa comparação é sobre Junções NTFS vs. Links Simbólicos NTFS.


13