Что такое символические и жёсткие ссылки?
Ссылки (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 ссылка станет битой.