← Назад к вопросам

Что происходит при удалении hardlink в Linux

2.3 Middle🔥 171 комментариев
#Linux и администрирование

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Механизм работы hardlink и его удаление

При удалении hardlink (жёсткой ссылки) в Linux происходит не прямое удаление данных, а манипуляция с метаданными файловой системы, связанными с inode (индексным дескриптором).

Ключевые концепции

Чтобы понять процесс, нужно разобрать несколько фундаментальных понятий:

  1. Inode — это структура данных в файловой системе, которая хранит метаданные файла (права доступа, владельца, временные метки, тип файла) и указатели на блоки данных на диске, где хранится фактическое содержимое. Важно: имя файла НЕ хранится в inode.
  2. Hardlink — это дополнительное имя (запись в каталоге), которое указывает на тот же самый inode, что и оригинальный файл. Все hardlink'и одного файла равноправны.
  3. Счётчик ссылок (link count) — это поле в структуре inode, которое отслеживает, сколько имён (hardlink'ов) в данный момент указывает на этот inode.

Пошаговый процесс удаления hardlink

Когда вы выполняете команду rm или unlink для hardlink'а, происходит следующее:

  1. Поиск записи в каталоге: Файловая система находит запись с именем удаляемого hardlink'а в родительском каталоге.
  2. Декремент счётчика ссылок: Система уменьшает значение счётчика ссылок (link count) в целевом inode на единицу. Это атомарная операция.
  3. Удаление записи из каталога: Запись (состоящая из имени файла и номера inode) удаляется из списка записей родительского каталога.
  4. Проверка счётчика ссылокнаиболее критичный этап:
    *   **Если счётчик ссылок стал больше 0**: Это означает, что остались другие имена (hardlink'и), указывающие на этот inode. Файловая система **НЕ** трогает ни данные inode, ни сами блоки данных на диске. Файл продолжает существовать и остаётся доступным по другим своим именам.
    *   **Если счётчик ссылок стал равен 0**: Это означает, что больше не существует ни одного имени (записи в каком-либо каталоге), ссылающегося на данный inode. В этом случае:
        *   Файловая система помечает номер этого inode как свободный для последующего переиспользования.
        *   Блоки данных на диске, в которых хранилось содержимое файла, помечаются как свободные (хотя физически данные могут оставаться на месте до тех пор, пока не будут перезаписаны новыми файлами).
        *   **На этом этапе данные файла считаются окончательно удалёнными.**

Пример и демонстрация

Давайте проиллюстрируем это на практике. Создадим файл и hardlink к нему, а затем проследим за состоянием inode.

# 1. Создаём оригинальный файл
echo "Важные данные" > original.txt

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

# 3. Проверяем inode и счётчик ссылок. Оба имени указывают на один inode.
ls -li original.txt hardlink.txt

Пример вывода ls -li:

5898323 -rw-r--r-- 2 user user 14 Apr 10 12:00 hardlink.txt
5898323 -rw-r--r-- 2 user user 14 Apr 10 12:00 original.txt
  • 5898323 — идентичный номер inode для обеих записей.
  • 2 — значение счётчика ссылок (второе поле после прав доступа).
# 4. Удаляем ОДИН из hardlink'ов (в данном случае original.txt)
rm original.txt

# 5. Снова проверяем состояние. Данные всё ещё доступны!
ls -li hardlink.txt
cat hardlink.txt

Вывод ls -li после удаления:

5898323 -rw-r--r-- 1 user user 14 Apr 10 12:00 hardlink.txt
  • Номер inode (5898323) остался прежним.
  • Счётчик ссылок уменьшился с 2 до 1.
  • Содержимое файла (Важные данные) успешно выводится командой cat.
# 6. Удаляем ПОСЛЕДНИЙ hardlink
rm hardlink.txt

# 7. Проверяем. Теперь inode и данные освобождены.
ls -l hardlink.txt  # Файл не найден

После этого шага счётчик ссылок для inode 5898323 достиг нуля, и файловая система освободила этот inode и его блоки данных.

Важные ограничения и следствия

  • Жёсткие ссылки работают только в пределах одной файловой системы (раздела), так как номер inode уникален только в её пределах.
  • Нельзя создать hardlink для каталога (за исключением специальных записей . и ..), чтобы избежать циклических ссылок в дереве файловой системы.
  • Удаление последнего hardlink'а не гарантирует немедленного физического стирания данных с диска — до перезаписи их можно попытаться восстановить специальными утилитами.
  • Процесс удаления, описанный выше, идентичен для "обычного" файла, потому что с точки зрения файловой системы обычный файл — это просто hardlink, у которого счётчик ссылок изначально равен 1.

Таким образом, удаление hardlink — это, по сути, операция удаления одного из имён файла и обновления метаданных inode. Фактическое удаление данных с диска происходит лишь тогда, когда удаляется последнее имя, ссылающееся на inode, и счётчик ссылок обнуляется.

Что происходит при удалении hardlink в Linux | PrepBro