Что происходит, когда вы удаляете жесткую ссылку?

Ответы:

110

В Unix все обычные файлы являются жесткими ссылками. Жесткие ссылки в файловой системе Unix (и в большинстве (всех?)) Являются ссылками на то, что называется inode. Он inodeимеет счетчик ссылок, когда у вас есть одна «ссылка» на файл (что является нормальным способом действия), счетчик равен 1. Когда вы создаете вторую, третью, четвертую и т. Д. Ссылку, счетчик увеличивается (увеличивается) каждый время один При удалении ( rm) ссылки счетчик уменьшается (уменьшается) на единицу. Если счетчик ссылок достигает 0, файловая система удаляет inodeи помечает пространство как доступное для использования.

Короче говоря, до тех пор, пока вы не удалите последнюю ссылку, файл останется.

Edit:Файл останется, даже если последняя ссылка будет удалена . Это один из способов обеспечения безопасности данных, содержащихся в файле, недоступных для любого другого процесса. Полное удаление данных из файловой системы выполняется только в том случае, если данные имеют 0 ссылок на них, как указано в их метаданных, и не используются каким-либо процессом.

Это IMHO, безусловно, самый простой способ понять жесткие ссылки (и их отличие от мягких ссылок).

xenoterracide
источник
7
Более того, системный вызов для удаления файла есть unlink().
Mouviciel
1
Это не распространяется на ситуацию, когда файл открыт при редактировании последней ссылки unlink.
CJM
5
@OrangeDog, не совсем, потому что жесткие ссылки не могут пересекать файловые системы и /procпредставляют собой отдельную (виртуальную) файловую систему.
CJM
2
/ proc также отражает внутренние структуры данных ядра (это позволяет ядру Linux предоставлять определенные данные в достаточно четко определенном формате, не предоставляя всем и каждый раз прямой доступ к памяти ядра). Поэтому точнее будет сказать, что ядро ​​отслеживает тот факт, что файл открыт, и предоставляет эту информацию через procfs.
CVn
1
И да, призыв unlink()к удалению файла не давал мне покоя, когда я начал играть с программированием на C на MS-DOS некоторое время назад в первой половине 1990-х годов. :)
CVN
12

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

trusktr
источник
1
это правда, но не полная картина
ксенотеррацид
3
Ключ заключается в том, что создание текстового файла также добавляет жесткую ссылку. В файловых системах * NIX все файлы (inode) должны быть хотя бы один раз жестко связаны в структуру каталогов.
Стоп Harm Monica
0

все файлы на вашем диске на самом деле являются указателями на реальные данные на вашем диске. введите описание изображения здесь

когда вы создаете жесткую ссылку для этого файла, файл с жесткой ссылкой будет указывать на те же данные, на которые указывал исходный файл.

введите описание изображения здесь

Как и в этом примере, a.txt указывал на данные (байты) файла, находящегося на диске, когда создается жесткая ссылка b.txt, он указывает на то, на что указывал a.txt.

таким образом, удаление одного из них не повлияет на другое, они отделены друг от друга.

НО, когда вы удалите их оба, система увидит, что данные на диске не имеют файла, указывающего на него, поэтому система будет рассматривать их как свободное место и перезапишет их, когда захочет.

ZOLDIK
источник
2
Я думаю, что важно, чтобы вы пояснили, что FILE "A.txt"идентично тому LINK "B.txt", что вы назвали один a, FILEа другой a LINK. Ссылка действительно черная стрелка.
Ройма
да, я думал, что не будет ясно, что b.txt - это жесткий связанный файл ...
ZOLDIK