Новички в мире Linux часто сталкиваются с путаницей: зачем нужны два разных типа ссылок, если они выполняют схожую функцию? В Windows мы привыкли к обычным «ярлыкам», но в файловой системе Linux всё устроено гораздо интереснее. Понимание разницы между жесткими (Hard Link) и символическими (Soft/Sym Link) ссылками — это базовый навык, который убережет вас от случайной потери данных и некорректной работы программ.

Жесткая ссылка (Hard link)

Жесткая ссылка — это не просто указатель, а дополнительное имя для уже существующего файла. Чтобы понять этот механизм, нужно вспомнить про inode (индексный дескриптор). Представьте, что inode — это уникальный номер паспорта файла на диске. Жесткая ссылка — это создание еще одного паспорта с другим именем, но тем же самым номером.

  • Живучесть: Если вы удалите оригинальный файл, данные на диске не исчезнут, пока существует хотя бы одна жесткая ссылка на них.
  • Единые атрибуты: У всех жестких ссылок на один файл всегда одинаковые права доступа, владелец и время изменения, так как это фактически один и тот же объект.
  • Ограничения: Нельзя создавать жесткие ссылки на директории (во избежание бесконечных циклов в системе) и нельзя связывать файлы на разных разделах диска (так как inode уникален только в рамках одной ФС).

Команда для создания:

ln file link

Символическая ссылка (Soft / Sym link)

Символическая ссылка — это классический «ярлык». Это отдельный небольшой файл, внутри которого записан путь к целевому объекту.

  • Зависимость: Если удалить оригинал, символическая ссылка станет «битой» (broken symlink). Она всё еще будет существовать, но указывать ей будет некуда.
  • Гибкость: В отличие от жестких ссылок, «мягкие» могут указывать на папки и работать между разными физическими дисками или разделами.
  • Права: Сама ссылка имеет свои права (обычно lrwxrwxrwx), но они не влияют на доступ — система всегда проверяет права того файла, на который ссылка указывает.

Команда для создания:

ln -s file link

Практический пример и проверка inode

Давайте посмотрим, как это выглядит на практике:

# Создаём файл с текстом
echo "Hello" > original.txt

# Создаём жёсткую ссылку
ln original.txt hard.txt

# Создаём символическую ссылку
ln -s original.txt soft.txt

# Смотрим структуру с выводом inode (флаг -i)
ls -li

Пример вывода команды ls:

# 123456 -rw-r--r-- 2 user user 6 May 26 10:00 original.txt
# 123456 -rw-r--r-- 2 user user 6 May 26 10:00 hard.txt
# 123457 lrwxrwxrwx 1 user user 12 May 26 10:00 soft.txt -> original.txt

Обратите внимание: inode (число слева) у original.txt и hard.txt идентичны. Это один физический файл с двумя именами. У soft.txt номер другой — это самостоятельный файл-указатель.

Что произойдет при удалении оригинала?

rm original.txt
cat hard.txt   # Hello — работает!
cat soft.txt   # cat: soft.txt: No such file or directory (битая ссылка)

Полезные лайфхаки

Если вам нужно найти все жесткие ссылки на конкретный файл, воспользуйтесь командой find:

find / -samefile <файл> 2>/dev/null

Чтобы быстро узнать количество имен (ссылок), привязанных к одному inode, используйте утилиту stat:

stat -c %h file

Теперь вы понимаете разницу: используйте жесткие ссылки для предотвращения случайной потери данных, а символические — для удобной навигации и связки файлов между разделами.