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

Символические ссылки NTFS (англ. NTFS links) — это абстракции, используемые в файловой системе NTFS (основной файловой системе всех версий Microsoft Windows, относящихся к семейству Windows NT), для связывания путей и определённых видов метаданных с записями в главной файловой таблице. NTFS во многом реализует подход, схожий с типичными файловыми системами Unix: данные и метаданные файлов также хранятся и ссылаются схожим образом, однако главное отличие NTFS состоит в том, что здесь MFT заменяет иноды, выполняя большинство их функций.

Описание

В NTFS сущность в файловой системе представлена как запись в MFT определённого тома NTFS, где сама MFT является ядром базы данных файловой системы; с ней также могут быть связаны различные атрибуты и потоки данных NTFS. Ссылка в NTFS — это также запись, хранящаяся в MFT, которая «указывает» на другую запись MFT, являющуюся целью ссылки. Ссылки представляют собой «вхождения» файлов в иерархическом дереве файлов тома: любой путь вида \foo.exe или \foobar\baz.txt в NTFS является ссылкой. Если такой том смонтирован в системе как D:, пользователь может обратиться к этим файлам как D:\foo.exe и D:\foobar\baz.txt. Для сравнения: в типичной файловой системе Unix ссылка является записью в каталоге, который, как и файл, является объектом в системе, указывающей на другую ссылку или непосредственно на inode.

Виды ссылок

В NTFS предусмотрено четыре типа ссылок, близких по назначению к понятиям жёсткой и символической ссылки, распространённым в современных файловых системах.

Жёсткие ссылки

Жёсткие ссылки работают традиционным образом: они «указывают» на запись в MFT. Такой целевой записью обычно является обычный файл, например текстовый или исполняемый файл, если том NTFS не содержит ошибок. Как и в Unix-системах, жёсткая ссылка в NTFS не может указывать на каталог.

При стандартном создании файла на томе NTFS система выделяет одну новую запись в MFT для хранения метаданных новой файловой сущности, сведений о кластерах и потоках данных; одну запись для жёсткой ссылки, указывающей на только что созданную запись в качестве её цели; ссылка на жёсткую ссылку фиксируется в каталоге; для обеих новых записей устанавливается счётчик ссылок равный 1. Имя файла, переданное при создании, записывается в жёсткой ссылке. Одна запись MFT может быть целью до 1024 жёстких ссылок; при каждом успешном создании новой жёсткой ссылки на существующую запись её счётчик ссылок увеличивается.

При удалении жёсткой ссылки NTFS выполняет удаление ссылки из содержащего её каталога, а также уменьшает на 1 счётчики ссылок и для целевой записи, и для самой ссылки. Любая запись MFT с обнулённым счётчиком считается «удалённой»: все её ресурсы освобождаются и могут быть перезаписаны.

Точки соединения

Точки соединения представляют собой точки повторной обработки NTFS и действуют сходно с символическими ссылками в Unix/Linux, но определяются только для каталогов и допускают только абсолютные локальные пути, не поддерживая удалённые файловые системы. Создаются и работают они аналогично жёстким ссылкам, но при переименовании, перемещении или удалении целевого каталога такая ссылка становится недействительной[1][2].

  • Точки монтирования NTFS

Символические ссылки

Символические ссылки — это точки повторной обработки, работающие похожим образом на точки соединения или символические ссылки Unix/Linux, но допускающие относительные пути, а также ссылки как на каталоги, так и на файлы. Поддержка каталогов и UNC-путей (сетевых путей) добавлена в NTFS 3.1.

Все типы ссылок NTFS спроектированы так, чтобы быть прозрачными для приложений: файловый драйвер самостоятельно перенаправляет операции, не требуя специальной обработки. Пользователь воспринимает их как обычные каталоги или файлы. При этом возможны эффекты алиасов: запись в ссылку приводит к записи в целевой файл или запись MFT.

Символическая ссылка содержит путь к целевому каталогу либо файлу и дополнительный тег, идентифицирующий драйвер, реализующий поведение точки обработки. Поскольку путь записан явно, возможно создание ссылок на объекты других томов или даже на удалённые файлы. Однако если целевой файл будет удалён или переименован, ссылка станет недействительна; если же вместо целевого файла/каталога появится другой, ссылка будет указывать уже на новый объект.

Файлы-ярлыки Windows

Символическая ссылка NTFS не то же самое, что файл-ярлык Windows — последний является обычным файлом, может создаваться в любых файловых системах (например, FAT32), хранить дополнительные метаданные и не является прозрачным для приложений.

Unix-подобные среды для Windows, например, Cygwin и Mingw, могут эмулировать символические ссылки с помощью файлов-ярлыков, если настройки ОС это допускают.

Примеры использования

Встроенное использование

  • Хранилище компонентов Windows (WinSxS) применяет жёсткие ссылки для отслеживания версий библиотек DLL, хранящихся на диске.
  • В базовой установке Windows Server 2008 символические ссылки использовались для перенаправления \Users\All Users в \ProgramData.
  • Начиная с Windows Vista, все версии Windows используют схемы скрытых точек соединения для встроенных каталогов, обеспечивая обратную совместимость с Windows XP и более ранними версиями. Примеры таких точек:
    • C:\Documents and Settings, указывающая на C:\Users
    • %USERPROFILE%\Application Data на %USERPROFILE%\AppData\Roaming
    • %USERPROFILE%\My Documents\My Pictures на %USERPROFILE%\Pictures

Перенаправление программ

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

Экономия места

Точки соединения практически не занимают дискового пространства, поскольку ссылаются на исходный каталог. Если требуется иметь несколько точек входа в крупный каталог, точки соединения — эффективное решение. Их нельзя путать с «копией» — они лишь указывают на оригинал. Для независимого редактирования каталогов точка соединения не подойдёт, так как не создаёт отдельную копию содержимого.

Также символические и жёсткие ссылки применяются для объединения содержимого файлов.

Обход предопределённых путей

При переустановке Windows помогает использование нескольких разделов: удалять придётся только один. Однако некоторые программы не позволяют выбрать путь установки по желанию пользователя и записывают файлы только на диск C:. Создавая точку соединения, можно заставить программу считать другой путь целевым.

Командные утилиты

В Windows предусмотрен ряд инструментов для создания и работы с NTFS-ссылками:

  • PowerShell: команда New-Item позволяет создавать пустые файлы, каталоги, точки соединения и жёсткие ссылки[3]. В PowerShell 5.0 и выше доступно создание символических ссылок[4]. Команды Get-Item и Get-ChildItem позволяют получать информацию о файловых объектах и их типе. Remove-Item может удалять такие объекты, однако в некоторых случаях была зафиксирована ошибка[5].
  • Командная строка Windows: начиная с Windows Vista и Windows Server 2008 внутренняя команда mklink создаёт точки соединения, жёсткие и символические ссылки[6]. Она также доступна в ReactOS[7]. Команда dir с ключом /aL показывает и фильтрует точки соединения[8]. Также rd (rmdir) удаляет точки соединения.
  • fsutil.exe: командная утилита, появившаяся в Windows 2000, команда hardlink позволяет создавать жёсткие ссылки или выводить их список[9]. Другая команда, reparsepoint, управляет и удаляет точки повторной обработки[10].

Дополнительные сторонние утилиты для создания NTFS-ссылок:

  • linkd: входит в Resource Kit для Windows 2000 и Windows Server 2003[11]. Позволяет создавать точки соединения[12].
  • junction: бесплатная консольная программа от Microsoft для создания и удаления точек соединения[2].
  • PowerShell Community Extensions (PSCX): модуль для PowerShell Gallery[13], содержит cmdlet-ы для NTFS-ссылок: New-Hardlink, New-Junction, Get-ReparsePoint, Remove-ReparsePoint и др[14].

Программные интерфейсы (API)

Для создания жёстких ссылок приложения могут использовать функцию CreateHardLink() из Windows API. Чтобы узнать количество связанных жёстких ссылок файла, во всех версиях Windows NT можно вызвать GetFileInformationByHandle(). Одна запись MFT поддерживает до 1024 связанных ссылок. Символические ссылки создаются с помощью функции CreateSymbolicLink(). Для создания точек соединения требуется вручную заполнять структуру точки обработки[15]. Точки соединения поддерживаются только для каталогов: хотя API не выдаёт ошибку при создании точки на файл, при попытке использования такая ссылка не распознаётся.

Точки соединения и символические ссылки на каталоги можно удалить через функцию RemoveDirectory().

Ограничения и опасности

Консистентность

Символические ссылки и точки соединения NTFS могут указывать на несуществующие объекты — операционная система не гарантирует постоянную актуальность целей[16].

Дополнительная опасность кроется в следующих случаях:

  • создание ссылок, указывающих на собственные родительские каталоги (например, X:\path\to\parent на X:\path\ или X:\path\to\);
  • задание цели с помощью буквы тома (например, X:\some\path\).

Рекурсивные структуры

В первом случае возникают рекурсивные пути, что приводит к потенциально бесконечной рекурсии в структуре каталогов. Структура файловой системы превращается из простого дерева в ориентированный граф, а рекурсивные ссылки могут сделать его циклическим. Одинаковые файлы и каталоги будут доступны по разным путям; программы, обходящие такую структуру наивно, могут выдавать ошибочные или неполные результаты, либо вовсе «зависнуть». При рекурсивном удалении такие программы могут ошибочно удалить родительский каталог обрабатываемого.

Описанные ситуации действительно встречаются в стандартных жёстких ссылках Windows 10, например:

C:\ProgramData\
C:\ProgramData\Application Data\
C:\ProgramData\Application Data\Application Data\
C:\ProgramData\Application Data\Application Data\Application Data\
...

Любой путь из этой последовательности формально корректен и ссылается на одну и ту же область. На практике путь ограничен 260 символами (или 32767 в новых версиях), но при копировании или архивировании с сохранением точек соединения на другой том или компьютер возможны частичные или некорректные пути, а копия может содержать активные каталоги текущей системы. Например, архив X:\archive\Users\USERNAME\My Documents может указывать на C:\Users\USERNAME\Documents\ активной системы.

Кросс-томовые ссылки

При копировании или перемещении тома со структурой, в которой жёсткие ссылки содержат буквы томов (например, X:), такие ссылки после копирования могут уже не указывать на соответствующие объекты в новой копии. Всё зависит от программы копирования: одни могут пытаться корректировать ссылки, другие — копировать их дословно, некоторые могут просматривать их содержимое.

Если жёсткие ссылки копируются дословно и становятся перекрёстными (на другие тома), это может привести к непредвиденным последствиям — например, удаление «архивного» каталога на резервном диске приведёт к удалению активных пользовательских данных или системных файлов.

Для уменьшения опасности рекомендуется использовать GUID-идентификаторы томов:[17]

X:\Some\Path> linkd Foo \\?\Volume{12345678-abcd-1234-abcd-1234567890ab}\Some\Other\Path

Такая ссылка сохранит актуальность даже при изменении буквы тома.

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

dir /AL /S /B "X:\Some\Path"

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

Ограничения использования

Требования к привилегиям

По умолчанию в Windows создание символических ссылок запрещено для обычных и не повышенных администраторов, но разрешено создание точек соединения. Изменить поведение можно через "secpol.msc" (Консоль локальной политики безопасности: Security Settings\Local Policies\User Rights Assignment\Create symbolic links) или запустить cmd.exe с правами администратора (или командой runas). В Windows 10 Insiders build 14972 и выше в режиме разработчика разрешено создавать символические ссылки без повышения прав через флаг SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE[18].

На этапе загрузки

Процесс загрузки Windows не поддерживает точки соединения, поэтому невозможно перенаправить ключевые системные каталоги:

  • \Windows
  • \Windows\System32
  • \Windows\System32\Config

Другие критически важные файлы (например, файл спящего режима hiberfil.sys) также не подлежат перенаправлению.

Системные каталоги

Технически возможно перенаправление следующих не критичных системных каталогов:

  • \Users
  • \Documents and Settings
  • \ProgramData
  • \Program Files
  • \Program Files (x86)

Однако это может привести к серьёзным сбоям и снижению надёжности Windows. Создание точек соединения для \Users и \ProgramData на другой диск нарушает обновления и работу приложений из Windows Store[19].

Перенаправление \Users, \ProgramData, \Program Files или \Program Files (x86) лишает возможности установить/обновить Windows[20].

Создание точек соединения для \Program Files или \Program Files (x86) на другой диск нарушает работу Component Based Servicing, которая связывает файлы из \Windows\SxS с целевыми директориями.

Windows Installer

Windows Installer полностью не поддерживает символические ссылки; попытка перенаправления \Windows\Installer приведёт к ошибкам .msi-установщиков (2755/1632).

Символические ссылки в Windows XP

В Windows XP возможно включение поддержки символических ссылок, поскольку используется совместимая версия формата NTFS. Для этого применяют сторонний драйвер-фильтр файловой системы[21].[22]

История

Символические ссылки на каталоги или тома, именуемые точками соединения и точками монтирования, были впервые реализованы в NTFS 3.0 (Windows 2000). C версии NTFS 3.1 можно создавать символические ссылки для любых файловых объектов, но изначально эта функция не была доступна приложениям. Позже были разработаны сторонние драйверы-фильтры, например, открытый драйвер senable Масатоси Кимуры, которые делали возможность доступной и для пользовательских приложений. С выходом Windows Vista поддержка символических ссылок активирована по умолчанию.

С версии NTFS 3.1 символические ссылки могут указывать также на файлы или SMB-пути к сетевым ресурсам. Напротив, точки соединения поддерживают только абсолютные пути внутри локального тома, а символические ссылки — любые относительные пути и ссылки между файловыми системами. Однако для перекрёстных символических ссылок на сетевые ресурсы требуется поддержка с обеих сторон.

Примечания

  1. Hard Links and Junctions (англ.). Windows Developer. Microsoft (31 мая 2018). Дата обращения: 27 мая 2025.
  2. 1 2 Junction v1.07 (англ.). Sysinternals. Microsoft (4 июля 2016). Дата обращения: 27 мая 2025.
  3. New-Item (PowerShell 3.0) (англ.). Microsoft Docs. Microsoft (22 июня 2020). Дата обращения: 27 мая 2025.
  4. New-Item (PowerShell 5.0) (англ.). Microsoft Docs. Microsoft (22 июня 2020). Дата обращения: 27 мая 2025.
  5. Fix Remove-Item <symbolic link to directory> (англ.). PowerShell repo. Microsoft (4 марта 2016). Дата обращения: 27 мая 2025.
  6. mklink.c (англ.). reactos repo. ReactOS Deutschland e.V. (3 октября 2017). Дата обращения: 27 мая 2025.
  7. Dir (англ.). Microsoft Docs. Microsoft (18 апреля 2012). Дата обращения: 27 мая 2025.
  8. Fsutil hardlink (англ.). Microsoft Docs. Microsoft (18 апреля 2012). Дата обращения: 27 мая 2025.
  9. Fsutil reparsepoint (англ.). Microsoft Docs. Microsoft (18 апреля 2012). Дата обращения: 27 мая 2025.
  10. Download Windows Server 2003 Resource Kit Tools (англ.). Download Center (10 марта 2015). Дата обращения: 27 мая 2025. Архивировано 10 марта 2015 года.
  11. How to create and manipulate NTFS junction points (англ.). Microsoft Support (9 марта 2015). Дата обращения: 27 мая 2025. Архивировано 9 марта 2015 года.
  12. Pscx (англ.). PowerShell Gallery. Microsoft (17 января 2018). Дата обращения: 27 мая 2025.
  13. Hill, Keith; Grehan, Oisin README.md (англ.). pscx repo (17 января 2018). Дата обращения: 27 мая 2025.
  14. Implementations of a CreateJunctionW() Function (англ.). eskamation.de. Дата обращения: 26 мая 2025.
  15. Programming Considerations (Windows) (англ.). msdn.microsoft.com (4 марта 2021). Дата обращения: 27 мая 2025.
  16. File path formats on Windows systems (англ.). docs.microsoft.com (14 декабря 2022). Дата обращения: 27 мая 2025.
  17. Symlinks in Windows 10! - Windows Developer Blog (англ.). blogs.windows.com (2 декабря 2016). Дата обращения: 27 мая 2025.
  18. Relocation of the Users directory and the ProgramData directory to a drive other than the drive that contains the Windows directory (англ.). Microsoft Support. Дата обращения: 12 марта 2015.
  19. You encounter an error when trying to install Windows 8.1 due to redirecting the Users or Program Files folder to another partition (англ.). Microsoft Support. Дата обращения: 12 марта 2015.
  20. Hermann Schinagl. ln - командная утилита для жёстких ссылок - Символические ссылки для Windows XP (англ.) (23 августа 2013). Дата обращения: 27 мая 2025.
  21. リンク/ジャンクション作成ツール (яп.). emk.name. Дата обращения: 27 мая 2025.

Литература