Введение

Любой файл, содержащий ссылку на другой файл или каталог, – это формат обмена данными Microsoft. В вычислительной технике символическая ссылка (также симссылка или мягкая ссылка) – это файл, предназначенный для указания на файл или каталог (называемый "целью") путем указания пути к нему. Символические ссылки поддерживаются POSIX и большинством Unix-подобных операционных систем, таких как FreeBSD, Linux и macOS. Ограниченная поддержка также существует в Windows 7 и Windows Vista, а также частично в Windows 2000 и Windows XP в виде ярлыков. В CTSS на IBM 7090 файлы связывались по имени уже в 1963 году. К 1978 году операционные системы миникомпьютеров от DEC и RDOS от Data General включали символические ссылки.

Обзор

Символическая ссылка содержит текстовую строку, которая автоматически интерпретируется и используется операционной системой как путь к другому файлу или каталогу. Этот другой файл или каталог называется "целью". Символическая ссылка – это отдельный файл, существующий независимо от своей цели. Если символическая ссылка удалена, ее цель остается без изменений. Если символическая ссылка указывает на цель, а впоследствии эта цель перемещена, переименована или удалена, символическая ссылка не обновляется и не удаляется автоматически, а продолжает существовать, указывая на старую цель – теперь несуществующее местоположение или файл. Символические ссылки, указывающие на перемещенные или несуществующие цели, иногда называют «битыми», «осиротевшими», «мертвыми» или «висячими». Символические ссылки отличаются от жестких ссылок. Жесткие ссылки не могут связывать пути на разных томах или файловых системах, в то время как символические ссылки могут указывать на любой файл или каталог, независимо от томов, на которых расположены ссылка и цель. Жесткие ссылки всегда указывают на существующий файл, тогда как символические ссылки могут содержать произвольный путь, который никуда не ведет. Символические ссылки работают прозрачно для многих операций: программы, читающие или записывающие файлы, указанные символической ссылкой, ведут себя так, как будто они работают непосредственно с целевым файлом. Однако они приводят к изменению иерархической файловой системы из дерева в ориентированный граф, что может повлиять на такие простые операции, как определение текущего каталога процесса. Даже стандарт Unix для перехода в родительский каталог больше не работает надежно при наличии символических ссылок. Некоторые оболочки эвристически пытаются поддерживать иллюзию древовидной иерархии, но в этом случае они выдают результаты, отличные от других программ, которые манипулируют именами путей без использования эвристики, полагаясь на операционную систему. Программы, которым необходимо обрабатывать символические ссылки особым образом (например, оболочки и утилиты резервного копирования), должны идентифицировать и манипулировать ими напрямую. Некоторые дистрибутивы Unix и Linux широко используют символические ссылки для изменения иерархии файловой системы. Это достигается с помощью различных механизмов, таких как символические ссылки с вариантами и контекстной зависимостью. Это позволяет создать более интуитивное или специализированное для конкретного приложения дерево каталогов и реорганизовать систему без необходимости переработки основных системных функций и утилит.

Хранение символических ссылок

Ранние реализации символических ссылок хранили информацию о символической ссылке в виде данных в обычных файлах. Файл содержал текстовую ссылку на целевой объект, а биты режима файла указывали, что тип файла – символическая ссылка. Этот метод был медленным и неэффективно использовал дисковое пространство на небольших системах. Улучшение, известное как быстрые симлинки, позволило хранить целевой путь в структурах данных, используемых для хранения файловой информации на диске (инодах). В этом пространстве обычно хранится список адресов блоков диска, выделенных файлу. Таким образом, симлинки с короткими целевыми путями получают доступ быстро. Системы с быстрыми симлинками часто возвращаются к использованию исходного метода, если целевой путь превышает доступное пространство в иноде. Исходный метод ретроспективно называют медленной симлинкой. Он также используется для обеспечения совместимости дисков с другими или более старыми версиями операционных систем. Хотя хранение значения ссылки внутри иноды экономит блок диска и операцию чтения с диска, операционная система все равно должна анализировать имя пути в ссылке, что всегда требует чтения дополнительных инод и, как правило, чтения других, и потенциально множества, каталогов, обрабатывая как список файлов, так и иноды каждого из них, пока не будет найдено соответствие компонентам пути ссылки. Значительное повышение производительности от "быстрых симлинков" наблюдается только тогда, когда ссылка указывает на файл в том же каталоге. Подавляющее большинство POSIX-совместимых реализаций используют быстрые симлинки. Однако стандарт POSIX не требует реализации полного набора информации о состоянии файла, обычно доступного для обычных файлов, для симлинков. Это позволяет реализациям использовать другие решения, например, хранение данных симлинка в записях каталога. Разрешения файловой системы символической ссылки не используются; режимы доступа к целевому файлу контролируются разрешениями самого целевого файла. Некоторые операционные системы, такие как FreeBSD, предоставляют возможность изменять разрешения файлов и атрибуты файловой системы символической ссылки с помощью системных вызовов lchmod и lchflags соответственно. Сообщаемый размер симлинка равен количеству символов в пути, на который он указывает.

Обработка ошибок

Традиционная файловая система Unix имеет древовидную структуру, однако символические ссылки позволяют создавать в ней циклы. В отличие от точек соединения, символическая ссылка может указывать также на файл или удаленный сетевой путь Server Message Block (SMB). Кроме того, реализация символических ссылок в NTFS обеспечивает полную поддержку ссылок между файловыми системами. Однако для реализации символических ссылок между хостами требуется, чтобы удаленная система также их поддерживала. Символические ссылки предназначены для облегчения миграции и обеспечения совместимости приложений с операционными системами POSIX. Microsoft стремилась к тому, чтобы символические ссылки в Windows Vista "работали точно так же, как ссылки в UNIX". Однако реализация отличается от символических ссылок Unix несколькими аспектами. Например, пользователи Windows Vista должны вручную указывать при создании символической ссылки, является ли она ссылкой на файл или на каталог. Windows 7 и Vista поддерживают максимум 31 точку повторного разбора (и, следовательно, символические ссылки) для заданного пути (то есть любой путь может иметь не более 31 уровня косвенности, прежде чем Windows прекратит обработку). Создавать символические ссылки могут только пользователи, обладающие новым правом "Создание символической ссылки", которое по умолчанию есть только у администраторов. Если такое поведение нежелательно, его необходимо изменить в консоли управления локальной политикой безопасности. Кроме того, символические ссылки NTFS на файлы отличаются от символических ссылок NTFS на каталоги и поэтому не могут использоваться взаимозаменяемо, в отличие от POSIX, где одна и та же символическая ссылка может указывать как на файлы, так и на каталоги. В Windows Vista и более поздних версиях, если путь к рабочему каталогу заканчивается символической ссылкой, текущая ссылка на родительский каталог (..) будет указывать на родительский каталог символической ссылки, а не на родительский каталог целевого объекта. Подобное поведение наблюдается и на уровне оболочки как минимум в некоторых системах POSIX, включая Linux, но никогда при доступе к файлам и каталогам через системные вызовы. Например, встроенные команды bash `cd` и `pwd` работают с текущим логическим каталогом. `pwd` часто используется в скриптах для определения фактического текущего рабочего каталога. При использовании любого пути с системным вызовом, любое использование `.` будет ссылаться на фактический родительский каталог файловой системы, содержащий псевдокаталог. Таким образом, `.` и `..` могут возвращать совершенно разные результаты.

Пункты соединения NTFS

Версия NTFS для Windows 2000 представила точки повторного анализа, которые, среди прочего, позволили использовать точки монтирования томов и точки соединения. Точки соединения предназначены только для каталогов и, к тому же, только для локальных каталогов; точки соединения для удаленных сетевых ресурсов не поддерживаются. В комплектах ресурсов Windows 2000 и XP включена программа для создания точек соединения; более мощная программа под названием Junction была распространена Марком Руссиновичем из Sysinternals. Не все стандартные приложения поддерживают точки повторного анализа. Особенно это касается программы резервного копирования, которая выдает сообщение об ошибке 0x80070003, если папки, подлежащие резервному копированию, содержат точку повторного анализа.

Сравнение символических ссылок POSIX и Windows

Символическая ссылка Перекрестная ссылка Жесткая ссылка
Когда ссылка удалена Цель остается неизменной Цель удалена Счетчик ссылок уменьшается. Когда он достигает 0, цель удаляется.
Когда цель перемещается Ссылка становится недействительной Ссылка становится недействительной Ссылка остается действительной
Относительный путь Может ли находиться на другом томе?
Ссылка на файлы в Windows
Ссылка на папки в Windows
Ссылка на файлы в Unix
Ссылка на папки в Unix

Другие варианты реализации

Реализации функций, подобных символическим ссылкам.

Ранние годы МИТ

Система совместного использования времени, совместимая с MIT, ок. 1963 г., и несовместимая система совместного использования времени обе имеют связанные файлы, в которых имя целевого файла указывается в записи каталога.

Переменные символические связи

Символические ссылки могут быть реализованы в контекстно-зависимом или переменном виде, так что ссылка указывает на различные цели в зависимости от параметра конфигурации, параметра времени выполнения или другого текущего состояния. Переменная или вариантная символическая ссылка – это символическая ссылка, содержащая в себе имя переменной. Это обеспечивает некоторую гибкость в организации файловой системы, недоступную при использовании стандартной символической ссылки. Переменные, встроенные в символическую ссылку, могут включать информацию, специфичную для пользователя и окружения. Операционные системы, поддерживающие вариантные символические ссылки, включают NetBSD, DragonFly BSD и Domain/OS.