В дополнение ко всем другим ответам я хочу отметить следующие важные свойства:
Мягкая ссылка является истинной ссылкой, то есть это небольшой файл, который содержит путь. Разрешение программной ссылки происходит прозрачно для приложения: если процесс открывает файл, скажем /this/path/here
, символическая ссылка, на которую указывает, /that/other/path
то вся обработка открытия /that/other/path
выполняется ОС. Кроме того, если /that/other/path
это сама символическая ссылка, то это также решается операционной системой. Фактически, ОС следует цепочке символических ссылок, пока не найдет что-то еще (например, обычный файл) или пока не достигнет SYMLOOP_MAX
(см. sysconf(3)
) Многих записей, и в этом случае ОС (точнее: соответствующий системный вызов) возвращает ошибку и устанавливает errno
к ELOOP
. Таким образом, циклическая ссылка, подобная xyz -> xyz
, не остановит процесс. (Для систем Linux смотрите path_resolution(7)
подробности.)
Обратите внимание, что процесс может проверить, является ли путь-символ символической ссылкой или нет, с помощью lstat(2)
и может изменить свои атрибуты файла (сохраненные в таблице inode) lchown(2)
и т. Д. (См. symlink(7)
Всю историю).
Теперь, с точки зрения разрешения, вы заметите, что символические ссылки всегда имеют разрешения 777 ( rwxrwxrwx
в символической записи). Это связано с тем, что любые другие разрешения могут быть обойдены путем доступа к реальному файлу в любом случае. И наоборот, 777 для символьной ссылки не делает доступным символьный файл, если он не был доступен в первую очередь. Например, символическая ссылка с разрешениями 777, указывающая на файл с разрешениями 640, делает файл недоступным для «других» (широкой общественности). Другими словами, файл xyz
доступен по символической ссылке тогда и только тогда, когда он доступен напрямую, то есть без косвенного обращения. Таким образом, разрешения символической ссылки не имеют никакого эффекта безопасности вообще.
Одно из основных видимых отличий между жесткими ссылками и символическими ссылками (также называемыми программными ссылками) заключается в том, что символические ссылки работают в файловых системах, в то время как жесткие ссылки ограничиваются одной файловой системой. Таким образом, файл в разделе A может быть символически связан с разделом B, но он не может быть жестко связан с этим. Это ясно из того факта, что жесткая ссылка на самом деле является записью в каталоге, которая состоит из имени файла и номера инода, и что номера инода уникальны только для файловой системы.
Термин hardlink на самом деле несколько вводит в заблуждение. В то время как для символических ссылок источник и назначение четко различимы (символическая ссылка имеет свою собственную запись в таблице inode), это не относится к жестким ссылкам. Если вы создаете жесткую ссылку для файла, исходная запись и жесткая ссылка неразличимы с точки зрения того, что было там первым. (Поскольку они ссылаются на один и тот же inode, они совместно используют свои атрибуты файла, такие как владелец, права доступа, метки времени и т. Д.) Это приводит к утверждению, что каждая запись каталога на самом деле является жесткой ссылкой, а жесткая ссылка на файл просто означает создание второго ( или третий, или четвертый ...) жесткая ссылка. Фактически, каждый индекс хранит счетчик количества жестких ссылок на этот индекс.
Наконец, обратите внимание, что обычные пользователи не могут жестко связывать каталоги. Это потому, что это должно быть сделано с предельной осторожностью: неосторожный пользователь может вводить циклы в строго иерархически иерархическое файловое дерево, с которым все обычные инструменты (например fsck
) и сама ОС не готовы иметь дело.