Записки IT специалиста
Работаем с жесткими и символическими ссылками в Windows
- Автор: Уваров А.С.
- 11.05.2022
Жесткие и символические ссылки давно знакомы и активно используются Linux-администраторами, в то время как их Windows коллеги используют их гораздо реже, а некоторые вообще не знают о такой возможности. Тем не менее такая возможность в Windows существует и позволяет значительно упростить некоторые сценарии работы с папками и файлами. В данной статье мы рассмотрим все виды ссылок, доступные в среде ОС Windows, а также разные способы работы с ними, начиная от командной строки и заканчивая PowerShell.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.
Жесткие ссылки (HardLink)
Жесткие ссылки представляют собой дополнительную запись в файловой таблице раздела для существующего файла. Таким образом жесткая ссылка ничем не отличается от исходного файла, но файл при этом не копируется физически и остается на диске в единственном экземпляре. При изменении файла по любой из жестких ссылок, остальные обновляются автоматически (что логично, так как файл один).
Мы можем переименовывать, копировать, перемещать (в пределах логического тома) ссылки — размер занимаемого места при этом не изменится. При удалении ссылок файл продолжает существовать до тех пор, пока не будет удалена последняя жесткая ссылка на него. Фактически отличить, где находится оригинальный файл, а где жесткая ссылка невозможно, по сути, файл на разделе это и есть жесткая ссылка.
Жесткая ссылка может существовать только в пределах логического тома, поддерживается файловыми системами NTFS и ReFS начиная со сборки 19536.
Для создания жесткой ссылки можно воспользоваться утилитой mklink:
Где ключ /H предписывает создать именно жесткую ссылку, далее следует путь к новому файлу и целевому файлу, на который мы делаем ссылку. Путь можно указывать как абсолютные, так и относительные, в имени создаваемого файла не забывайте указывать расширение.
Ссылки можно создавать и при помощи PowerShell, для этого воспользуйтесь командой:
Команда другая, но принцип тот же самый: -ItemType — тип создаваемой ссылки, в нашем случае жесткая ссылка, -Path — путь к создаваемому файлу ссылки, -Target — файл на который мы делаем ссылку.
Можно ли сделать жесткую ссылку на директорию? Нет, только на файлы.
Вроде бы все понятно, но если внимательный читатель заглянет в свойства папки с жесткой ссылкой, то он увидит, что ее размер равен исходному файлу, если сделаем в ней еще одну жесткую ссылку — двум исходным файлам. Как так? Не стоит переживать, все нормально. Для операционной системы жесткая ссылка ничем не отличается от обычного файла и при подсчете свободного места учитывается размер каждой ссылки, но на самом деле на диске хранится единственная копия. В этом можно убедиться, если одновременно с созданием жестких ссылок контролировать свободное место на диске.
При желании мы можем провернуть даже такой фокус:
Какой вывод можно сделать из того, что мы увидели и где нам могут пригодиться жесткие ссылки? Прежде всего для предоставления пользователям доступа к объемным архивам, образам или инсталляционным пакетам. Скажем у вас есть файловый сервер и несколько отделов, каждому из которых нужно предоставить доступ к одному и тому же большому файлу. При этом вы можете не бояться, что кто-то удалит файл, он удалит его только у себя в директории, для остальных пользователей он останется доступен.
Но при этом надо очень внимательно относиться к вопросу одновременного редактирования файла, так как он существует в единственном экземпляре, но доступен по множеству ссылок в этом сценарии могут возникнуть самые разные коллизии.
Точки соединения (Junction)
Очень старая технология, поддерживаемая еще начиная с Windows 2000, позволяет сделать один из каталогов псевдонимом другого каталога. Чем-то напоминает символические ссылки, но в крайне упрощенном варианте. В качестве цели можно использовать только локальные папки, но при этом нет ограничения по размещению их на одном томе. Т.е. целевая папка может находиться на диске C:, а точка соединения для нее на диске D: и все будет работать. Точки соединения поддерживаются файловыми системами NTFS и ReFS.
Для создания точки соединения можно использовать mklink:
Ключ /J указывает на создание точки соединения, далее следует папка каталога-псевдонима и папка целевого каталога. При любом изменении целевого каталога (перемещение, переименование, удаление) точка соединения перестает работать.
Обратите внимание, что данная папка в проводнике отображается как ярлык, а выводе команды dir как точка соединения.
Это же действие в PowerShell:
Комментировать здесь особо нечего, краткость не входит в число добродетелей PowerShell, но не оставляет места догадкам, все просто и понятно.
Зачем сейчас нужны точки соединения? После появления в NT 6.0 настоящих символических ссылок не нужны, но вы можете встретиться с ними как в устаревших системах, так и в современных, где они могут присутствовать в виде наследия. Поэтому знать о них и уметь с ними работать современному администратору надо.
Символические ссылки (SymbolicLink)
Пожалуй, самый популярный вид связи, позволяет создавать множество псевдонимов для файлов или каталогов размещая их на любых поддерживаемых локальных файловых системах. В качестве цели могут быть использованы как локальные, так и сетевые объекты. При создании символической ссылки можно использовать как абсолютные, так и относительные пути. Но в последнем случае вы не можете перемещать ссылку — она перестанет работать. Символические ссылки поддерживаются начиная с NT 6.0 (Vista и Server 2008) и работают с файловыми системами NTFS и ReFS.
Для создания символических ссылок можно использовать mklink, без параметров она создает симлинк для файла:
При создании ссылки не забываем указать расширения для файла. Как и в случае с точкой соединения символическая ссылка отображается в виде ярлыка и обозначается в выводе команды dir:
Для создания символической ссылки на директорию добавьте ключ /D:
В PowerShell все проще, тип объекта будет определен автоматически:
Если в качестве цели указан файл — будет создана ссылка на файл, каталог — ссылка на каталог.
При переименовании, перемещении или удалении исходного файла или каталога все символические ссылки работать перестанут:
При копировании символической ссылки за пределы локального тома будет скопирован исходный файл, даже если целевой том поддерживает работу со ссылками, но это не мешает создать новую ссылку на другом томе.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.
Помогла статья? Поддержи автора и новые статьи будут выходить чаще:
Или подпишись на наш Телеграм-канал:
Использование символических ссылок в Windows
03.03.2021
itpro
PowerShell, Windows 10, Windows Server 2016
комментариев 14
Символическая ссылка (симлинк, символьная ссылка, Symbolic link) это специальный файл на файловой системе, которые сам не содержит данных, а является по сути ярлыком, указывающим на какой-то другой объект (файл или папку). При обращении к симлику операционная система считает, что это оригинальный файл (папка) и работает с ними совершенно прозрачно.
Символические ссылки используются в Windows довольно часто для системных файлов и каталогов. Пользователь может их применять, когда нужно перенести часть “тяжелых” файлов на другой диск, но чтобы Windows считала, что файлы все еще находятся в исходном каталоге (например в ситуациях, когда нужно экономить место на SSD, перенеся некоторые каталоги на более медленный и емкий SSD, не нарушая работоспособности программ). Можно использовать симлинки на SMB файловом сервере, когда каталоги с разных LUN должны быть доступны через одну точку входа.
В Windows есть три типа файловых ссылок для NTFS томов: жесткие, мягкие (симлинки), точки соединения (Junction point).
В подавляющем большинстве случаев вам будет достаточно функционала symbolic link, как наиболее универсального средства создания ссылки на любой объект.
Как создать символическую ссылку в Windows?
Для создания символических и жестких ссылок в Windows можно использовать встроенную утилиты mklink или PowerShell.
Синтаксис у утилиты mklink простой. Чтобы создать символическую ссылку на файл, нужно указать имя ссылки и целевой объект, на который она должна указывать. Можно указать тип ссылки: /D — символьная (мягкая) ссылка на каталог, /H — жесткая ссылка, /J – точка соединения (Junction point).
Если вам нужно разрешить создавать символические ссылки обычным пользователям, нужно добавить группу пользователей в параметр групповой политики 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
Должно появится сообщение:
Теперь для запуска процесса notepad.exe можно использовать символическую ссылку note.exe.
Теперь создадим в этом каталоге симлинк на другой каталог на этом же диcке:
mklink /D “C:\PS\Downloads” “C:\Users\user\Downloads”
Теперь при переходе в каталог C:\PS\Downloads вы будете видеть содержимое каталога, на который он ссылается.
Выведем содержимое каталога 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\С$
Если при доступе к сетевой папке через симлинк, вы получили ошибку
проверьте разрешенные способы использования символических ссылок на вашем компьютере:
fsutil behavior query SymlinkEvaluation
Чтобы включить использование символических ссылок на удаленные ресурсы, выполните команды:
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
Предыдущая статья Следующая статья
Когда истекает пароль пользователя в AD, оповещаем пользователей о необходимости сменить пароль
alt=»обзор конфигурации RDS в Server Manager» width=»58″ height=»56″ /> Установка и настройка фермы Remote Desktop Services (RDS) в Windows Server
alt=»настройка Remote Desktop Gateway на Windows Server 2019 закончена» width=»58″ height=»56″ />Настройка шлюза Remote Desktop Gateway на Windows Server
alt=»Вам понадобится новое приложение, чтобы открыть эту ссылку WindowsDefender» width=»58″ height=»56″ />Вам понадобится новое приложение, чтобы открыть эту ссылку Windows Defender
Раз уж речь про 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
Вот не понимаю как.
Если только через удаление ссылки и создание новой, ок, а как корректно удалить ссылку, но не удалить папку?
Ссылка на то и ссылка, что удалив ссылку вы не потеряете информацию. И не важно какой тип ссылки вы использовали. В случае жёсткой ссылки вы можете удалить любую из копий, главное чтобы была хотя бы одна копия. В случае симлинка (мягкой ссылки), удалять нужно соответственно только сам симлинк но не оригинал. У случае с жёсткими ссылками вы можете менять их имена, без проблем, в случае симлинка, менять имя можно симлинка, но не объекту на который он ссылается, иначе перестанет работать (по аналогии с обычными ярлыками)
Как создать ссылку на файл, папку или библиотеку на вашем компьютере
Когда вы работаете с общими ресурсами в сети, вам может понадобиться быстро получить ссылку на общую сетевую папку и вставить ее в окно чата. Или, например, вы можете узнать, как создать ссылку на файл на вашем компьютере и использовать ее для предоставления доступа к этому файлу другим пользователям в той же сети. Несмотря на то, что их нелегко выяснить, Windows дает нам два способа гиперссылки на путь к файлу, папке или библиотеке, которые являются общими в сети.
ПРИМЕЧАНИЕ. Данное руководство охватывает Windows 10 с обновлением от мая 2020 года и Windows 7. В обеих операционных системах все работает одинаково.
Способ 1. Как создать ссылку на файл на вашем компьютере с помощью мастера общего доступа (также работает с гиперссылками на папки или библиотеки)
Когда вы делитесь файлом, папкой или библиотекой с сетью, вы можете использовать мастер общего доступа . Этот мастер включен по умолчанию, поэтому у вас не должно возникнуть проблем с его запуском. Чтобы узнать больше об этом, прочитайте это руководство и следуйте ему, чтобы делиться файлами, папками или библиотеками: Как делиться папками, файлами и библиотеками с сетью в Windows.
На последнем этапе процесса, когда мастер совместного использования сообщает, что файл, папка или библиотека является общим, не закрывайте мастер.
Посмотрите внимательно под «Файл/папка/библиотека совместно» уведомления. Там Windows сообщает, что «Вы можете отправить кому-нибудь ссылки на эти общие элементы по электронной почте или скопировать и вставить ссылки в другое приложение».
При нажатии кнопки или нажмите адрес электронной почты ссылку, используемый по умолчанию клиент электронной почты будет открыт, и прямая ссылка автоматически вставляется в него.
Если вы нажмете ссылку «копировать», ссылка на общий ресурс будет скопирована в буфер обмена, и вы сможете вставить ее в другие программы.
Способ 2: Как создать ссылку на файл на общем диске, используя File Explorer (также работает для гиперссылки на папки или библиотеки)
Второй метод применяется к файлам, папкам и библиотекам, которые вы уже открыли для общего доступа на своем компьютере Windows. Если вам интересно, как создать ссылку на файл на общем диске, этот метод тоже подойдет.
Откройте проводник , перейдите в раздел «Сеть» и дважды щелкните или дважды нажмите на ПК, где найден файл, папка или библиотека, которую вы хотите связать.
Это показывает вам список всех папок, которые используются в сети. Просматривайте, пока не найдете конкретный файл, папку или библиотеку, для которой вы хотите прямую ссылку.
Удерживая нажатой клавишу «Shift» на клавиатуре, щелкните правой кнопкой мыши файл, папку или библиотеку, для которой требуется ссылка. Затем выберите «Копировать как путь» в контекстном меню.
Если вы используете Windows 10, вы можете также выбрать пункт (файл, папка, библиотека) и нажмите кнопку или нажмите на «Копировать в пути» кнопке из File Explorer, домашней вкладки.
Затем вставьте ссылку в приложение или документ, где вы хотите, чтобы это было. У вас должно быть что-то похожее на это:
Чтобы активировать папку, библиотеку или ссылку на файл, нажмите клавишу « Ввод», чтобы сделать ее доступной для клика в приложении Office, куда вы ее скопировали. Когда вы нажимаете Ctrl + щелчок по ссылке, File Explorer открывает общий файл, папку или библиотеку, если сетевой компьютер, совместно использующий этот ресурс, доступен.
Мой путь к файлу не работает! Почему?
В некоторых случаях создаваемые вами ссылки на файлы могут не работать. Есть несколько возможных причин. Вот что вы можете попробовать:
Независимо от того, хотите ли вы создать ссылку на файл, папку или библиотеку, в некоторых приложениях вам может потребоваться ввести «file:///» перед сетевым путем, например так:
В других случаях, в зависимости от приложений, в которые вы хотите поместить ссылки на файлы, вам также может понадобиться вручную заменить все пустые места в путях ссылок следующим текстом: %20. Вот пример:
Существует также вероятность того, что в некоторых старых версиях Windows или в других операционных системах обратные слеши сетевых путей не распознаются. В этом случае вы можете попробовать заменить все обратные косые черты (\) на прямые косые черты (/).
Наконец, обратите внимание, что, что бы вы ни делали, в некоторых приложениях ссылки на файлы просто не работают как обычные ссылки. Так обстоит дело с большинством веб-браузеров и чатов, которые рассматривают эти локальные ссылки как угрозы безопасности. Однако, несмотря на это, пользователь, который получает вашу ссылку на файл, может по-прежнему использовать ссылку для доступа к этому файлу, папке или библиотеке. Все, что ему нужно сделать, это скопировать и вставить ссылку в адресной строке (его или ее) Проводника и нажать Enter.
Вы используете файловые гиперссылки?
Мы надеемся, что вы нашли эти советы полезными. Если вам известны другие способы создания ссылки на файлы, папки или библиотеки, используемые в сети, сообщите нам об этом. Прокомментируйте ниже, и давайте поделимся всеми способами генерировать ссылки в Windows.