«Каталог соединения» против «символьной ссылки каталога»?

395

В контексте NTFS:

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

/D Создает каталог символическую ссылку. По умолчанию это символическая ссылка файла.
/H Создает жесткую ссылку вместо символической ссылки.
/J Создает соединение каталогов.
Link указывает имя новой символической ссылки.
Target указывает путь (относительный или абсолютный), на который ссылается новая ссылка.

  1. Разве объединение каталогов - это не то же самое, что символьная ссылка на каталог ?

    Какая разница между mklink /D f1 f2а mklink /J f1 f2?

  2. Поскольку «каталог» на самом деле является просто файлом , в чем будет разница между символической ссылкой каталога и символической ссылкой файла?

Pacerier
источник
2
Связанный: superuser.com/q/347930/24500
surfasb

Ответы:

366

Соединение определенно не то же самое, что символьная ссылка на каталог, хотя они ведут себя аналогично. Основное отличие состоит в том, что, если вы смотрите на удаленный сервер, соединения обрабатываются на сервере, а символические ссылки каталога обрабатываются на клиенте . Также см. Комментарий Мэтью о том, что это означает, что символические ссылки в локальной файловой системе могут указывать на удаленные файловые системы.

Предположим, что на машине с именем Алиса вы должны были поместить точку соединения c:\myjpи символическую ссылку каталога c:\mysymlink, обе указатели на c:\targetfolder. Пока вы используете Алису, вы не заметите большой разницы между ними. Но если вы используете другую машину с именем Bob, то точка соединения

\\Alice\c$\myjp будет указывать на \\Alice\c$\targetfolder

но символическая ссылка

\\Alice\c$\mysymlink будет указывать на \\Bob\c$\targetfolder

(Предостережение: по умолчанию система не следует символическим ссылкам на удаленных томах, поэтому в большинстве случаев второй пример фактически приводит либо к «Файлу не найден», либо к «Символической ссылке не может следовать, потому что ее тип отключен». )

Разница между символической ссылкой каталога и символической ссылкой файла заключается просто в том, что один представляет каталог, а другой - файл. Поскольку целевая ссылка не должна существовать при создании ссылки, файловая система должна знать, сообщать ли приложениям, что это каталог или нет.

Следует также отметить, что создание символической ссылки требует специальных привилегий (по умолчанию доступно только для процессов с повышенными правами), в то время как создание соединения требует только доступа к файловой системе.

Гарри Джонстон
источник
13
Просто чтобы прояснить: вполне могут быть и другие более тонкие функциональные различия между соединениями каталогов и символическими ссылками каталогов. Дистанционная и локальная вещь просто наиболее очевидна с точки зрения пользователя (в отличие от разработчика).
Гарри Джонстон
12
@ MatthewSteeples - вы имеете в виду, что если я создам символическую ссылку C:\testlink(которая указывает C:\testна мой компьютер), а кто-то удаленно обращается к моему компьютеру и нажимает на C:\testlinkнее, она разрешается C:\testна компьютере HIS, тогда как, если я создаю соединение каталога C:\testlink(которое указывает на C:\testна моем компьютере), и кто-то удаленного доступа к моему компьютеру и щелкает C:\testlink) это приведет его к C:\testна моем компьютере? Или я неправильно понял?
Pacerier
9
@Pacerier в этом контексте - да, но символические ссылки позволяют вам иметь папку на вашем компьютере, которая указывает на общий сетевой ресурс (потому что они разрешены на стороне клиента). Например, C: \ MyNetworkShare на самом деле может указывать на \\ Алису \ Share
Мэтью Стиплз
6
@MatthewSteeples, но не могли бы мы создать соединение каталогов, C:\MyNetworkShareкоторое также указывает \\Alice\Share?
Pacerier
8
@Pacerier, нет, точки соединения должны быть локальными.
Гарри Джонстон
56

Сложные разговоры вредит мозгу - мне нравятся графики:

Предположим, что any MyLink- это символическая ссылка, а any MyJunc- это соединение, указывающее на Target as created.

например

mklink /D MyLink C:\T_Dir для создания символической ссылки на целевой каталог

mklink /J MyJunc C:\T_Dir для создания соединения каталога с целевым каталогом

Где синтаксис mklink [/J,/D] [link path] [target path]как набран на локальной машине


 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 ***

Ошибка * 1 - Если вы разблокировали доступ к удаленным символическим ссылкам на локальном компьютере, это сработало бы ... но только на локальном компьютере, на котором он разблокирован

Still.Tony
источник
3
Это так странно. Даже относительные символические ссылки не работают удаленно. Например, я создаю каталог d:\_tmp\data. Создать ссылку следующим образом: d:\_tmp>mklink /d data-link data. Удаленный пользователь имеет полный доступ ко d:\_tmpвсем его подпапкам, НО он все равно не сможет открыть d:\_tmp\data-link.
Nux
4
Это связано с тем, что когда символьная ссылка обрабатывается на стороне клиента, она указывает на данные d: \ _ tmp \ на клиенте, а не на сервере.
apraetor
Я думаю, что причина, почему это странно, ясна. Но я согласен с @Nux, что это странно, по крайней мере, в случае относительных символических ссылок.
Джон Кумбс
Complex talk hurts brain -- I like chartsМне нравится это предложение и таблица тоже.
Люк
46

Символьные ссылки обладают большей функциональностью, в то время как соединения, по-видимому, являются устаревшей функцией из-за их ограничений, но последствия этих ограничений для безопасности заключаются именно в том, почему соединение может быть предпочтительнее символической ссылки. Удаленный таргетинг делает символические ссылки более функциональными, но также повышает их профиль безопасности, в то время как соединения могут считаться более безопасными, поскольку они ограничены локальными путями . Итак, если вам нужна локальная ссылка и вы можете жить по абсолютному пути, вам, вероятно, лучше с перекрестком; в противном случае рассмотрите символическую ссылку для его добавленных способностей.

введите описание изображения здесь

** Заявление о разнице в скорости / сложности исходит из непроверенного утверждения в статье Википедии о точках повторной обработки NTFS (хорошее чтение). *


Другие сравнения ссылок NTFS

Вот некоторые другие сравнения по этой теме, но они могут вводить в заблуждение при рассмотрении пересечений, потому что они не перечисляют преимущества, которые я перечислю выше.

Взято отсюда (хорошее вступительное чтение)

введите описание изображения здесь

Со страницы SS64 на MKLink

введите описание изображения здесь


Отзывы о терминологии

Соединения - это символические ссылки

Соединения и символические ссылки на самом деле делают одно и то же (точки повторного анализа), за исключением вышеупомянутых различий в том, как они обрабатываются. Фактически, технически, Junction - это символическая ссылка, и иногда документация может назвать Junction символической ссылкой, как в данном случае . Так что это просто кое-что, чтобы знать о терминологии.

NTFS

Несмотря на то, что OP указывает это, стоит отметить, что «символическая ссылка» является очень общим термином, который не является специфическим для NTFS. Таким образом, чтобы быть точным, это сравнение касается соединений NTFS и символических ссылок NTFS.

u8it
источник
3
Кто-нибудь проверял скорость обработки соединений и символических ссылок?
1000 Гбит / с
Диаграмма плюсы / минусы была чрезвычайно полезна, спасибо!
GordonM