Ссылки NTFS — это абстракция, используемая в файловой системе NTFS — файловой системе по умолчанию для всех версий Microsoft Windows , принадлежащих к семейству Windows NT — для связывания имен путей и определенных видов метаданных с записями в главной таблице файлов NTFS (MFT). NTFS в целом принимает шаблон, схожий с типичными файловыми системами Unix в том, как она хранит и ссылается на файловые данные и метаданные; наиболее существенное отличие заключается в том, что в NTFS MFT «занимает место» inodes , выполняя большинство функций, которые inodes выполняют в типичной файловой системе Unix.
В NTFS сущность в файловой системе по сути существует как: запись, хранящаяся в MFT тома NTFS, где MFT является основной базой данных файловой системы NTFS; и любые атрибуты и потоки NTFS, связанные с этой записью. Ссылка в NTFS сама по себе является записью, хранящейся в MFT, которая «указывает» на другую запись MFT: цель ссылки. Ссылки — это «записи» файлов в иерархическом дереве файлов тома : имя пути NTFS, например\foo.exeили\foobar\baz.txt является ссылкой. Если том, содержащий указанные пути, был сопоставлен сД:в системе Windows они могут называтьсяD:\foo.exeиD:\foobar\baz.txt. (Сравните и противопоставьте его типичным файловым системам Unix, где ссылка — это запись в каталоге (сами каталоги — это просто тип файла, хранящегося в файловой системе), указывающая либо на другую ссылку, либо на inode.)
В NTFS есть четыре типа ссылок. Они относительно близко соответствуют общим концепциям жестких и мягких ссылок , которым, как правило, следуют современные файловые системы.
Жесткие ссылки типичны в поведении. Жесткая ссылка «указывает» на запись MFT. Эта целевая запись будет записью для «обычного» файла, такого как текстовый файл или исполняемый файл (предполагая, что том NTFS находится в нормальном «здоровом» состоянии). Сравните с типичной файловой системой Unix , где жесткая ссылка указывает на inode . Как и в таких файловых системах, жесткая ссылка NTFS не может указывать на каталог.
Типичное событие создания нового файла на томе NTFS, таким образом, просто включает в себя выделение и создание NTFS одной новой записи MFT для хранения метаданных файла новой файловой сущности , включая информацию о любых кластерах данных, назначенных файлу, и потоках данных файла; одну запись MFT для жесткой ссылки, которая указывает на первую вновь созданную запись MFT в качестве своей цели ; сохранение ссылки на жесткую ссылку в файле каталога; и установку счетчика ссылок обеих этих записей MFT на 1. Любое имя файла , указанное как часть события создания файла, сохраняется в жесткой ссылке. Запись MFT может быть целью до 1024 жестких ссылок; каждый раз, когда успешно создается новая жесткая ссылка, указывающая на ранее существующую запись MFT, счетчик ссылок цели увеличивается.
Симметрично, непосредственные задачи, выполняемые NTFS в типичном событии удаления файла при удалении жесткой ссылки, просты: удаление ссылки на ссылку из файла каталога, содержащего ее (корневого каталога, если применимо); и уменьшение на 1количество ссылок записи MFT, на которую указывает ссылка, и записи, содержащей саму жесткую ссылку . Любая запись MFT, которая теперь имеет количество ссылок 0, теперь находится в состоянии «удален»: все связанные с ним ресурсы считаются «свободными» в NTFS и могут свободно перезаписываться и использоваться по мере необходимости.
Точки соединения являются точками повторной обработки NTFS и работают аналогично символическим ссылкам в Unix или Linux, но определяются только для каталогов и могут быть только абсолютными путями в локальных файловых системах (в отличие от удаленных файловых систем, к которым осуществляется доступ). Они создаются и ведут себя аналогично жестким ссылкам, за исключением того, что если целевой каталог переименован, перемещен или удален, ссылка больше не будет действительной. [1] [2]
Символические ссылки — это точки повторной обработки , которые работают аналогично точкам соединения или символическим ссылкам в Unix или Linux и принимают относительные пути и пути к файлам, а также каталогам. Поддержка путей каталогов и UNC была добавлена в NTFS 3.1.
Все ссылки NTFS должны быть прозрачными для приложений. Это означает, что приложение, получающее доступ к ссылке, будет плавно перенаправлено драйвером файловой системы, и никакой специальной обработки не требуется. Для пользователей они выглядят как обычные каталоги или файлы. Это также приводит к эффекту псевдонимов: запись в ссылку передаст запись в базовый связанный файл или запись MFT .
Символические ссылки и точки соединения содержат путь к связанному файлу и тег, идентифицирующий драйвер, который реализует поведение. Поскольку они записывают путь, они могут ссылаться на файлы на других томах или даже на удаленные файлы. Однако это также означает, что если указанный файл удален или переименован, ссылка становится недействительной, а если указанный файл или каталог заменен другим, ссылка теперь будет ссылаться на новый файл или каталог.
Символическая ссылка NTFS — это не то же самое, что файл ярлыка Windows, который является обычным файлом. Последний может быть создан в любой файловой системе (например, в более ранней FAT32 ), может содержать метаданные (например, значок для отображения при просмотре ярлыка в Удалить ссылки) и не является прозрачным для приложений.
Реализации unix-подобных сред для Windows, такие как Cygwin и Mingw, могут использовать файлы ярлыков для эмуляции символических ссылок, если операционная система хоста их не поддерживает, если настроена соответствующим образом.
C:\Documents and Settings
указывая наC:\Users
%USERPROFILE%\Application Data
указывая на%USERPROFILE%\AppData\Roaming
%USERPROFILE%\My Documents\My Pictures
указывая на%USERPROFILE%\Pictures
Установив точку соединения, которая указывает на каталог, содержащий определенную версию программного обеспечения, можно добавить другую версию программного обеспечения и перенаправить точку соединения так, чтобы она указывала на нужную версию.
Содержимое соединения почти не использует дискового пространства (оно просто указывает на исходный каталог). Если администратору необходимо иметь несколько точек входа в большой каталог, точки соединения могут быть эффективным решением. Точки соединения не следует путать с копией чего -либо, поскольку соединения просто указывают на оригинал. Если каталоги необходимо изменять отдельно, соединение использовать нельзя, поскольку оно не обеспечивает отдельную копию каталога или файлов внутри.
Аналогично символические и жесткие ссылки полезны для объединения содержимого отдельных файлов.
Поскольку переустановка Windows (или установка новой версии) часто требует удаления содержимого диска C:
, выгодно создать несколько разделов , чтобы во время установки нужно было удалить только один раздел. Однако некоторые программы не позволяют пользователю выбирать каталог установки или устанавливают некоторые из своих файлов на C:
диск, даже если они установлены на другой диск. Создав точку соединения, можно обмануть программу и заставить ее установиться в другой каталог.
В состав Windows входит несколько инструментов, позволяющих создавать и управлять ссылками NTFS.
New-Item
,который может создавать пустые файлы, папки, соединения и жесткие ссылки. [3] В PowerShell 5.0 и более поздних версиях он также может создавать символические ссылки. [4] Командлетыиможно использовать для опроса объектов файловой системы и, если это ссылки NTFS, поиска информации о них.Командлет может удалять указанные элементы, хотя была запись об ошибке, препятствующей правильной работе этого командлета. [5]Get-Item
Get-ChildItem
Remove-Item
mklink
внутренняя команда может создавать соединения, жесткие ссылки и символические ссылки. [6] Эта команда также доступна в ReactOS . [7] Кроме того, почтеннаяdir
команда может отображать и фильтровать точки соединения с помощью/aL
переключателя. [8] Наконец,rd
команда (также известная какrmdir
) может удалять точки соединения.hardlink
подкоманда может создавать жесткие ссылки или выводить список жестких ссылок, связанных с файлом. [9] Другая подкоманда, reparsepoint
, может запрашивать или удалять точки повторной обработки , объекты файловой системы, которые составляют точки соединения, жесткие ссылки и символические ссылки. [10]Кроме того, следующие утилиты могут создавать ссылки NTFS, даже если они не входят в комплект поставки Windows.
Для создания жестких ссылок приложения могут использовать функцию .mw-parser-output .monospaced{font-family:monospace,monospace}CreateHardLink() из Windows API . Все версии семейства Windows NT могут использовать GetFileInformationByHandle()
для определения количества жестких ссылок, связанных с файлом. С записью MFT может быть связано до 1024 ссылок. Аналогично функция CreateSymbolicLink() может создавать символические ссылки. Соединения создавать сложнее. Они требуют ручного заполнения информации о точке повторной обработки . [15] Пример кода можно найти в libuv . [16] Соединения определены только для каталогов: хотя API не дает сбоев при создании соединения, указывающего на файл, соединение не будет успешно интерпретировано при последующем использовании.
Соединения и символические ссылки, даже те, которые указывают на каталоги, можно удалить с помощью pNtSetInformationFile
. Реализация Libuv в unlink
Windows демонстрирует такое использование. [17] В качестве альтернативы, метод .NET System.IO.Directory.Delete()
также работает с ними. [18]
Символические ссылки и соединения NTFS могут указывать на несуществующие цели, поскольку операционная система не обеспечивает непрерывного наличия цели. [19]
Дополнительные опасности таятся в использовании соединений каталогов NTFS, которые:
X:\path\to\parent
, которая указывает либо на , X:\path\
либо X:\path\to\
на , либоX:
, в X:\some\path\
.Проблема в первом случае заключается в том, что он создает рекурсивные пути, что в дальнейшем подразумевает бесконечную рекурсию в структуре каталогов. Вводя повторную входимость, наличие одного или нескольких соединений каталогов изменяет структуру файловой системы с простого правильного дерева на направленный граф , но рекурсивное связывание еще больше усложняет теоретико-графический характер с ациклического на циклический. Поскольку одни и те же файлы и каталоги теперь могут встречаться по нескольким путям, приложения, которые наивно обходят повторные или рекурсивные структуры, могут давать неверные или непоследовательные результаты или могут никогда не завершиться. Хуже того, при рекурсивном удалении такие программы могут попытаться удалить родительский каталог, который они в данный момент обходят.
Обратите внимание, что оба условия, перечисленные выше, существуют в системе жестких ссылок, установленных на C:
диске в настройках Windows по умолчанию. Например, каждая установка Windows 10 определяет рекурсивный путь:
C:\ProgramData\C:\ProgramData\Application Data\C:\ProgramData\Application Data\Application Data\C:\ProgramData\Application Data\Application Data\Application Data\C:\ProgramData\Application Data\Application Data\Application Data\Application Data\C:\ProgramData\Application Data\Application Data\Application Data\Application Data\Application Data\ ...
Каждое дополнительное имя пути в этом, казалось бы, бесконечном наборе является фактическим допустимым путем Windows, который ссылается на то же местоположение. На практике имена путей ограничены ограничением пути DOS в 260 символов (или более новым ограничением в 32 767 символов), но усечение может привести к неполным или недействительным именам путей и файлов. Всякий раз, когда копия установки Windows архивируется с нетронутыми соединениями каталогов на другой том на том же самом или, что еще хуже, другом компьютере, архивированная копия может по-прежнему включать активные папки из работающей установки. Например, в зависимости от метода, используемого для копирования, резервная копия диска Windows X:\archive\...
будет включать жесткую ссылку X:\archive\Users\USERNAME\My Documents
, которая по-прежнему указывает на папку C:\Users\USERNAME\Documents\
в текущей активной установке.
Вторая форма отложенной целевой неправильной ссылки, хотя и концептуально проще, может иметь более серьезные последствия. Когда самосогласованный том или структура каталогов, содержащая жесткие ссылки, которые используют имена путей букв дисков тома, копируется или перемещается на другой том (или когда буква диска тома переназначается каким-либо другим способом), такие ссылки могут больше не указывать на соответствующую цель в скопированной структуре . Опять же, результаты зависят от программного обеспечения, которое использовалось для копирования; в то время как некоторые программы могут вмешиваться, изменяя любые полностью подчиненные жесткие ссылки в копии, чтобы сохранить структурную согласованность, другие могут игнорировать, копировать точно или даже переходить в жесткие ссылки, копируя их содержимое.
Серьезные проблемы возникают, если жесткие ссылки копируются точно так, что в новой копии они становятся жесткими ссылками между томами, которые по-прежнему указывают на исходные файлы и папки на исходном томе. Непреднамеренные жесткие ссылки между томами, такие как жесткие ссылки в папке «архив», которые по-прежнему указывают на местоположения на исходном томе (согласно букве диска), — это катастрофы, которые ждут своего часа. Например, удаление того, что гораздо позже предположительно будет неиспользуемым архивным каталогом на неиспользуемом резервном томе, может привести к удалению текущих, активных пользовательских данных или системных файлов.
Профилактической мерой для риска букв диска является использование синтаксиса пути GUID тома [20] вместо путей, содержащих буквы дисков тома, при указании целевого пути для соединения каталогов. Например, рассмотрите возможность создания псевдонима для X:\Some\Other\Path
at X:\Some\Path\Foo
:
X:\Some\Path> linkd Foo X:\Some\Other\Path
Как описано выше, если структура папок, содержащая полученную ссылку, перемещена на диск с буквой диска, отличной от X:
, или если буква изменена на X:
самом диске, содержимое данных в целевом местоположении уязвимо для случайного повреждения или злонамеренного использования. Более устойчивая версия этой ссылки может частично снизить этот риск, ссылаясь на целевой том по его значению идентификатора GUID (которое можно обнаружить, выполнив команду fsutil volume list
).
X:\Some\Path> linkd Foo \\?\Volume{12345678-abcd-1234--abcdefghijkl}\Some\Other\Path
Это гарантирует, что соединение останется действительным, если буква диска X:
будет изменена каким-либо образом.
Что касается упреждающего средства избежания катастроф соединения каталогов, команда dir /AL /S /B "X:\Some\Path"
может быть использована для получения, для тщательного анализа перед фиксацией любых необратимых изменений файловой системы, списка всех жестких ссылок "ниже" определенного местоположения файловой системы. Хотя по определению каждая ссылка в результирующем списке имеет имя пути, начинающееся с X:\Some\Path\
, если любая из этих жестких ссылок содержит цель, которая не включена в X:\Some\Path
, то указанная область была экранирована, и указанный вами начальный каталог не является полностью включенным. В этом случае может быть указана дополнительная осторожность, поскольку указанный каталог включает файлы и каталоги, которые находятся на других физических томах, или чей собственный parent-traversal-to-root не включает указанный каталог.
Параметры безопасности по умолчанию в Windows запрещают администраторам без повышенных прав и всем неадминистраторам создавать символические ссылки, но не соединения. Это поведение можно изменить, запустив "secpol.msc", консоль управления локальной политикой безопасности (в разделе: Параметры безопасности\Локальные политики\Назначение прав пользователя\Создание символических ссылок). Это можно обойти, запустив cmd.exe с параметром Запуск от имени администратораrunas
или командой. Начиная с Windows 10 Insiders build 14972 требование повышенных прав администратора было удалено в "режиме разработчика" Windows, что позволяет создавать символические ссылки без необходимости повышать консоль до администратора. На уровне API SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE
для этой цели предоставляется флаг. [21]
Процесс запуска Windows не поддерживает точки соединения, поэтому невозможно перенаправить некоторые системные папки:
Другие критические файлы загрузки системы, такие как файл образа сна hiberfil.sys
, также не поддерживают перенаправление.
Технически возможно перенаправить следующие некритические расположения системных папок:
Это может привести к долгосрочным проблемам надежности или совместимости Windows. Создание соединений для другого диска \Users
и \ProgramData
указание на него не рекомендуется, так как это нарушает работу обновлений и приложений Магазина Windows. [22]
Создание соединений для \Users, \ProgramData \Program Files
или \Program Files (x86)
указание на другие расположения нарушает установку или обновление Windows. [23]
Создание соединений для другого диска \Program Files
или указание на него нарушает компонентное обслуживание\Program Files (x86)
Windows , которое жестко связывает файлы из своего репозитория \Windows\SxS с их установочным каталогом. [ необходима цитата ]
Установщик Windows не полностью поддерживает символические ссылки. Перенаправление \Windows\Installer
приведет к сбою большинства установщиков Windows на основе .msi с ошибкой 2755 и/или ошибкой 1632.
Поскольку Windows XP использует ту же версию формата NTFS, что и более поздние версии, в ней можно включить поддержку символических ссылок. Для использования символических ссылок NTFS в Windows 2000 и XP существует сторонний драйвер, который делает это, устанавливая себя в качестве фильтра файловой системы. [24] [25]
Символические ссылки на каталоги или тома, называемые точками соединения и точками монтирования, были введены в NTFS 3.0, которая поставлялась с Windows 2000. Начиная с NTFS 3.1, символические ссылки можно создавать для любого типа объекта файловой системы. NTFS 3.1 была введена вместе с Windows XP , но эта функциональность не была доступна (через ntfs.sys) для приложений пользовательского режима. Однако можно было установить сторонние драйверы фильтров, такие как senable
драйвер с открытым исходным кодом Масатоши Кимуры, чтобы сделать эту функцию доступной и в пользовательском режиме. ntfs.sys, выпущенный с Windows Vista, сделал эту функциональность доступной для приложений пользовательского режима по умолчанию.
Начиная с NTFS 3.1, символическая ссылка может также указывать на файл или удаленный сетевой путь SMB . В то время как точки соединения NTFS поддерживают только абсолютные пути на локальных дисках, символические ссылки NTFS позволяют связываться с использованием относительных путей. Кроме того, реализация символических ссылок NTFS обеспечивает полную поддержку ссылок между файловыми системами. Однако функциональность, включающая символические ссылки между хостами, требует, чтобы удаленная система также поддерживала их, что фактически ограничивает их поддержку Windows Vista и более поздними операционными системами Windows.
Если ваше местоположение находится на диске FileSystem, допускаются следующие значения: Если ваше местоположение находится на диске FileSystem, допускаются следующие значения: File[,] Directory[,] Junction[,] HardLink