В вычислительной технике символическая ссылка ( также символическая ссылка или мягкая ссылка ) — это файл, целью которого является указание на файл или каталог (называемый «целью») путем указания пути к нему. [1]
Символические ссылки поддерживаются POSIX и большинством Unix-подобных операционных систем , таких как FreeBSD , Linux и macOS . Ограниченная поддержка также существует в Windows 7 и Windows Vista , а также в некоторой степени в Windows 2000 и Windows XP в виде файлов ярлыков. CTSS на IBM 7090 имел файлы, связанные по имени в 1963 году . [2] [3] [4] К 1978 году операционные системы мини-компьютеров от DEC и в RDOS от Data General включали символические ссылки.
Символическая ссылка содержит текстовую строку, которая автоматически интерпретируется и отслеживается операционной системой как путь к другому файлу или каталогу. Этот другой файл или каталог называется «целью». Символическая ссылка — это второй файл, который существует независимо от своей цели. Если символическая ссылка удаляется, ее цель остается неизменной. Если символическая ссылка указывает на цель, а через некоторое время эта цель перемещается, переименовывается или удаляется, символическая ссылка не обновляется и не удаляется автоматически, а продолжает существовать и по-прежнему указывает на старую цель, теперь несуществующее местоположение или файл. Символические ссылки, указывающие на перемещенные или несуществующие цели, иногда называются сломанными , осиротевшими , мертвыми или висячими .
Символические ссылки отличаются от жестких ссылок . Жесткие ссылки не связывают пути на разных томах или файловых системах , тогда как символические ссылки могут указывать на любой файл или каталог независимо от томов, на которых находятся ссылка и цель. Жесткие ссылки всегда ссылаются на существующий файл, тогда как символические ссылки могут содержать произвольный путь, который ни на что не указывает.
Символические ссылки работают прозрачно для многих операций: программы, которые читают или пишут в файлы, названные символической ссылкой, будут вести себя так, как будто работают напрямую с целевым файлом. Однако они имеют эффект изменения в противном случае иерархической файловой системы из дерева в направленный граф, что может иметь последствия для таких простых операций, как определение текущего каталога процесса. Даже стандарт Unix для навигации в родительский каталог каталога больше не работает надежно перед лицом символических ссылок. Некоторые оболочки эвристически пытаются поддерживать иллюзию древовидной иерархии, но когда они это делают, это заставляет их выдавать результаты, отличные от результатов других программ, которые манипулируют путями без такой эвристики, полагаясь вместо этого на операционную систему. [5] Таким образом, программы, которым необходимо специально обрабатывать символические ссылки (например, оболочки и утилиты резервного копирования), должны идентифицировать их и манипулировать ими напрямую.
Некоторые дистрибутивы Unix, а также Linux широко используют символические ссылки в попытке реорганизовать иерархию файловой системы. Это достигается несколькими механизмами, такими как вариантные, контекстно-зависимые символические ссылки. Это дает возможность создать более интуитивно понятное или специфичное для приложения дерево каталогов и реорганизовать систему без необходимости перепроектировать основной набор системных функций и утилит.
В операционных системах, совместимых с POSIX , символические ссылки создаются с помощью системного вызова symlink
[6] . ln
Команда оболочки обычно использует системный вызов link
[7] , который создает жесткую ссылку . Если указан флаг, вместо этого используется системный вызов symlink(), который создает символическую ссылку. Символические ссылки были введены в 1982 году в 4.1a BSD Unix из Калифорнийского университета в Беркли . [8]ln -s
Следующая команда создает символическую ссылку в интерфейсе командной строки (оболочке):
ln -s целевой_путь путь_ссылки
target_path — относительный или абсолютный путь, на который должна указывать символическая ссылка. Обычно цель существует, хотя символические ссылки могут быть созданы на несуществующие цели. link_path — путь символической ссылки.
После создания символической ссылки некоторые операции могут использоваться для ее обработки в качестве псевдонима для цели. Однако операции lstat
, [9] lchown
[10] и readlink
[11] являются уникальными для символических ссылок и не применяются к цели; используя эти системные вызовы, программы, которые проверяют файловую систему (например, ls
, find
), могут сообщать о символических ссылках (вместо их целей, если таковые имеются). Поскольку системные вызовы rename
и unlink
закодированы для работы непосредственно с символическими ссылками, команды управления файловой системой (например, rm
, mv
) влияют на саму символическую ссылку (вместо того, чтобы применяться к цели символической ссылки, если таковая имеется). rm
Команда (delete file) удаляет саму ссылку, а не целевой файл. Аналогично, команда mv
перемещает или переименовывает ссылку, а не цель. cp
У команды есть параметры, которые позволяют копировать либо символическую ссылку, либо цель. Команды, которые читают или записывают содержимое файла, будут получать доступ к содержимому целевого файла.
Приложение для листинга каталогов POSIX, ls
, обозначает символические ссылки стрелкой после имени, указывающей на имя целевого файла (см. следующий пример), когда запрашивается длинный список каталогов ( -l
опция). Когда запрашивается листинг каталога символической ссылки, указывающей на каталог, будет отображена только сама ссылка. Чтобы получить листинг связанного каталога, путь должен включать завершающий символ-разделитель каталогов ('/', косая черта).
Примечание: в приведенном ниже примере не создавайте каталог «three» перед созданием ссылки в каталоге /tmp.
$ mkdir -p /tmp/one/two $ echo "test_a" >/tmp/one/two/a $ echo "test_b" >/tmp/one/two/b $ cd /tmp/one/two $ ls -l -rw-r--r-- 1 группа пользователей 7 Янв 01 10:01 a -rw-r--r-- 1 группа пользователей 7 Янв 01 10:01 b $ cd /tmp $ ln -s /tmp/one/two three $ ls -l three lrwxrwxrwx 1 группа пользователей 12 июля 22 10:02 /tmp/three -> /tmp/one/two $ ls -l three/ -rw-r--r-- 1 группа пользователей 7 января 01 10:01 a -rw-r--r-- 1 группа пользователей 7 января 01 10:01 b$ cd three $ ls -l -rw-r--r-- 1 группа пользователей 7 янв. 01 10:01 a -rw-r--r-- 1 группа пользователей 7 янв. 01 10:01 b $ cat a test_a $ cat /tmp/one/two/a test_a $ echo "test_c" >/tmp/one/two/a $ cat /tmp/one/two/a test_c $ cat a test_c
Ранние реализации символических ссылок хранили информацию символической ссылки как данные в обычных файлах. Файл содержал текстовую ссылку на цель ссылки, а биты режима файла указывали, что тип файла является символической ссылкой.
Этот метод был медленным и неэффективно использовал дисковое пространство на небольших системах. Улучшение, называемое быстрыми символическими ссылками , позволило хранить целевой путь в структурах данных , используемых для хранения файловой информации на диске ( иноды ). Это пространство обычно хранит список адресов блоков диска , выделенных для файла. Таким образом, к символическим ссылкам с короткими целевыми путями осуществляется быстрый доступ. Системы с быстрыми символическими ссылками часто возвращаются к использованию исходного метода, если целевой путь превышает доступное пространство инода. Исходный стиль ретроспективно называется медленной символической ссылкой . Он также используется для совместимости дисков с другими или более старыми версиями операционных систем.
Хотя сохранение значения ссылки внутри inode экономит блок диска и чтение диска, операционной системе все равно необходимо анализировать имя пути в ссылке, что всегда требует чтения дополнительных inode и, как правило, требует чтения других, и потенциально многих, каталогов, обрабатывая как список файлов, так и inode каждого из них, пока не найдет совпадение с компонентами пути ссылки. Только когда ссылка указывает на файл в том же каталоге, «быстрые символические ссылки» обеспечивают значительно лучшую производительность, чем другие символические ссылки.
Подавляющее большинство реализаций, совместимых с POSIX, используют быстрые символические ссылки. Однако стандарт POSIX не требует, чтобы весь набор информации о состоянии файла, общий для обычных файлов, был реализован для символических ссылок. Это позволяет реализациям использовать другие решения, такие как хранение данных символических ссылок в записях каталога.
Разрешения файловой системы символической ссылки не используются; режимы доступа целевого файла контролируются собственными разрешениями целевого файла. Некоторые операционные системы, такие как FreeBSD, предлагают возможность изменять разрешения файлов и атрибуты файловой системы символической ссылки с помощью системных вызовов lchmod
[12] и lchflags
[13] соответственно.
Сообщаемый размер символической ссылки — это количество символов в пути, на который она указывает.
Традиционная файловая система Unix имеет древовидную структуру, [14] однако символические ссылки позволяют ей содержать циклы. [5]
NTFS 3.1 представила поддержку символических ссылок для любого типа файлов. Она была включена в Windows XP , но была включена по умолчанию только для приложений режима ядра. Windows Vista и более поздние версии Windows включили поддержку символических ссылок для приложений пользовательского режима. mklink
Внутренняя команда командной строки Windows может создавать символические ссылки. Для включения поддержки символических ссылок NTFS в Windows XP требуются сторонние драйверы. [15] В отличие от точек соединения , символическая ссылка также может указывать на файл или удаленный сетевой путь Server Message Block (SMB). Кроме того, реализация символических ссылок NTFS обеспечивает полную поддержку ссылок между файловыми системами. Однако функциональность, включающая символические ссылки между хостами, требует, чтобы удаленная система также поддерживала их.
Символические ссылки предназначены для помощи в миграции и совместимости приложений с операционными системами POSIX . Microsoft стремилась к тому, чтобы символические ссылки Windows Vista «функционировали так же, как ссылки UNIX». [16] Однако реализация отличается от символических ссылок Unix несколькими способами. Например, пользователи Windows Vista должны вручную указывать при создании символической ссылки, является ли она файлом или каталогом. [17] Windows 7 и Vista поддерживают максимум 31 точку повторной обработки (и, следовательно, символические ссылки) для заданного пути (т. е. любой заданный путь может иметь максимум 31 косвенных ссылок, прежде чем Windows сдастся). [18] Только пользователи с новой привилегией Create Symbolic Link , которая по умолчанию есть только у администраторов, могут создавать символические ссылки. [19] Если это нежелательное поведение, его необходимо изменить в консоли управления локальной политикой безопасности. Кроме того, символические ссылки NTFS на файлы отличаются от символических ссылок NTFS на каталоги и, следовательно, не могут использоваться взаимозаменяемо, в отличие от POSIX, где одна и та же символическая ссылка может ссылаться как на файлы, так и на каталоги.
В Windows Vista и более поздних версиях, когда путь рабочего каталога заканчивается символической ссылкой, текущая родительская ссылка на путь, ..
будет ссылаться на родительский каталог символической ссылки, а не на ее цель. Такое поведение также встречается на уровне оболочки по крайней мере в некоторых системах POSIX, включая Linux , но никогда при доступе к файлам и каталогам через вызовы операционной системы. Например, встроенные команды bash pwd
и cd
работают с текущим логическим каталогом. pwd
часто используется в скриптах для определения фактического текущего рабочего каталога. Когда любой путь используется с системным вызовом, любое использование ..
будет использовать фактическую родительскую файловую систему каталога, содержащего ..
запись псевдокаталога. Таким образом, cd ..; cat something
и cat ../something
могут возвращать совершенно разные результаты.
В обоих следующих примерах создается символическая ссылка с именем «Загрузки» на «E:\", которая указывает на папку «Загрузки» в профиле текущего пользователя.
mklink
является внутренней командой.mklink /D E:\Downloads %UserProfile%\Downloads
New-Item -Path 'E:\Downloads' -ItemType 'SymbolicLink' -Value "$Env:UserProfile\Downloads"
Версия NTFS для Windows 2000 представила точки повторной обработки , которые, помимо прочего, позволили использовать точки монтирования томов и точки соединения. Точки соединения предназначены только для каталогов, и, более того, только для локальных каталогов; точки соединения с удаленными общими ресурсами не поддерживаются. [20] В комплекты ресурсов Windows 2000 и XP входит программа linkd для создания точек соединения; более мощная программа Junction была распространена Марком Руссиновичем из Sysinternals .
Не все стандартные приложения поддерживают точки повторной обработки. Наиболее заметно, что Backup страдает от этой проблемы и выдает сообщение об ошибке 0x80070003 [21] , когда папки, подлежащие резервному копированию, содержат точку повторной обработки.
Ярлыки , которые поддерживаются графическими файловыми браузерами некоторых операционных систем, могут напоминать символические ссылки, но отличаться по ряду важных признаков. Одно из различий заключается в том, какой тип программного обеспечения может следовать им:
Механизмы также имеют различные возможности:
Почти как ярлыки, но прозрачные для оболочки Windows. [24] Они реализованы как обычные папки (которые должны иметь атрибут « только для чтения» и/или «системный» атрибут [25] ), содержащие ярлык с именем target.lnk , который ссылается на цель, и (скрытый) desktop.ini со (как минимум) следующим содержимым:
[.ShellClassInfo] CLSID2 = {0AFACED1-E828-11D1-9187-B532F1E9575D}
Например, ярлыки папок создаются и используются из оболочки Windows в сетевом окружении .
Объекты оболочки [26] или папки оболочки определяются в реестре Windows и могут также использоваться для реализации своего рода символической ссылки. Как и ярлыки папок, они прозрачны для оболочки Windows.
Минимальная реализация выглядит так (CLSID {00000000-0000-0000-0000-0000000000000} используется в качестве заполнителя):
[ HKEY_CLASSES_ROOT \CLSID\{00000000-0000-0000-0000-000000000000}] @ = "отображаемое имя" [ HKEY_CLASSES_ROOT \CLSID\{00000000-0000-0000-0000-000000000000}\DefaultIcon] @ = "..." ; путь к значку [ HKEY_CLASSES_ROOT \CLSID\{00000000-0000-0000-0000-000000000000}\InProcServer32] @ = "%SystemRoot%\\System32\\ShDocVw.Dll" "ThreadingModel" = "Apartment" [ HKEY_CLASSES_ROOT \CLSID\{00000000-0000-0000-0000-000000000000}\Instance] "CLSID" = "{0AFACED1-E828-11D1-9187-B532F1E9575D}" [ HKEY_CLASSES_ROOT \CLSID\{00000000-0000-0000-0000-000000000000}\Instance\InitPropertyBag] "Attributes" = hex : 15,00,00,00 "Target" = "..." ; абсолютный (только БЕЗ "TargetKnownFolder" или "TargetSpecialFolder") ; или относительный путь к цели "TargetKnownFolder" = "{guidguid-guid-guid-guid-guidguidguid}" ; GUID целевой папки, Windows Vista и более поздние версии "TargetSpecialFolder" = "0x00xy" ; CSIDL цели [ HKEY_CLASSES_ROOT \CLSID\{00000000-0000-0000-0000-000000000000}\ShellFolder] "Атрибуты" = hex : 00,00,00,00
Папка «Мои документы» на рабочем столе, а также папки «Шрифты» и «Администрирование» на панели управления являются примерами объектов оболочки , перенаправленных в папки файловой системы.
Cygwin имитирует POSIX-совместимые символические ссылки в файловой системе Microsoft Windows. Он использует идентичные интерфейсы программирования и пользовательских утилит, как и Unix (см. выше), но создает ярлыки Windows (файлы .lnk) с дополнительной информацией, используемой Cygwin во время разрешения символических ссылок. Символические ссылки Cygwin соответствуют стандарту POSIX с точки зрения того, как они разрешаются, и стандартам Windows с точки зрения их представления на диске.
Кроме того, Cygwin можно настроить для поддержки собственных символических ссылок Windows, которые можно использовать из Cygwin без ограничений. [27] Для этого требуется:
Однако существуют некоторые различия. Cygwin не может указать информацию, связанную с ярлыками, например, рабочий каталог или значок, поскольку в ln -s
команде нет места для таких параметров. Для создания стандартных файлов Microsoft .lnk Cygwin предоставляет утилиты mkshortcut
и readshortcut
. [28]
Более подробную информацию по этой теме можно найти в руководстве пользователя Cygwin. [27] MSYS2 , основанный на Cygwin, имеет аналогичный набор настроек winsymlinks , но по умолчанию копирует файлы. [29]
Реализации функций, аналогичных символическим ссылкам.
Совместимая с MIT система разделения времени ок. 1963 г. и несовместимая с MIT система разделения времени имеют связанные файлы, в которых имя целевого файла указано в записи каталога. [2] [3] [4]
Команда, создающая символические ссылки makelink
, — , которая также используется для жестких ссылок. Внутри dos.library возвращает код ошибки, указывающий на то, что цель является мягкой ссылкой, если вы пытаетесь выполнить с ней действия, которые допустимы только для файла, и приложения, которые хотят следовать по символической ссылке, должны явно сделать вызов, чтобы следовать по ссылке, и повторить операцию. Оболочка AmigaDOS будет следовать по ссылкам автоматически.
В Mac OS приложения или пользователи также могут использовать псевдонимы , которые имеют дополнительную функцию отслеживания цели, даже если она перемещена в другое место на том же томе. Это не следует путать с псевдонимом команды оболочки .
В операционной системе OS/2 символические ссылки несколько напоминают тени в графической оболочке Workplace Shell . Однако тени, благодаря полностью объектно-ориентированной модели системных объектов, значительно мощнее и надежнее простой ссылки. Например, тени не теряют своих возможностей при переименовании или при перемещении объекта или субъекта ссылки. [31]
Символические ссылки могут быть реализованы в зависимости от контекста или переменным образом, так что ссылка указывает на различные цели в зависимости от параметра конфигурации, параметра времени выполнения или другого мгновенного состояния.
Переменная или вариантная символическая ссылка — это символическая ссылка, в которую встроено имя переменной. Это обеспечивает некоторую гибкость в порядке файловой системы , которая невозможна при использовании стандартной символической ссылки. Переменные, встроенные в символическую ссылку, могут включать информацию, специфичную для пользователя и среды.
Операционные системы , которые используют различные символические ссылки, включают NetBSD , DragonFly BSD , Domain/OS . [32] [33] [5] Tru64 использует контекстно-зависимую символическую ссылку , где контекстом является номер члена кластера.
Операционная система OSx от Pyramid Technology реализовала условные символические ссылки , которые указывали на разные местоположения в зависимости от того, в какой вселенной была запущена программа. Поддерживались вселенные SysV.3 от AT&T и Berkeley Software Distribution (BSD 4.3). Например: если команда ps была запущена во вселенной att , то символическая ссылка для каталога /bin указывала бы на /.attbin и программа /.attbin/ps была бы выполнена. В то время как если бы команда ps была запущена во вселенной ucb , то /bin указывала бы на /.ucbbin и /.ucbbin/ps была бы выполнена. Похожие условные символические ссылки были также созданы для других каталогов, таких как /lib , /usr/lib , /usr/include . [34]
По мере развития CTSS мы предоставляли пользователям способы совместного использования своих файлов на диске через "общие файлы" и "ссылки",
Записи UFD, которые указывают на другие записи UFD, а не на сам файл
Ссылка: Формат похож на Copy. Указанный файл не копируется
также включает несколько других функций, которые могут оказаться полезными, например,
символические ссылки
и улучшенную схему групп.