NTFS-ссылки
Файловая система NTFS определяет различные способы перенаправления файлов и папок, например, чтобы указать файл на другой файл или его содержимое, не делая его копии. Объект, на который указывают, называется целью. Такой файл называется жесткой или символической ссылкой в зависимости от того, как он хранится в файловой системе.
История
[ редактировать ]Символические ссылки на каталоги или тома, называемые точками соединения и точками монтирования, были представлены в 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.
Типы
[ редактировать ]Существует три класса ссылок:
- Жесткие ссылки , файлы которых имеют одну и ту же запись MFT ( inode ) в одной файловой системе. Они ведут себя так же, как жесткие ссылки в Unix или Linux, поскольку запись каталога ссылается на сам файл, поэтому переименование или удаление других записей, ссылающихся на файл, не влияет на ссылку.
- Точки соединения являются точками повторной обработки и работают аналогично символическим ссылкам в Unix или Linux, но определяются только для каталогов и могут быть только абсолютными путями в локальных файловых системах. Они создаются и ведут себя аналогично жестким ссылкам, за исключением того, что если целевой каталог будет переименован, перемещен или удален, ссылка перестанет быть действительной. [1] [2]
- Символические ссылки — это точки повторной обработки , которые работают аналогично точкам соединения или символическим ссылкам в Unix или Linux и принимают относительные пути и пути к файлам, а также каталогам. Поддержка путей к каталогам и UNC была добавлена в NTFS 3.1.
Все ссылки NTFS спроектированы так, чтобы быть прозрачными для приложений. Это означает, что приложение, обращающееся к ссылке, будет плавно перенаправлено драйвером файловой системы, и никакой специальной обработки не требуется. Для пользователей они выглядят как обычные каталоги или файлы. Это также приводит к эффекту псевдонимов: запись в ссылку передает запись в базовый связанный файл или запись MFT .
Символические ссылки и точки соединения содержат путь к связанному файлу и тег, идентифицирующий драйвер, реализующий данное поведение. Поскольку они записывают путь, они могут ссылаться на файлы на других томах или даже на удаленные файлы. Однако это также означает, что если указанный файл будет удален или переименован, ссылка станет недействительной, а если указанный файл или каталог будет заменен другим, ссылка теперь будет ссылаться на новый файл или каталог.
Жесткие ссылки создают новую запись каталога, ссылающуюся на ту же запись MFT и увеличивающую счетчик ссылок на запись MFT. Это означает, что они ограничены файлами в одной и той же файловой системе, но исходный файл можно удалить, не делая жесткую ссылку недействительной, поскольку удаление уменьшает счетчик ссылок на единицу, и файл не удаляется в MFT, пока счетчик не достигнет нуля.
Ярлыки файлов
[ редактировать ]Символическая ссылка 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:
диске выгодно создать несколько разделов , поэтому во время установки необходимо удалить только один раздел. Однако некоторые программы не позволяют пользователю выбирать каталог установки или устанавливать некоторые файлы в каталог. C:
диск, даже если они установлены на другой диск. Создав точку соединения, программу можно обманом заставить установить в другой каталог.
Инструменты командной строки
[ редактировать ]Windows поставляется с несколькими инструментами, позволяющими создавать ссылки NTFS и управлять ими.
- PowerShell :
New-Item
командлет Windows PowerShell , который может создавать пустые файлы, папки, соединения и жесткие ссылки. [3] В PowerShell 5.0 и более поздних версиях он также может создавать символические ссылки. [4]Get-Item
иGet-ChildItem
Командлеты можно использовать для опроса объектов файловой системы и, если они являются ссылками NTFS, поиска информации о них.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, даже если они не входят в состав Windows.
- linkd: Это компонент Resource Kit для Windows 2000 и Windows Server 2003 . [11] Он может создавать точки соединения. [12]
- соединение: бесплатная утилита командной строки от Microsoft, которая может создавать или удалять соединения. [2]
- Расширения сообщества PowerShell (PSCX): размещены в галерее Microsoft PowerShell, [13] этот модуль добавляет несколько командлетов для работы со ссылками NTFS, в том числе: New-Hardlink, New-Junction, Get-ReparsePoint, Remove-ReparsePoint и New-Symlink. [14]
API
[ редактировать ]Для создания жестких ссылок приложения могут использовать 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
в 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
, то указанная область была экранирована, а указанный вами начальный каталог не является полностью охватывающим. В этом случае следует проявлять особую осторожность, поскольку указанный каталог включает в себя файлы и каталоги, которые находятся на других физических томах или чей собственный обход родительского корня к корневому каталогу не включает указанный каталог.
Ограничения
[ редактировать ]Требования к привилегиям
[ редактировать ]Параметры безопасности по умолчанию в Windows запрещают администраторам без повышенных прав и всем, кто не является администратором, создавать символические ссылки, но не соединения. Это поведение можно изменить, запустив «secpol.msc», консоль управления локальной политикой безопасности (в разделе: Настройки безопасности\Локальные политики\Назначение прав пользователя\Создать символические ссылки). Эту проблему можно обойти, запустив cmd.exe с «Запуск от имени администратора» или параметром runas
команда. Начиная с версии Windows 10 Insiders, сборка 14972, требование о повышении привилегий администратора было удалено в «режиме разработчика» Windows, что позволило создавать символические ссылки без необходимости повышения прав консоли в качестве администратора. На уровне API SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE
Для этой цели предоставляется флаг. [21]
Время загрузки
[ редактировать ]Процесс запуска Windows не поддерживает точки соединения, поэтому перенаправить определенные системные папки невозможно:
- \Окна
- \Windows\System32
- \Windows\System32\Конфигурация
Другие важные файлы загрузки системы, такие как файл образа сна. hiberfil.sys
, также не поддерживают перенаправление.
Определенные системой местоположения
[ редактировать ]Технически возможно перенаправить следующие некритические системные папки:
- \Пользователи
- \Документы и настройки
- \ProgramData
- \Программные файлы
- \Программные файлы (x86)
Это может привести к долгосрочным проблемам с надежностью или совместимостью Windows. Создание развязок для \Users
и \ProgramData
указывать на другой диск не рекомендуется, поскольку это нарушает работу обновлений и приложений Магазина Windows. [22]
Создание переходов для \Users, \ProgramData, \Program Files
или \Program Files (x86)
указание на другие места нарушает установку или обновление Windows. [23]
Создание развязок для \Program Files
или \Program Files (x86)
Windows указание на другой диск нарушает компонентное обслуживание , которое жестко связывает файлы из репозитория \Windows\SxS с их установочным каталогом. [ нужна ссылка ]
установщик Windows
[ редактировать ]Установщик Windows не полностью поддерживает символические ссылки. Перенаправление \Windows\Installer
приведет к сбою большинства установщиков Windows на основе .msi с ошибкой 2755 и/или 1632.
Поддержка символических ссылок в Windows XP
[ редактировать ]Поскольку Windows XP использует ту же версию формата NTFS, что и более поздние выпуски, в ней можно включить поддержку символических ссылок. Для использования символических ссылок NTFS в Windows 2000 и XP существует сторонний драйвер, который делает это, устанавливаясь в качестве фильтра файловой системы. [24] [25]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Жесткие связи и соединения» . Разработчик Windows . Майкрософт . 31 мая 2018 г.
- ^ Jump up to: а б «Развязка v1.07» . Сисинтерналы . Майкрософт . 4 июля 2016 г.
- ^ «Новый элемент (PowerShell 3.0)» . Документы Майкрософт . Майкрософт . 22 июня 2020 г.
Если ваше расположение находится на диске файловой системы, разрешены следующие значения: Если ваше расположение находится на диске файловой системы, разрешены следующие значения: File[,] Directory[,] Junction[,] HardLink
- ^ «Новый элемент (PowerShell 5.0)» . Документы Майкрософт . Майкрософт . 22 июня 2020 г.
- ^ «Исправить Remove-Item <символическая ссылка на каталог>» . Репозиторий PowerShell . Майкрософт . 4 марта 2016 г. — через GitHub .
- ^ «Мклинк» . Документы Майкрософт . Майкрософт . 18 апреля 2012 г.
- ^ "mklink.c" . репозиторий реакции . ReactOS Deutschland eV, 3 октября 2017 г. — через GitHub.com .
- ^ «Дир» . Документы Майкрософт . Майкрософт . 18 апреля 2012 г.
- ^ «Жёсткая ссылка Fsutil» . Документы Майкрософт . Майкрософт . 18 апреля 2012 г.
- ^ «Fsutil reparsepoint» . Документы Майкрософт . Майкрософт . 18 апреля 2012 г.
- ^ «Загрузка инструментов Windows Server 2003 Resource Kit» . Центр загрузки . 10 марта 2015 г. Архивировано из оригинала 10 марта 2015 г.
- ^ «Как создавать точки соединения NTFS и управлять ими» . 09.03.2015. Архивировано из оригинала 9 марта 2015 г.
- ^ «Пскх» . Галерея PowerShell . Майкрософт . 17 января 2018 г.
- ^ Хилл, Кейт; Грехан, Ойсин (17 января 2018 г.). "README.md" . репозиторий pscx — через GitHub .
- ^ «Ссылки NTFS, соединения каталогов и ярлыки Windows» . www.flexhex.com . Архивировано из оригинала 25 января 2021 года . Проверено 4 октября 2019 г.
- ^ "libuv/src/win/fs.c" . Гитхаб . Проверено 12 декабря 2019 г.
- ^ "libuv/src/win/fs.c fs__unlink" . Гитхаб . Проверено 12 декабря 2019 г.
- ^ «Удалить соединение PowerShell» . StackOverflow . Проверено 12 декабря 2019 г.
- ^ «Особенности программирования (Windows)» . msdn.microsoft.com .
- ^ «Форматы путей к файлам в системах Windows» . docs.microsoft.com .
- ^ «Символические ссылки в Windows 10! — Блог разработчиков WindowsБлог разработчиков Windows» . blogs.windows.com . 2 декабря 2016 г.
- ^ «Перемещение каталога Users и каталога ProgramData на диск, отличный от диска, содержащего каталог Windows» . Проверено 12 марта 2015 г.
- ^ «При попытке установить Windows 8.1 возникла ошибка из-за перенаправления папки «Пользователи» или «Program Files» в другой раздел» . Проверено 12 марта 2015 г.
- ^ Герман Шинагль (23 августа 2013 г.). «ln — жесткие ссылки командной строки — символические ссылки для Windows XP» .
- ^ «Инструмент создания ссылок/ . переходов »
Внешние ссылки
[ редактировать ]- Документация по символическим ссылкам NTFS в MSDN
- Функция CreateSymbolicLink в Win32 API
- fsutil hardlink create — создает жесткую ссылку ( Windows 2000 и новее)
- Статья базы знаний Microsoft — «Как создавать точки соединения NTFS и манипулировать ими» ( архивная версия )
- Утилита командной строки Junction от Microsoft TechNet
- Статья Codeproject - обсуждение исходного кода утилиты точки соединения, ориентированной на программистов.
- Статья в журнале PC Mag, заархивированная 11 декабря 2008 г. на Wayback Machine, о добавлении любого каталога в меню «Пуск» (позволение предварительного просмотра в меню «Пуск» в виде подменю).