# Symbolic link _Файловая система · LinuxLab Knowledge Base_ **TL;DR:** Symlink - отдельный файл-«ярлык», который содержит путь к цели. В отличие от [[hard-link]], это разные [[inode]], symlink может указывать на что угодно (включая несуществующее). ## Что такое symbolic link `ln -s target name` создаёт маленький файл `name` со специальным флагом «это symlink» и содержимым - строкой-путь к `target`. Это **отдельный inode**, со своими правами и временами. Когда программа открывает symlink, ядро **разыменовывает** его - фактически работает с целью. Большинство syscall'ов прозрачны (`open`, `stat`, `read`/`write`). Но есть `lstat` который смотрит на сам symlink, не на цель. ## Симлинк vs хардлинк | свойство | hard link | symbolic link | |---|---|---| | inode | тот же что у цели | свой собственный | | работает между FS | нет | да | | на директории | нет | да | | переживает удаление цели | да (содержимое живёт) | нет (становится «битой») | | размер | 0 (ничего своего нет) | длина пути в байтах | | видим как «другой файл» в `ls -li` | inode совпадает | другой inode + «-> target» | ## Битые ссылки Если цель удалена/переименована - symlink остаётся, но указывает в никуда: ```bash ln -s /no/such/path slink ls -l slink # видно red/italic в большинстве терминалов cat slink # No such file or directory ``` Чтобы найти все битые symlink'и в дереве: ```bash find /path -type l -! -exec test -e {} \; -print ``` ## Где встречается - `/usr/bin/python3` → `python3.12` (versioned alternatives via `update-alternatives`) - `/etc/localtime` → `/usr/share/zoneinfo/` - В систем-юнитах: `/etc/systemd/system/multi-user.target.wants/*.service` → `/lib/systemd/system/*.service` - Атомарные deploy'и: текущая версия - symlink на конкретный релиз ## Команды ```bash ln -s /etc/passwd ~/users-link ``` Создать символическую ссылку на /etc/passwd ```bash readlink ~/users-link ``` Вывести чистый путь, на который указывает symlink ```bash readlink -f ~/users-link ``` -f: разыменовать рекурсивно до конца цепочки и вернуть абсолютный канонический путь ```bash ln -sfn /opt/app/v2 /opt/app/current ``` Атомарно переключить symlink на новую цель (-f: forced overwrite, -n: не следовать в существующий каталог) ## См. также - [Inode](/kb/inode.md) - [Hard link](/kb/hard-link.md) - [Filesystem Hierarchy Standard (FHS)](/kb/fhs.md)