Что происходит при удалении hardlink в Linux
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Механизм работы hardlink и его удаление
При удалении hardlink (жёсткой ссылки) в Linux происходит не прямое удаление данных, а манипуляция с метаданными файловой системы, связанными с inode (индексным дескриптором).
Ключевые концепции
Чтобы понять процесс, нужно разобрать несколько фундаментальных понятий:
- Inode — это структура данных в файловой системе, которая хранит метаданные файла (права доступа, владельца, временные метки, тип файла) и указатели на блоки данных на диске, где хранится фактическое содержимое. Важно: имя файла НЕ хранится в inode.
- Hardlink — это дополнительное имя (запись в каталоге), которое указывает на тот же самый inode, что и оригинальный файл. Все hardlink'и одного файла равноправны.
- Счётчик ссылок (link count) — это поле в структуре inode, которое отслеживает, сколько имён (hardlink'ов) в данный момент указывает на этот inode.
Пошаговый процесс удаления hardlink
Когда вы выполняете команду rm или unlink для hardlink'а, происходит следующее:
- Поиск записи в каталоге: Файловая система находит запись с именем удаляемого hardlink'а в родительском каталоге.
- Декремент счётчика ссылок: Система уменьшает значение счётчика ссылок (link count) в целевом inode на единицу. Это атомарная операция.
- Удаление записи из каталога: Запись (состоящая из имени файла и номера inode) удаляется из списка записей родительского каталога.
- Проверка счётчика ссылок — наиболее критичный этап:
* **Если счётчик ссылок стал больше 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, и счётчик ссылок обнуляется.