Ссылки в Linux: обзор
Ссылка — это альтернативное имя или указатель на существующий объект файловой системы. В Linux различают два базовых типа:
- Жёсткая ссылка (hard link) — дополнительная запись каталога, указывающая на тот же inode (тот же файловый объект) что и «оригинальный» файл.
- Символическая ссылка (symbolic link, symlink, soft link) — отдельный специальный файл типа
symlink, чьё содержимое — это путь (строка) до целевого объекта.
📖 Документация: man ln, man stat, man readlink.
🧩 Ключевые отличия
-
На что указывает
hard link: непосредственно на inode целиsymlink: на путь до цели
-
Тип файла
hard link: обычный файл (ещё одно имя того же inode)symlink: специальный типl(link), содержит строку-путь
-
Поддержка директорий
hard link: обычно запрещено (кроме.и..)symlink: разрешено
-
Границы файловых систем
hard link: только в пределах той же ФСsymlink: может указывать между ФС
-
Живучесть при удалении цели
hard link: файл остаётся доступным, пока есть хотя бы один hard linksymlink: становится «битой» ссылкой (dangling)
-
Влияние на счётчик ссылок (
st_nlink)hard link: увеличиваетsymlink: не влияет
-
Разрешение путей
hard link: не требуется (уже тот же inode)symlink: требуется разыменование пути ядром или библиотекой
🏗️ Создание ссылок
Жёсткие ссылки
# Синтаксис
ln [ОПЦИИ] ЦЕЛЬ ССЫЛКА
# Пример
echo "hello" > file.txt
ln file.txt file_hard.txt
ls -li file.txt file_hard.txt
Ограничения: нельзя на директорию (без привилегий/особых средств), нельзя через границы файловых систем, нельзя на несуществующий объект.
Символические ссылки
# Синтаксис
ln -s [ОПЦИИ] ЦЕЛЬ ССЫЛКА
# Примеры
ln -s /var/log/nginx/access.log nginx_access.log # абсолютный путь
ln -s ../bin/tool ./current-tool # относительный путь
Рекомендуется использовать относительные пути внутри разворачиваемых проектов/репозиториев: перенос каталога сохранит корректность ссылок.
🔎 Инспекция и разыменование
ls -l
# Права 'l' и стрелка -> указывают на цель
# lrwxrwxrwx 1 user group 12 Oct 22 10:00 link -> ../bin/tool
readlink link # печатает путь-содержимое symlink
readlink -f link # канонический путь после разыменования
stat file.txt # поля st_ino, st_nlink и др.
🚧 Ограничения и подводные камни
- Жёсткие ссылки не работают на директории и через границы ФС.
- Symlink может «протухнуть» при переезде цели (dangling).
- Разные права/владельцы у ссылки и у цели — это разные объекты.
- Безопасность: не доверяйте путям, полученным извне; защищайтесь от symlink-race (см. флаги
O_NOFOLLOW,O_EXCL,openat2()в системных вызовах).
📚 Ссылки
- man7.org: ln(1), readlink(1), realpath(1)
- POSIX: Symbolic Link Definition
- GNU Coreutils:
info coreutils 'ln invocation'