Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

В вычислении , символическая ссылка (также символическая ссылка или мягкая ссылка ) является термином для любого файла , который содержит ссылку на другой файл или каталог в виде абсолютного или относительного пути , и что влияет на разрешение имени пути. [1]

К 1978 году символические ссылки уже присутствовали в операционных системах для мини-компьютеров от DEC и RDOS от Data General . Сегодня они поддерживаются стандартом операционной системы POSIX , большинством Unix-подобных операционных систем, таких как FreeBSD , Linux и macOS . Ограниченная поддержка также существует в операционных системах Windows , таких как Windows Vista , Windows 7 и, в некоторой степени, в Windows 2000 и Windows XP в виде файлов ярлыков.

Обзор [ править ]

Символьная ссылка содержит текстовую строку, которая автоматически интерпретируется операционной системой как путь к другому файлу или каталогу. Этот другой файл или каталог называется «целью». Символьная ссылка - это второй файл, который существует независимо от своей цели. Если символическая ссылка удаляется, ее цель остается неизменной. Если символическая ссылка указывает на цель, и когда-то позже эта цель перемещается, переименовывается или удаляется, символическая ссылка не обновляется или удаляется автоматически, но продолжает существовать и по-прежнему указывает на старую цель, теперь несуществующее местоположение или файл. Символические ссылки, указывающие на перемещенные или несуществующие цели, иногда называют сломанными , потерянными , мертвыми или зависшими .

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

Символьные ссылки работают прозрачно для многих операций: программы, которые читают или записывают файлы, названные символьной ссылкой, будут вести себя так, как если бы они работали непосредственно с целевым файлом. Однако они имеют эффект изменения иерархической файловой системы с дерева на ориентированный граф, что может иметь последствия для таких простых операций, как определение текущего каталога процесса. Даже стандарт Unix для перехода к родительскому каталогу каталога больше не работает надежно перед лицом символических ссылок. Некоторые оболочки эвристически пытаются поддержать иллюзию древовидной иерархии, но когда они это делают, это заставляет их выдавать разные результаты от других программ, которые манипулируют именами путей без такой эвристики, полагаясь вместо этого на операционную систему.[2] Программы, которым необходимо специально обрабатывать символические ссылки (например, оболочки и утилиты резервного копирования), таким образом, должны идентифицировать их и манипулировать ими напрямую.

Некоторые дистрибутивы Unix, а также Linux широко используют символические ссылки, чтобы изменить порядок иерархии файловой системы . Это достигается с помощью нескольких механизмов, таких как вариантные контекстно-зависимые символические ссылки. Это дает возможность создать более интуитивно понятное или ориентированное на приложение дерево каталогов и реорганизовать систему без изменения основного набора системных функций и утилит.

POSIX и Unix-подобные операционные системы [ править ]

В операционных системах, совместимых с POSIX , символические ссылки создаются с помощью системного вызова symlink[3] . Команда lnоболочки обычно использует системный вызов link[4] , который создает жесткую ссылку . Когда указан флаг, вместо него используется системный вызов symlink (), создающий символическую ссылку. Символические ссылки были введены в 4.2BSD Unix от Калифорнийского университета в Беркли .ln -s

Следующая команда создает символическую ссылку в интерфейсе командной строки (оболочке):

 ln -s целевой_путь путь_ссылки

target_path - относительный или абсолютный путь, на который должна указывать символическая ссылка. Обычно цель существует, хотя могут быть созданы символические ссылки на несуществующие цели. link_path - это путь к символической ссылке.

После создания символической ссылки ее обычно можно рассматривать как псевдоним для цели. Все команды управления файловой системы (например, cp, rm) могут быть использованы на символической ссылки. Команды, которые читают или записывают содержимое файла, будут обращаться к содержимому целевого файла. Однако rmкоманда (удалить файл) удаляет саму ссылку, а не целевой файл. Точно так же mvкоманда перемещает или переименовывает ссылку, а не цель.

Приложение POSIX для вывода списка каталогов, lsобозначает символические ссылки со стрелкой после имени, указывающей на имя целевого файла (см. Следующий пример), когда запрашивается длинный список каталогов ( -lопция). Когда запрашивается список каталогов с символической ссылкой, указывающей на каталог, будет отображаться только сама ссылка. Чтобы получить список связанного каталога, путь должен включать в себя завершающий символ-разделитель каталогов ('/', косая черта).

Примечание: В приведенном ниже примере не создавайте каталог «три» перед созданием ссылки в каталоге / 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

Хранение символических ссылок [ править ]

Ранние реализации символических ссылок хранили информацию о символических ссылках в виде данных в обычных файлах. Файл содержал текстовую ссылку на цель ссылки, а биты режима файла указывали, что тип файла является символической ссылкой.

Этот метод был медленным и неэффективным с использованием дискового пространства на небольших системах. Улучшение, называемое быстрыми символическими ссылками , позволило хранить целевой путь в структурах данных, используемых для хранения информации о файлах на диске ( inodes ). В этом пространстве обычно хранится список адресов дисковых блоков, выделенных файлу. Таким образом, доступ к символическим ссылкам с короткими целевыми путями осуществляется быстро. Системы с быстрыми символическими ссылками часто возвращаются к использованию исходного метода, если целевой путь превышает доступное пространство inode. Оригинальный стиль задним числом называют более медленным симлинк . Он также используется для совместимости дисков с другими или более старыми версиями операционных систем.

Хотя при сохранении значения ссылки внутри inode сохраняется дисковый блок и чтение с диска, операционной системе по-прежнему необходимо анализировать имя пути в ссылке, что всегда требует чтения дополнительных индексных дескрипторов и обычно требует чтения других и, возможно, многих каталогов, обработки. список файлов и индексные дескрипторы каждого из них, пока не будет найдено совпадение с компонентами пути ссылки. Только когда ссылка указывает на файл в том же каталоге, «быстрые символические ссылки» обеспечивают значительно лучшую производительность, чем другие символические ссылки.

Подавляющее большинство реализаций, совместимых с POSIX, используют быстрые символические ссылки. Однако стандарт POSIX не требует, чтобы весь набор информации о статусе файла, общий для обычных файлов, был реализован для символических ссылок. Это позволяет реализациям использовать другие решения, такие как хранение данных символических ссылок в записях каталога.

Разрешения файловой системы символьной ссылки не используются; Режимы доступа к целевому файлу контролируются собственными разрешениями целевого файла. Некоторые операционные системы, такие как FreeBSD, предлагают возможность изменять права доступа к файлам и атрибуты файловой системы символьной ссылки с помощью системных вызовов lchmod[5] и lchflags[6] соответственно.

Сообщаемый размер символической ссылки - это количество символов в пути, на который она указывает.

Псевдонимы Mac OS [ править ]

В Mac OS приложения или пользователи также могут использовать псевдонимы , которые имеют дополнительную функцию отслеживания цели, даже если она перемещена в другое место на том же томе. Его не следует путать с псевдонимом команды оболочки .

Microsoft Windows [ править ]

Символьная ссылка NTFS [ править ]

NTFS 3.1 представила поддержку символических ссылок для файлов любого типа. Он был включен в Windows XP , но был включен по умолчанию только для программ режима ядра; В Windows Vista и более поздних версиях Windows также была включена поддержка символических ссылок на приложения пользовательского режима, а mklinkдля их создания была предоставлена служебная программа командной строки . Сторонние драйверы необходимы для включения поддержки символических ссылок NTFS в Windows XP. [7] В отличие от точек соединения , символическая ссылка может также указывать на файл или удаленный блок сообщений сервера.(SMB) сетевой путь. Кроме того, реализация символической ссылки NTFS обеспечивает полную поддержку ссылок между файловыми системами. Однако функциональность, разрешающая символические ссылки между хостами, требует, чтобы удаленная система также поддерживала их.

Символические ссылки предназначены для облегчения миграции и совместимости приложений с операционными системами POSIX . Microsoft стремилась к тому, чтобы символические ссылки в Windows Vista «работали так же, как ссылки в UNIX». [8] Однако реализация отличается от символических ссылок Unix несколькими способами. Например, пользователи Windows Vista должны вручную указать при создании символической ссылки, является ли это файлом или каталогом. [9] Windows 7 и Vista поддерживают максимум 31 точку повторной обработки (и, следовательно, символические ссылки) для заданного пути (т. Е. Любой заданный путь может иметь не более 31 косвенного обращения, прежде чем Windows откажется от него). [10] Только пользователи с новой функцией "Создать символическую ссылку"привилегия, которую по умолчанию имеют только администраторы, может создавать символические ссылки. [11] Если это нежелательное поведение, его необходимо изменить в консоли управления локальной политикой безопасности. Кроме того, символические ссылки NTFS на файлы отличаются от символических ссылок NTFS на каталоги и поэтому не могут использоваться взаимозаменяемо, в отличие от POSIX, где одна и та же символическая ссылка может относиться к файлам или каталогам.

В Windows Vista и более поздних версиях, когда путь к рабочему каталогу заканчивается символической ссылкой, текущая ссылка на родительский путь ..будет ссылаться на родительский каталог символической ссылки, а не на каталог ее цели. Такое поведение также наблюдается на уровне оболочки, по крайней мере, в некоторых системах POSIX, включая Linux , но никогда не при доступе к файлам и каталогам через вызовы операционной системы. Например, Баш встроенные команды pwdи cdработать на текущем логическом каталоге. pwdчасто используется в сценариях для определения фактического текущего рабочего каталога. Когда любой путь используется с системным вызовом, при любом использовании ..будет использоваться фактический родительский ..элемент файловой системы каталога, содержащего запись псевдокаталога. Итак, cd ..; cat somethingиcat ../something может возвращать совершенно разные результаты.

Примеры [ править ]

  1. PS > mklink /D "$env:LOCALAPPDATA\Plex Media Server" "G:\Plex Media Server"
  2. PS > New-Item -Path C:\TargetPath -ItemType SymbolicLink -Value F:\SourcePath

Точки соединения NTFS [ править ]

Windows 2000 версия NTFS представила точки повторной обработки , что позволило, в частности, использование точки монтирования томов и точки соединения. Точки соединения предназначены только для каталогов и, более того, только для локальных каталогов; точки соединения с удаленными общими ресурсами не поддерживаются. [12] В комплекты ресурсов Windows 2000 и XP входит программа под названием linkd для создания точек соединения; более мощный один названный Junction был распространен Sysinternals ' Марк Руссинович .

Не все стандартные приложения поддерживают точки повторной обработки. Наиболее заметно, что резервное копирование страдает от этой проблемы и выдает сообщение об ошибке 0x80070003 [13], когда папки для резервного копирования содержат точку повторной обработки.

Ярлыки [ править ]

Ярлыки , которые поддерживаются графическими файловыми браузерами некоторых операционных систем, могут напоминать символические ссылки, но отличаться по ряду важных аспектов. Одно различие заключается в том, какой тип программного обеспечения может им следовать:

  • Символические ссылки автоматически разрешаются файловой системой. Любая программа при доступе к символической ссылке вместо этого увидит цель, независимо от того, знает ли программа о символических ссылках или нет.
  • Файловая система и программы, которые не знают о ярлыках, обрабатываются как обычные файлы. Только программы, которые понимают ярлыки (например, оболочка Windows и файловые браузеры), обрабатывают их как ссылки на другие файлы.

Еще одно отличие - возможности механизма:

  • Ярлыки Microsoft Windows обычно ссылаются на пункт назначения по абсолютному пути (начиная с корневого каталога ), тогда как символические ссылки POSIX могут ссылаться на пункты назначения по абсолютному или относительному пути . Последнее полезно, если и расположение, и место назначения символической ссылки имеют общий префикс пути [ требуется пояснение ] , но этот префикс еще не известен, когда символическая ссылка создается (например, в архивном файле, который можно распаковать куда угодно) .
  • Ярлыки приложений Microsoft Windows содержат дополнительные метаданные, которые могут быть связаны с местом назначения, тогда как символические ссылки POSIX - это просто строки, которые будут интерпретироваться как абсолютные или относительные пути.
  • В отличие от символических ссылок, ярлыки Windows сохраняют свои ссылки на свои цели, даже когда цель перемещается или переименовывается. Клиенты домена Windows могут подписаться на службу Windows под названием « Отслеживание распределенных ссылок», чтобы отслеживать изменения в файлах и папках, в которых они заинтересованы. Служба поддерживает целостность ярлыков, даже когда файлы и папки перемещаются по сети. [14] Кроме того, в Windows 9x и более поздних версиях оболочка Windows пытается найти цель неработающего ярлыка перед тем, как предложить его удалить.

Ярлыки папок [ править ]

Почти как ярлыки, но прозрачны для оболочки Windows. [15] Они реализованы как обычные папки (которые должны иметь атрибут только для чтения и / или системный атрибут [16] ), содержащие ярлык с именем target.lnk, который ссылается на цель, и (скрытый) desktop.ini с (как минимум ) следующее содержание:

 [.ShellClassInfo]  CLSID2 = {0AFACED1-E828-11D1-9187-B532F1E9575D}

Ярлыки папок создаются и используются, например, из оболочки Windows в сетевом окружении .

Объекты оболочки [ править ]

Эти объекты оболочки [17] или оболочки папки определяются в реестре Windows , и могут быть использованы для реализации своего рода символической ссылки тоже. Как и ярлыки папок, они прозрачны для оболочки Windows.

Минимальная реализация (CLSID {00000000-0000-0000-0000-000000000000} используется в качестве заполнителя):

 [ 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" = "Квартира"  [ HKEY_CLASSES_ROOT \ CLSID \ { 00000000-0000-0000-0000-000000000000} \ Экземпляр]  "CLSID" = "{0AFACED1-E828-11D1-9187-B532F1E9575D}" [ HKEY_CLASSES_ROOT\ CLSID \ {00000000-0000-0000-0000-000000000000} \ Instance \ InitPropertyBag]  «Атрибуты» = шестнадцатеричный : 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]  «Атрибуты» = шестнадцатеричный : 00,00,00,00

Папка « Мои документы » на рабочем столе, а также папки « Шрифты» и « Администрирование» на панели управления являются примерами объектов оболочки, перенаправляемых в папки файловой системы.

Символические ссылки Cygwin [ править ]

Cygwin имитирует POSIX-совместимые символические ссылки в файловой системе Microsoft Windows. Он использует идентичные интерфейсы программирования и пользовательских утилит, что и Unix (см. Выше), но создает ярлыки Windows (файлы .lnk) с дополнительной информацией, используемой Cygwin во время разрешения символических ссылок. Символические ссылки Cygwin совместимы со стандартом POSIX с точки зрения их разрешения и со стандартами Windows с точки зрения их представления на диске.

Кроме того, Cygwin можно настроить для поддержки собственных символических ссылок Windows, которые можно использовать вне Cygwin без ограничений. [18] Для этого требуется:

  1. Изменение переменной среды CYGWIN, чтобы она содержала winsymlinks: native ;
  2. Запуск Cygwin с повышенными правами, потому что Windows ограничивает создание символических ссылок для привилегированных пользователей

Однако существуют некоторые различия. Cygwin не имеет возможности указать информацию, относящуюся к ярлыку, такую ​​как рабочий каталог или значок, поскольку в ln -sкоманде нет места для таких параметров . Для создания стандартных файлов Microsoft .LNK Cygwin обеспечивает mkshortcutи readshortcutутилиты. [19]

В Руководстве пользователя Cygwin есть дополнительная информация по этой теме. [18] MSYS2 , основанный на Cygwin, имеет аналогичный набор настроек winsymlinks , но по умолчанию копирует файлы. [20]

Резюме [ править ]

Устаревшие системы [ править ]

Амига [ править ]

Команда создания символических ссылок есть makelink, которая также используется для жестких ссылок. Внутренне dos.library возвращает код ошибки, указывающий, что цель является программной ссылкой, если вы пытаетесь выполнить с ней действия, допустимые только для файла, а приложения, которые хотят следовать по символической ссылке, должны явно вызвать перейдите по ссылке и повторите операцию. AmigaDOS оболочка будет следовать ссылки автоматически.

OS / 2 [ править ]

В операционной системе OS / 2 символические ссылки чем-то напоминают тени в графической оболочке Workplace Shell . Однако тени благодаря полностью объектно-ориентированной системной объектной модели значительно более мощны и надежны, чем простая ссылка. Например, тени не теряют своих возможностей при переименовании или при перемещении объекта или субъекта ссылки. [23]

Переменные символические ссылки [ править ]

Символические ссылки могут быть реализованы контекстно-зависимым или переменным образом, так что ссылка указывает на различные цели в зависимости от параметра конфигурации, параметра времени выполнения или другого мгновенного состояния.

Переменная или вариант символической ссылкой является символической ссылкой , которая имеет имя переменного , встроенное в него. Это обеспечивает некоторую гибкость в порядке файловой системы, что невозможно со стандартной символической ссылкой. Переменные, встроенные в символическую ссылку, могут включать в себя информацию о пользователе и среде.

Операционные системы , использующие вариантные символические ссылки, включают NetBSD , DragonFly BSD , Domain / OS . [24] [25] [2] Tru64 использует контекстно-зависимую символьную ссылку, где контекстом является номер члена кластера.

Пирамида Технология OSx «s Операционная система реализована условные символические ссылки , которые указывали на разные места , в зависимости от которых вселенной программы работала в. Вселенных поддерживаемом была AT & Ts игровой SysV.3 и распространение Berkeley Software (BSD 4.3). Например: если команда ps была запущена во вселенной att , то символическая ссылка для каталога / bin будет указывать на /.attbin, и будет выполнена программа /.attbin/ps . Если же команда ps была запущена во вселенной ucb , то / binбудет указывать на /.ucbbin и /.ucbbin/ps будет выполняться. Подобные условные символические ссылки были также созданы для других каталогов, таких как / lib , / usr / lib , / usr / include . [26]

См. Также [ править ]

  • Symlink race - уязвимость безопасности, вызванная символическими ссылками
  • freedup - автоматически создает связи между идентичными данными

Ссылки [ править ]

  1. ^ Разрешение имени пути , POSIX .
  2. ^ a b Пайк, Роб (2000). Лексические имена файлов в Plan 9 или правильное расположение точек (PDF) . Proc. Ежегодная техническая поддержка USENIX . Конф.
  3. ^ символическая ссылка, символическая ссылка . IEEE Std 1003.1, издание 2013 г.
  4. ^ ссылка, ссылка . IEEE Std 1003.1, издание 2013 г.
  5. ^ "lchmod (2)" . Страницы руководства для FreeBSD 11.
  6. ^ "lchflags (2)" . Страницы руководства для FreeBSD 11.
  7. ^ "Ссылка на веб-сайт расширения оболочки" . Ссылка на веб-сайт расширения Shell .
  8. ^ Символические ссылки , библиотека MSDN, разработка Win32 и COM, 18 января 2008 г.
  9. ^ Функция CreateSymbolicLink , библиотека MSDN, разработка Win32 и COM
  10. ^ Рекомендации по программированию символических ссылок , MSDN
  11. ^ Марк Руссинович: Внутри ядра Windows Vista: Часть 1 - Файловые символические ссылки, Microsoft Technet, февраль 2007 г.
  12. ^ "Документация Sysinternals Junction" . microsoft.com . Проверено 23 марта 2018 года .
  13. ^ http://support.microsoft.com/kb/973455
  14. ^ «Распределенное отслеживание ссылок и идентификаторы объектов» . Сеть разработчиков Microsoft . Корпорация Майкрософт. 20 марта 2011 . Проверено 30 июня 2011 года .
  15. ^ «Указание местоположения расширения пространства имен» . msdn.microsoft.com . Проверено 23 марта 2018 года .
  16. ^ [1] Невозможно удалить атрибут "Только для чтения" из папки.
  17. ^ Создание расширений оболочки с объектами экземпляра оболочки . msdn.microsoft.com
  18. ^ a b [2] Руководство пользователя Cygwin , Cygwin .
  19. ^ [3] Файлы Microsoft .lnk в Cygwin
  20. ^ «Coreutils: ln --symbolic создает жесткие ссылки (MSYS2-packages # 249)» . GitHub .
  21. ^ Реализация Windows не совместима с POSIX
  22. ^ POSIX разрешает жесткие ссылки на каталоги, но не требует их. Современные файловые системы не поддерживают его.
  23. ^ Рохас, Мигель. «Cómo ejecutar versiones de Python отличается от последних предопределенных» . https://manualestutor.com/ . Проверено 20 декабря 2020 . Внешняя ссылка в |website=( помощь )
  24. ^ symlink(7)  -  Руководство по разнойинформации NetBSD : волшебные символические ссылки.
  25. ^ Брукс Дэвис (2008). «Варианты символических ссылок для FreeBSD» (PDF) .
  26. ^ Нил Браун (2016). «Случай вариантных символических ссылок» . LWN .

Внешние ссылки [ править ]

  • Вопросы и ответы: разница между жесткими и программными ссылками применительно к Linux
  • Соединение : поддерживать точки соединения NTFS (для Windows 2000 и выше)
  • FSUtil Hardlink : страница Microsoft Technet об использовании инструмента командной строки FSUtil для создания жестких ссылок (для Windows 2000 и более поздних версий)
  • Расширение оболочки ссылок : контекстное меню проводника Windows, значки наложения и обработчик окна свойств для поддержки жестких ссылок, точек соединения NTFS, символических ссылок и т. Д.
  • Символические драйверы для Windows XP (на японском языке) : драйверы файловой системы для включения символических ссылок для Windows XP (также отражены на сайте расширения Link Shell). Доступные источники.

Эта статья основана на материалах, взятых из Free On-line Dictionary of Computing до 1 ноября 2008 г. и включенных в соответствии с условиями «перелицензирования» GFDL версии 1.3 или новее.