Что такое 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 остаётся, но указывает в никуда:
ln -s /no/such/path slink
ls -l slink # видно red/italic в большинстве терминалов
cat slink # No such file or directory
Чтобы найти все битые symlink'и в дереве:
find /path -type l -! -exec test -e {} \; -printГде встречается
/usr/bin/python3→python3.12(versioned alternatives viaupdate-alternatives)/etc/localtime→/usr/share/zoneinfo/<TZ>- В систем-юнитах:
/etc/systemd/system/multi-user.target.wants/*.service→/lib/systemd/system/*.service - Атомарные deploy'и: текущая версия - symlink на конкретный релиз