Hard link vs Soft link: Не ярлык, а целая философия ссылок в Linux
Новички в мире 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
Теперь вы понимаете разницу: используйте жесткие ссылки для предотвращения случайной потери данных, а символические — для удобной навигации и связки файлов между разделами.