Символическая ссылка (симлинк, символьная ссылка, 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
C:\Windows\system32>dir -Recurse -Force | where linktype -eq hardlink | select FullName,Target
«select» не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
Вероятно в статье имеет смысл более подробно раскрыть разницу между жесткими ссылками и линками. Особенно в контексте конкретных сценариев.
Кстати, жёсткие ссылки не поддерживаются в 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
Вот не понимаю как.
Если только через удаление ссылки и создание новой, ок, а как корректно удалить ссылку, но не удалить папку?
Ссылка на то и ссылка, что удалив ссылку вы не потеряете информацию. И не важно какой тип ссылки вы использовали. В случае жёсткой ссылки вы можете удалить любую из копий, главное чтобы была хотя бы одна копия. В случае симлинка (мягкой ссылки), удалять нужно соответственно только сам симлинк но не оригинал. У случае с жёсткими ссылками вы можете менять их имена, без проблем, в случае симлинка, менять имя можно симлинка, но не объекту на который он ссылается, иначе перестанет работать (по аналогии с обычными ярлыками)
подскажите пожалуйста, как сделать ссылку, что написать в командной строке , если программа обращается к папке c\user\appData,
хочу перенести AppData на другой диск.
mklink /j c:\Users\%UserName%\AppData d:\Users\%UserName%\AppData
Предварительно вам необходимо перенести папку Appdata на другой диск и соответственно удалить ее на диске С:, операцию необходимо проводить под другим пользователем с правами админа
Вместо %UserName% естественно надо будет указать имя профиля нужного вам пользователя, для которого осуществляется перенос папки
Добрый день, а можно ли сделать общий доступ по сети к символической ссылке? Т.е. у меня была расшарина на сервере папка soft, папка переехала на другой сервер, и я хочу создать создать символическую ссылку soft и дать общий доступ с к этой ссылке. Пока после эксперимента выдается ошибка: разрешение на доступ к \\serv01\soft отсутствуют (на доступ к ссылке).
Скорее всего связано с тем, что такой тип ссылок по умолчанию отключен:
fsutil behavior query SymlinkEvaluation
вернет
Remote to remote symbolic links are disabled.
Их надо включить
fsutil behavior set SymlinkEvaluation R2R:1
А потом можно создать ссылку на UNC путь:
mklink /d \\srv1\folder1\SomeLink \\srv2\folder1\targetdir
Здравствуйте!
У меня есть windows программа, которая должна обращаться к смежной папке. Сами файлы хранятся на другом хосте (synology) с доступом по авторизации, из которого нельзя сделать доступ без авторизации. В самом windows папки synology доступны под запомненным логиным и паролем. Но по символической ссылке папка не открывается. Подскажите, связано ли это именно с моментом авторизации системы windows. Как можно дать системе windows логин и пароль для авторизации.
Через symlink думаю, не получится. Используйте сетевую папку через net use, там можно задать пароль для подключения.
Либо как вариант — скрипт: который при входе подключает сетевую папка с указанной учеткой, потом создает симлина с использованием буквы диска сетевой папки. При выходе соответсвенно, удалять симлинк, чтобы он создавался после монтирования сетевой папки.
Спасибо за помощь! Странно, но на следующий день доступ у пользователей windows появился (кто имел уже доступ к общим папкам). Под тестовым пользователем прошел в сетевую общедоступную папку, после этого программа стала запускаться у всех пользователей с доступом и обращаться к базе данных нормально. Похоже права доступа, пути, на стороне windows работают по какой-то особенной логике.