Gymterview
junior

Что такое символические и жёсткие ссылки?

Ссылки (links) — это механизм файловой системы, позволяющий обращаться к одним и тем же данным по нескольким путям. Существуют два вида: жёсткие ссылки (hard links), указывающие напрямую на inode файла, и символические ссылки (symlinks), хранящие путь к целевому файлу.

Жёсткая ссылка (hard link)

Жёсткая ссылка — это дополнительное имя (directory entry) для того же inode. Все жёсткие ссылки на один файл абсолютно равноправны: нет понятия «оригинал» и «копия». Данные удаляются только когда счётчик ссылок на inode падает до нуля.

Пример
# Создание жёсткой ссылки
ln original.txt hardlink.txt

# Проверить — inode совпадает
ls -i original.txt hardlink.txt
# 123456 original.txt
# 123456 hardlink.txt     (тот же inode)

Символическая ссылка (symlink, soft link)

Символическая ссылка — это отдельный файл со своим inode, содержащий путь к целевому файлу. Аналог ярлыка в Windows.

Пример
# Создание символической ссылки
ln -s /opt/jdk-17 /usr/local/java
ln -s ../config/application.yml app.yml

Сравнение

Характеристика Жёсткая ссылка Символическая ссылка
Inode Тот же, что у оригинала Свой собственный
Удаление оригинала Данные сохраняются, пока есть хоть одна ссылка Ссылка становится «битой» (dangling)
Ссылка на директорию Нельзя (кроме . и ..) Можно
Между файловыми системами Нельзя (inode локальны для FS) Можно
Размер Не занимает дополнительного места Занимает (хранит текст пути)
Производительность Прямой доступ к данным Дополнительный уровень косвенности

Практические примеры

Пример
# Переключение версии Java
sudo ln -sf /usr/lib/jvm/java-17/bin/java /usr/local/bin/java
# -f — перезаписать, если ссылка уже существует

# Проверить, является ли файл ссылкой
ls -l /usr/local/bin/java
# lrwxrwxrwx 1 root root 33 ... /usr/local/bin/java -> /usr/lib/jvm/java-17/bin/java

# Количество жёстких ссылок (второй столбец ls -l)
ls -l file.txt
# -rw-r--r-- 2 user user 1024 ... file.txt
#             ^ 2 жёсткие ссылки

# Найти все жёсткие ссылки на файл по inode
find / -inum 123456

# Найти битые символические ссылки
find . -xtype l

Вывод

Для повседневных задач (переключение версий, удобные алиасы путей) используйте символические ссылки. Жёсткие ссылки полезны для бэкапов и систем, где важна устойчивость к случайному удалению «оригинала».

На собеседовании: объясните разницу через inode: жёсткая ссылка — второе имя для того же inode, символическая — отдельный файл с путём. Ключевые ограничения жёстких ссылок: нельзя на директории, нельзя между файловыми системами. Частый вопрос-ловушка: «что произойдёт при удалении оригинала?» — для hard link данные останутся, для symlink ссылка станет битой.