Символические ссылки
100%

Файловая система · Урок 12

Символические ссылки

Узнайте, чем символические и жёсткие ссылки различаются при разрешении путей, идентичности inode и в области файловой системы.

Запись каталога даёт inode имя. Жёсткая ссылка создаёт ещё одну запись каталога для того же inode, а символическая — другой inode, содержимым которого является путь для разрешения. Это различие определяет идентичность, срок жизни и поведение между файловыми системами.

Создание и просмотр символической ссылки

Создайте символическую ссылку командой ln -s TARGET LINK_NAME:

$ printf '%s\n' 'example' > myfile
$ ln -s -- myfile myfilelink
$ ls -li myfile myfilelink
151   -rw-r--r-- 1 user user 8 ... myfile
93403 lrwxrwxrwx 1 user user 6 ... myfilelink -> myfile

У символической ссылки собственный inode, где хранится текст myfile. Когда программа следует через myfilelink, разрешение пути продолжается к цели. Покажите сохранённый текст без следования ссылке:

$ readlink myfilelink

Какая команда создаёт символическую ссылку myfilelink с текстом цели myfile?

Относительные и абсолютные цели

Абсолютная цель начинается с /. Относительная цель разрешается относительно каталога, содержащего символическую ссылку, а не текущего каталога оболочки в момент последующего открытия.

$ mkdir -p tree/data tree/current
$ printf '%s\n' 'value' > tree/data/item
$ ln -s ../data/item tree/current/item

Перемещение всей иерархии tree сохраняет эту относительную связь. Перемещение только ссылки или цели может её нарушить. Символической ссылке разрешено содержать несуществующую цель; тогда она называется висячей или битой.

Откуда разрешается относительная цель символической ссылки?

Создание жёсткой ссылки

Создайте ещё одно имя существующего обычного файла без -s:

$ ln -- myfile myhardlink
$ ls -li myfile myhardlink
151 -rw-r--r-- 2 user user 8 ... myfile
151 -rw-r--r-- 2 user user 8 ... myhardlink

Оба имени относятся к одной файловой системе и номеру inode. Счётчик ссылок становится равен 2. Ни одно имя по своей природе не является «оригиналом»: изменение содержимого через одно имя меняет общий объект, а удаление одного оставляет другое.

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

Что разделяют две жёсткие ссылки одного обычного файла?

Срок жизни и удаление

Удаление символической ссылки удаляет объект ссылки, а не её цель:

$ rm -- myfilelink

Удаление имени жёсткой ссылки уменьшает счётчик ссылок общего inode. Файловая система может освободить объект только после обнуления счётчика и исчезновения всех открытых описаний файла и других сохраняющих его ссылок.

Не добавляйте завершающую косую черту при удалении символической ссылки на каталог: в зависимости от команды она может включить семантику следования каталогу. Проверьте ссылку через ls -ld -- LINK и осознанно удалите её имя.

Что обычно происходит при удалении самой символической ссылки?

Безопасное следование ссылкам

Символические ссылки могут перенаправить привилегированную программу за пределы ожидаемого каталога или измениться между проверкой и использованием. Защищённые программы должны избегать гонок «проверить, затем открыть» и применять подходящие языку и ОС интерфейсы относительно каталога, без следования или с ограниченным разрешением.

Для обычной проверки:

  • ls -ld LINK показывает саму ссылку;
  • readlink LINK выводит сохранённый текст цели;
  • stat LINK обычно сообщает метаданные ссылки, а stat -L LINK следует ей в GNU coreutils;
  • find -L следует ссылкам и может встретить циклы; используйте его только намеренно.

Разрешения вида lrwxrwxrwx не являются общим предоставлением доступа. Доступ определяется обходом каталогов, политикой следования и разрешениями цели; владение ссылкой также важно для некоторых правил защищённых каталогов.

Что по умолчанию выводит readlink LINK?

Урок завершён

Вы завершили Символические ссылки

Теперь вы можете выбирать и проверять правильный вид ссылки файловой системы.

  • Использовать ln -s TARGET LINK для основанной на пути символической ссылки.

  • Разрешать относительные цели из каталога, содержащего ссылку.

  • Использовать ln EXISTING LINK для ещё одного имени inode в той же файловой системе.

  • Отличать удаление символической ссылки от удаления жёсткой.

  • Избегать небезопасного следования ссылкам в привилегированных и рекурсивных операциях.

Сохраните прогресс

Создайте бесплатный аккаунт, чтобы сохранить этот урок и продолжить на любом устройстве.

Создать бесплатный аккаунт
Назад к Файловая система