Символические ссылки Windows – работа с MKLINK.

14.05.2019 0 Автор GodKnowses

Как создаются и работают ссылки Windows, или что можно сделать при помощи mklink.

Внутренние ссылки Windows чем-то напоминают ярлыки. Они создаются системой с единственной целью: заставить Windows думать, что папка или файл, реально или физически располагающиеся на диске (разделе) 1, нужно искать на диске (разделе) 2. При этом и создаётся ссылка, которая сохраняет все свойства при операциях с объектами: при добавлении файлов в эту папку ссылка переносит их именно в реально (физически) существующее местоположение. Таким образом, символьная или символическая ссылка Windows позволяет отображать папку C:\Директория1\ как, например, D:\Директория2\. При этом “подлога” не заметит ни вкрадчивый пользователь, ни даже служебные программы. Если для вас этого немного сложновато, то вы увидитесь, что таких ссылок и “поддельных” папок в Windows очень много. А некоторых директорий и системных папок, к которым мы привыкли относится как к неприкосновенным… вообще не существует: это и есть обыкновенные для Windows символические ссылки. Созданные с их помощью “виртуальные” папки хранятся только на диске RAM.

СПРАВКА, или что такое ссылка для Windows?

Ссылка – это цепочка символов, которая указывает/перенаправляет на объект, реально или физически существующий. Нужно различать постоянные (фиксированные, жёсткие) и гибкие (временные, символьные ) ссылки. Первые – когда, файл указывает на файл. Во втором случае – а это как раз наш – виртуальная папка указывает на целевую. Кроме всего, есть ещё и связующие ссылки, которые по сути являются теми же прямыми, но соединяют не файлы, а, используя различные переходы, папки и директории. При этом все папки остаются на прежних местах. Подробнее о типах ссылок в NTFS-системе – в конце статьи.

Если вы перешли на современную платформу со времён ещё Windows XP, вы можете вспомнить, что все пользовательские данные тогда хранились в одной только папке – C:\Documents and Settings. Она была отправной точкой для остальных папок и файлов. Со времён Vista базовых папок стало две: С:\Пользователи (данные программ и настроек для конкретной учётной записи) и C:\ProgramData (данные для всей системы  в целом, которые разделяли все установленные в Windows Vista/7 программы и приложения: и встроенные и со стороны). Однако, с целью обеспечения обратной совместимости с приложениями для предыдущих поколений Windows, папку C:\Documents and Settings … решили пока оставить. Вот так: физически её давно уже не существует, однако в проводнике она отображена. И успешно содержит в себе две указанные выше папки нового поколения Windows. Если не очень заняты, полюбопытствуйте прямо сейчас, обратив внимание на само содержимое папок:

documents and settings windows xp

А вот она в Windows 7:

documents and settings windows7

загляните внутрь папки Documents and Settings: ничего не замечаете?

А в Windows 10 этой папки нет?

documents and settings нет в windows 10 ?

Да нет, всё на месте:

Documents and Settings в windows10

Обратите внимание на Cвойства папки. Если вы не проводили дополнительный операций с разрешениями для папок и файлов, папку Documents and Setting вы вообще не сможете открыть. И всё по той же причине: её просто не существует, но “старым” службам и программам она необходима по определению. Так, Windows сохранила в своё время за пользователями право использовать устаревшие, но привычные (и, тем более, оплаченные по лицензии) программы. Особенно это касается пакета Microsoft Office. А та, как вы уже поняли, без папки обойтись не могла.

Создавая ссылки для Windows: mklink

В том виде, как вы их знаете, ссылки в Windows создаются в момент установки, что забирает львиную долю процесса. Однако в числе инструментов из служебных утилит есть та, с помощью которой ссылки можно создавать самостоятельно. Знакомьтесь – mklink. В консоли cmd от имени администратора можно найти по утилите справку:

mklink /?

справка mklink

Итак, что видно по справке?

  • mklink может создавать ссылки не только на сами папки и файлы, но и на такие же символьные ссылки
  • если не использовать аргумент /d, будет создана символьная ссылка на файл
  • если флаг /d применяется в команде, то появится символьная ссылка на папку/директорию

Давайте на секунду остановимся. Если вы наткнулись на статью случайно, вероятно, что и пояснение по используемым флагам /D и /J из справки утилиты не сильно разъяснит ситуацию (конкретно, разницу между этими флагами команды). И, опять же, умение правильно создать символьную ссылку или указующее соединение из mklink зависит от того, верно ли вы понимаете разницу в объясняемых справкой пунктах о /D (символьной ссылке), /J (соединениях каталогов) и /H (жёсткой ссылке). Об этом – в конце статьи.

Итак, создавать “собственные папки” просто. Например, мне нужно заставить появиться некую папку Директория на диске С, которая (на самом деле) является реально существующей у меня папкой по адресу D:\hacking\Python. Так и запишем:

mklink /j C:\Директория D:\hacking\Python

создать простую символическую ссылку

Если название папки содержит несколько слов с пробелами, поместите весь путь (включая имя диска) целиком в команде в кавычки “”.  Далее, немного усложним задачу, для чего создадим папку, создадим в ней файл, добавим для всего этого символическую ссылку, в окончании её же и удалим. Вот команды, а вы проверьте после ввода каждой из них, что происходит на диске С: с помощью проводника.

cd c:\
mkdir Директория
mklink /d "Символьная ссылка" Директория
dir "Символьная ссылка"
echo "Bla-bla-bla" > "Символьная ссылка"/Файл.txt
rmdir "Символьная ссылка"
dir Директория

сохранение файла через символьную ссылку

А зачем это надо-то?

Да, казалось бы, в том варианте как описывается, разницы между созданием обычного ярлыка для файла или папки нет. Но это лишь на первый взгляд. Ну, представьте себе, что купленная только что игра требует установиться в корневую C:\Games (как обычно), требуя при том свободного места на диске С этак Гбайт 30. И при этом карта системного диска С выглядит примерно так:

диск С забит

Есть второй том, там ещё есть место, но что толку-то? Простым решением был бы … перенос папки C:\Games на диск, видимо, D. Вручную это делать? Безошибочно это редко удаётся. А вот команда

mklink /j C:\Games D:\Games

справится с задачей в два счёта. И оп: игра-то думает, что её установили в нужную папку. А это не так, на самом деле. Какие ещё варианты? Я не особо игрок, но для меня, обладателя огромного количества виртуальных машин, которые занимают немало пространства, в такой ситуации тоже есть свои плюсы как решить проблему нехватки пространства для кучи виртуальных Windows.

Кроме того, создание ссылки подразумевает возможность быстрого к ней обращения: фактически вы создаёт новый путь. А он может быть максимально коротким. И тут в дело вступает возможность быстрого доступа из поисковой строки. Например, на одном из томов хранятся памятные фотографии, причём доступ к ним ограничен, а путь бесконечно долог для проводника. Создадим ссылку на манер:

mklink /j D:\Фотки "D:\Всякое\Фотки\Мои\2019\Выпускной\Пьём только кефир"

А теперь набираем WIN + R, вводим D:\Фотки и работаем как хотим:

работа с ссылками из строки поиска

Ссылки Windows из mklink: о чём следует помнить?

  • будущая ссылка и целевая папка должны быть на локальных томах; создание hard-ссылки с сетевым назначением не прокатит;
  • имя создаваемой ссылки должно быть уникальным; по существующим или зарезервированным адресам/именам утилита вернёт ошибку;
  • объединить две или более директорий одной ссылкой-папкой у меня так и не получилось;
  • переименовывать папки-ссылки можно также, как и обычные папки; они всё равно будут указывать на реально существующее местоположение целевой папки;
  • при этом Windows не делает никаких различий между “фейковой” папкой и реально существующей; файлы легко и надёжно перемещаются в папку-ссылку и обратно. Однако консоль cmd выдаёт истинную функцию папки-ссылки (созданной с флагом /j):
суть символьной ссылки

ссылка помечена как Junction, а не DIR

Точки стыка (жёсткие связи), соединения и символические ссылки файловой системы NTFS

Итак, в чём основные отличия связующих ссылок?

Жёсткая ссылка (hard link) – это файл, представляющий другой файл, находящийся на том же томе без дублирования его свойств. Жёстких ссылок на один файл может быть создано несколько, но на файл, находящийся в другом разделе (а тем более диске), жёсткую ссылку не поставить. Более того, жёсткие ссылки работают только с файлами – никаких директорий. Преимуществом жёсткой ссылки является тот факт, что, являясь копией настоящего, она не требует дополнительного пространства на диске. Так, если вы создали 5 ссылок на 1 файл весом 100 Мб, общий объём занимаемого места так и останется 100 Мб (а не 600 Мб). Любую из этих ссылок можно удалить, остальные и сам файл-оригинал останутся. А все изменения в файле отображаются и в ссылках.

Соединения для каталога – это ссылки на целевую директорию/папку. Соединения уже видят не только собственные тома, но и соседние разделы. Но, опять же, лишь в пределах локальной машины. Также не требуют свободного места, лишь указывая на оригинальную директорию. Если ту удалить или переместить, связи сломаются, и ссылки работать не будут. Помните историю про Documents and Settings? Это и есть пример такого соединения.

Символические ссылки появились с Windows Vista. Они представляют собой объект файловой системы, указывающий на другой объект. Это “супер-продвинутый” ярлык. И такие “ярлыки” могут указывать на любые файлы и папки в пределах локальной сети (с установленными Windows Vista и позднее). Объёмы жёсткого диска также не используются. Кроме того, связь по такой ссылке может осуществляться в виде абсолютного (полного) маршрута и относительного пути к целевой папке/файлу. Первый вариант – это всем знакомый по проводнику тип тропинки Диск:\Каталог\Подкаталог\Файл. В относительной ссылке пути к целевой директории могут перемежёвываться. Но объединяет их одно – система и программы воспринимает ссылки и цель как одно и тоже. При редактировании ссылок и цели ссылки наследуют свойства предыдущего варианта связей NTFS-системы.

Отличия между типами связей можно представить в таком виде:

разница между ссылками windows

Закончить можно ещё одним фактом: создание связи между файлами или каталогами в NTFS ни в коем случае не подразумевает копирование или резервирование целевых файлов или папок. И Windows не следит за состоянием цепочки: удаляете цель – получаете ошибку.

Ну, вот такая в целом ситуация с типами внутренних связей Windows. Успехов.