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

Oct, 22, 2025

Ссылки в 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 link
    • symlink: становится «битой» ссылкой (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() в системных вызовах).

📚 Ссылки

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