Символическая ссылка (симлинк, символьная ссылка, Symbolic link) это специальный файл на файловой системе, которые сам не содержит данных, а является по сути ярлыком, указывающим на какой-то другой объект (файл или папку). При обращении к симлику операционная система считает, что это оригинальный файл (папка) и работает с ними совершенно прозрачно.
Символические ссылки используются в Windows довольно часто для системных файлов и каталогов. Пользователь может их применять, когда нужно перенести часть “тяжелых” файлов на другой диск, но чтобы Windows считала, что файлы все еще находятся в исходном каталоге (например в ситуациях, когда нужно экономить место на SSD, перенеся некоторые каталоги на более медленный и емкий SSD, не нарушая работоспособности программ). Можно использовать симлинки на SMB файловом сервере, когда каталоги с разных LUN должны быть доступны через одну точку входа.
В Windows есть три типа файловых ссылок для NTFS томов: жесткие, мягкие (симлинки), точки соединения (Junction point).
- Hard Links (жесткие ссылки) – могут указывать только на локальный файл, но не на папку. Такой файл – это ссылка на другой файла на этом же диске без фактического дублирования самого файла. У него отображается такой же размер и свойства, как у целевого файла (но реальное место на диске он не занимает);
- Junction Points (Directory Hard Link, точка соединения) – могут указывать только на папку (на этом же или на другом разделе);
- Symbolic Links (мягкая ссылка, симлинк) – могут указывать на локальный файл, папку и сетевой каталог на удаленном компьютере (UNC), поддерживаются относительные пути.
В подавляющем большинстве случаев вам будет достаточно функционала symbolic link, как наиболее универсального средства создания ссылки на любой объект.
Как создать символическую ссылку в Windows?
Для создания символических и жестких ссылок в Windows можно использовать встроенную утилиты mklink или PowerShell.
Синтаксис у утилиты
mklink
простой. Чтобы создать символическую ссылку на файл, нужно указать имя ссылки и целевой объект, на который она должна указывать. Можно указать тип ссылки:
/D
— символьная (мягкая) ссылка на каталог,
/H
— жесткая ссылка,
/J
– точка соединения (Junction point).
You do not have sufficient privilege to perform this operation
”.Если вам нужно разрешить создавать символические ссылки обычным пользователям, нужно добавить группу пользователей в параметр групповой политики Create Symbolic Links (Computer configuration -> Window Settings -> Security settings -> User Rights Assignment в редакторе GPO). По умолчанию в этой политике добавлена только локальная группа «Administrators». Обновите локальные политики после изменения параметра: gpupdate /force
Создадим в каталоге C:\PS символическую ссылку на файл notepad.exe:
mklink C:\PS\note.exe c:\Windows\System32\notepad.exe
Должно появится сообщение:
symbolic link created for C:\PS\note.exe <<===>> c:\Windows\System32\notepad.exe
Теперь для запуска процесса notepad.exe можно использовать символическую ссылку note.exe.
Теперь создадим в этом каталоге симлинк на другой каталог на этом же диcке:
mklink /D “C:\PS\Downloads” “C:\Users\user\Downloads”
Теперь при переходе в каталог C:\PS\Downloads вы будете видеть содержимое каталога, на который он ссылается.
Выведем содержимое каталога C:\PS:
Dir c:\ps
Как вы видите, в атрибутах некоторых файлов указано, что это symlink/simlinkd. Также указан объект, на который они ссылаются. В Windows File Explorer симлинки отображаются с иконками ярлыков, а в их свойствах можно посмотреть целевой объект на который они ссылаются.
Также можно создать символически ссылки в Windows 10 с помощью PowerShell (в этом примере я использую относительные пути, чтобы создать символическую ссылку):
New-Item -ItemType SymbolicLink -Path ".\test\tmpfiles" -Target "..\tmp\files"
Можно создать символическую ссылку на сетевую папку на удаленном компьютере/сервере. Адрес сетевой папки нужно указывать в формате UNC. Следующий пример создаст симлинк на сетевой каталог на сервере:
mklink /D c:\ps\share \\mskfs01\Share
Например, подключим административную шару C$ с удаленного компьютера по IP адресу:
mklink /D c:\remotePC\server1 \\192.168.31.15\С$
Если при доступе к сетевой папке через симлинк, вы получили ошибку
The symbolic link cannot be followed because its type is disabled
проверьте разрешенные способы использования символических ссылок на вашем компьютере:
fsutil behavior query SymlinkEvaluation
Local to local symbolic links are enabled. Local to remote symbolic links are enabled. Remote to local symbolic links are disabled. Remote to remote symbolic links are disabled.
Чтобы включить использование символических ссылок на удаленные ресурсы, выполните команды:
fsutil behavior set SymlinkEvaluation R2R:1
fsutil behavior set SymlinkEvaluation R2L:1
Вы можете работать с символическими ссылками, как с обычными объектами файловой системы, можно переименовать, переносить или удалить их. Система автоматически изменит настройки таких симлинков, чтобы они указывали на верные целевые объекты.
Для удаления симлинков используются обычные команды, как и для удаления файлов:
Del c:\ps\note.exe
RD c:\ps\downloads
Как найти и вывести все символические ссылки на диске?
В Windows нет простых инструментов для просмотра и управления всеми симлинками на диске.
Вы можете вывести список всех символических ссылок на диске с помощью команды:
dir /AL /S C:\ | find "SYMLINK"
-
/A
– вывести файлы с атрибутом L (симлинк); -
/S
–выполнить команду рекурсивно для всех вложенных каталогов; -
C:\
— укажите имя диска, на котором нужно найти все символические ссылки (если вы не хотите сканировать весь диск, укажите путь к нужному каталогу)
Также можно вывести список всех символических ссылок на диске с помощью PowerShell. Для этого нужно просканировать все каталоги и найти NTFS объекты с атрибутом ReparsePoint:
Get-ChildItem -Path C:\ -Force -Recurse -ErrorAction 'silentlycontinue' | Where { $_.Attributes -match "ReparsePoint"}
Раз уж речь про Windows 10, имеет смысл рассказать, что в 1703+ для создания ссылок NTFS не нужны права администратора, если включен режим разработчика.
Сорри за второй пост, сразу не заметил.
Можно любые ссылки NTFS выводить, делая выборку по типу ссылки. Например, только жесткие:
dir -Recurse -Force | where linktype -eq hardlink | select FullName,Target
Вероятно в статье имеет смысл более подробно раскрыть разницу между жесткими ссылками и линками. Особенно в контексте конкретных сценариев.
Кстати, жёсткие ссылки не поддерживаются в ReFS.
по хардлинкам: «ссылка на другой файла на этом же диске». желательно писать или логическом диске или разделе, а то неочевидно это.
также интересно как такие объекты ведут себя например при их архивировании.
Вообще не понятно в чем между ними разница. Ну у некоторых есть определенные ограничения на создание на некоторые типы объектов, а разница то в чем при использовании? Ну создал я симлинк или хардлинк на файл. Разница какая? Нафига нужен хардлинк и junction point, если все типы объектов можно использовать симлинке? В подавляющем большинстве случаев его достаточно? А когда нет? В каких случаях не достаточно и почему? Тема воообще не раскрыта.
Поначалу мне так тоже думалось, до тех пор, пока ссылающийся на него файл не был переименован (а отслеживание изменившихся NTFS-связей отключено) или удалён, с тех пор создаю через fsutil hardlink create «имя нового объекта» «путь к уже существующему объекту». Но пришлось привыкать, что их приходится хранить на одном разделе…
Так сказать, если нужно гарантированно иметь определённые версии файлов в разных папках одного раздела hdd, то после удаления одной из этих папок гарантировано не будет никаких проблем (ну разве что если в какой-либо из тех папок побывала вирусня / обновилось – тут и symlink бесполезен)
А вот если менять атрибуты и права доступа, тогда это отразится и на всех жёстких копиях! К симв.ссылкам доступ может отличаться от реального файла!
Однажды мне не удалось толково заставить работать симв.ссылку на cmd.exe в определённой папке на одной системе (так уж настроены на ней политики/назначения прав пользователя или ещё что) – файл не найден и всё тут (Э, а значок тогда откуда взяла?)! Пришлось по старинке через .lnk с конкретным указанием Start in: (рабочая папка). На другой системе таким же образом созданная в другой папке ссылка на cmd.exe открывает командную строку с этим адресом как и ожидалось.
Добрый день! Подскажите как сделать предпросмотр фотографии в symlink?
В описание ссылок есть неточности: «Junction Points (Directory Hard Link, точка соединения)» и «Symbolic Links (мягкая ссылка, симлинк».
Symbolic Links хоть и похожи по поведению на мягкие ссылки, но ими не являются. Данный термин отдан Junction Points. Из документации Микрософт (https://learn.microsoft.com/en-us/windows/win32/fileio/hard-links-and-junctions): «A junction (also called a soft link) differs from a hard link in that the storage objects it references are separate directories. »
Junction Point, как видно из цитаты выше не только являются мягкими ссылками, но принципиально отличаются от жёстких по своему поведению. Это так же видно по отображению в эксплорере, отображается как ярлык, это указано в самом способе предоставления ссылке, а именно «reparse points», в то время как жёсткие ссылки отображаются как оригинальный таргет, а по своему механизму являются не ссылками, а «path references».
То есть правильно будет так: Junction Points (Directory Links or Soft Links)
В дополнение к предыдущему посту. Так как Junctions и Symbolic Links представляют собой «reparse points», а Hard Links это «path references», то указанный в статье командлет «Get-ChildItem -Path C:\ -Force -Recurse -ErrorAction ‘silentlycontinue’ | Where { $_.Attributes -match «ReparsePoint»}» не может показать все ссылки, а лишь только Junctions и Symbolic Links.
Чтобы увидеть именно все ссылки, то нужен другой обработчик:
Get-ChildItem -Path -Force -Recurse -ErrorAction SilentlyContinue | where LinkType | select Mode, LinkType, FullName, Target
И тогда будет видно, что Hard Links не порождают ни Mode l (Link), ни Attributes ReparsePoint.
как сделать 1 большую папку из нескольких внешних юсби дисков без подпапок
какой предел.у меня 40 дисков
по каким причинам могут умирать жесткие ссылки на файл?
сделано 2 ссылки на файлы программы, эти файлы (хардлинки) вынесены в отдельный каталог, который доступен по сети, чтобы не расшаривать всю папку программы (сами файлы доступны только на чтение, пишет в них только сама программа на ПК. В итоге с некоторой периодичностью хардлинки отваливаются превращаясь в отдельные файлы, и датой изменения за какой-то из предыдущих дней (день когда ссылка умерла).
Тема удаления симлинков не раскрыта, как удалить ссылку, но не папку?
Как изменить ссылку, чтобы изменить место в сетевом хранилище, ну т.е. ссылку вела на сервер 1 там лежит папка такая-то, а как вот теперь изменить в созданном симлинке конечный объект на который она ссылается?
Например сделали ссылку вот так:
mklink /D C:\Users\Вася\PhpstormProjects \\server1\PhpstormProjects
а тепер нужно изменить, чтобы она смотрела на
\\server2\PhpstormProjects
Вот не понимаю как.
Если только через удаление ссылки и создание новой, ок, а как корректно удалить ссылку, но не удалить папку?
Ссылка на то и ссылка, что удалив ссылку вы не потеряете информацию. И не важно какой тип ссылки вы использовали. В случае жёсткой ссылки вы можете удалить любую из копий, главное чтобы была хотя бы одна копия. В случае симлинка (мягкой ссылки), удалять нужно соответственно только сам симлинк но не оригинал. У случае с жёсткими ссылками вы можете менять их имена, без проблем, в случае симлинка, менять имя можно симлинка, но не объекту на который он ссылается, иначе перестанет работать (по аналогии с обычными ярлыками)