← Back to notes

Символические и жёсткие ссылки в
Linux (symlink, hard link)


Ссылки в Linux

  • Hard link — дополнительная запись каталога, ссылающаяся на тот же inode, что и оригинал. На уровне ФС — равноправное имя.
  • Symbolic link (symlink, soft link) — отдельный файл типа lnk (S_IFLNK), содержимое которого — путь до цели (произвольная строка).

См. ln(1), symlink(7), readlink(1), stat(2).


Отличия

СвойствоHard linkSymlink
Указывает наinodeпуть
Тип файлакак у целиl (lnk)
На каталогзапрещено для процессов (только . и ..)разрешено
Через границы ФСнельзяможно
После удаления целиданные живы, пока st_nlink > 0dangling
st_nlinkувеличиваетне влияет
Разрешение путине нужнотребует разыменования (O_NOFOLLOW подавляет)

Создание

ln ЦЕЛЬ ССЫЛКА
echo "hello" > file.txt
ln file.txt file_hard.txt
ls -li file.txt file_hard.txt

Ограничения: цель должна существовать; нельзя через границы ФС; нельзя на каталог из userspace.

ln -s ЦЕЛЬ ССЫЛКА
ln -s /var/log/nginx/access.log nginx_access.log   # абсолютный
ln -s ../bin/tool ./current-tool                   # относительный

Относительные пути устойчивы при перемещении содержащего каталога вместе с целью.


Инспекция

ls -l                    # 'l' в первой колонке + "-> target"
readlink link            # содержимое symlink (одна разыменовка)
readlink -f link         # канонический путь (рекурсивно; последний компонент может не существовать, -e требует существования всего пути)
realpath link            # то же, POSIX-совместимый интерфейс
stat file.txt            # st_ino, st_nlink, st_size
stat -L symlink          # информация о цели (--dereference)

Подводные камни

  • Hard link и каталоги: link(2) возвращает EPERM для каталогов в большинстве ФС.
  • Hard link через ФС: EXDEV.
  • Symlink на отсутствующую цель создаётся успешно (dangling до появления цели).
  • Права symlink-файла на Linux игнорируются — действуют права цели; lchown(2) меняет владельца самого symlink.
  • Symlink TOCTOU/race: используйте O_NOFOLLOW, openat2(2) с RESOLVE_NO_SYMLINKS/RESOLVE_BENEATH, fstatat(2) с AT_SYMLINK_NOFOLLOW.

Ссылки

Символические и жёсткие ссылки в Linux (symlink, hard link) | Aleksandr Suprun