Символическая ссылка 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).
История
Символические ссылки на каталоги или тома, именуемые точками соединения и точками монтирования, были впервые реализованы в NTFS 3.0 (Windows 2000). C версии NTFS 3.1 можно создавать символические ссылки для любых файловых объектов, но изначально эта функция не была доступна приложениям. Позже были разработаны сторонние драйверы-фильтры, например, открытый драйвер senable Масатоси Кимуры, которые делали возможность доступной и для пользовательских приложений. С выходом Windows Vista поддержка символических ссылок активирована по умолчанию.
С версии NTFS 3.1 символические ссылки могут указывать также на файлы или SMB-пути к сетевым ресурсам. Напротив, точки соединения поддерживают только абсолютные пути внутри локального тома, а символические ссылки — любые относительные пути и ссылки между файловыми системами. Однако для перекрёстных символических ссылок на сетевые ресурсы требуется поддержка с обеих сторон.
Примечания
Литература
- Документация по символическим ссылкам NTFS на MSDN
- Функция CreateSymbolicLink в Win32 API
- fsutil hardlink create — команды для создания жёстких ссылок (Windows 2000 и новее)
- Статья Microsoft Knowledge Base — «Как создавать и управлять точками соединения NTFS» (архив)
- Junction — командная утилита Microsoft TechNet
- Статья на Codeproject — разбор кода утилиты точек соединения
- Про добавление каталогов в меню «Пуск» PC Mag Article (англ.). PCMag. Дата обращения: 27 мая 2025. Архивировано 11 декабря 2008 года.