Ссылки в Linux
- Hard link — дополнительная запись каталога, ссылающаяся на тот же inode, что и оригинал. На уровне ФС — равноправное имя.
- Symbolic link (symlink, soft link) — отдельный файл типа
lnk(S_IFLNK), содержимое которого — путь до цели (произвольная строка).
См. ln(1), symlink(7), readlink(1), stat(2).
Отличия
| Свойство | Hard link | Symlink |
|---|---|---|
| Указывает на | inode | путь |
| Тип файла | как у цели | l (lnk) |
| На каталог | запрещено для процессов (только . и ..) | разрешено |
| Через границы ФС | нельзя | можно |
| После удаления цели | данные живы, пока st_nlink > 0 | dangling |
st_nlink | увеличивает | не влияет |
| Разрешение пути | не нужно | требует разыменования (O_NOFOLLOW подавляет) |
Создание
Hard link
ln ЦЕЛЬ ССЫЛКА
echo "hello" > file.txt
ln file.txt file_hard.txt
ls -li file.txt file_hard.txt
Ограничения: цель должна существовать; нельзя через границы ФС; нельзя на каталог из userspace.
Symlink
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.