В чем разница между жесткими ссылками и скопированными файлами?

22

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

Если это так, зачем мне вообще использовать жесткие ссылки? Почему бы просто не иметь два отдельных файла?

Майк Б
источник

Ответы:

29

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

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

TheMeaningfulEngineer
источник
3
Для очень больших файлов всегда ли создание жесткой ссылки быстрее, чем копирование исходного файла?
Хорхе Букаран
14

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

Питер
источник
4
Спасибо за быстрый ответ. Тогда зачем мне использовать жесткую ссылку вместо мягкой ссылки?
Майк Б
5
Мягкая ссылка - это, в основном, указатель на другой файл. Таким образом, если вы удалите исходный файл, программная ссылка все еще будет существовать, но будет нарушена. Жесткая ссылка - это 2 имени одного и того же файла, поэтому их можно удалить по отдельности.
Питер
19
Объяснение Питера хорошо, но он не учел «количество ссылок». В inode файла (на метаданных диска) есть счетчик ссылок. Жесткая ссылка увеличивает количество ссылок, мягкая ссылка - нет. Ядру разрешено удалять содержимое файла, если количество ссылок падает до нуля.
Брюс Эдигер
4
Я думаю, что ответ Алана на это имеет важный момент: изменение файла изменяет все его жесткие ссылки, с копией они будут иметь разное содержимое.
удачно сделано
6

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

Система ведет подсчет того, сколько жестких ссылок имеет каждый индекс. Когда количество ссылок равно 0, файл больше не может быть достигнут, и данные помечены как безопасные для перезаписи. Таким образом, при наличии файла с 2 жесткими ссылками, если вы удалите любую ссылку, данные не будут удалены. Только если вы удалите оба, данные исчезнут.

Вы можете увидеть номера файлов inode, используя -iпереключатель к lsкоманде.

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

rjmunro
источник
0

Со ссылкой на часть вопроса, которая задала вопрос «зачем мне вообще использовать жесткие ссылки?»:

Файлы с жесткой связью (или, в этом отношении, файлы с мягкой (символической) связью предлагают полезный способ иметь один исполняемый файл, который можно сделать для маскировки для различных целей.

То есть имя, по которому вызывается код, может быть проверено, чтобы определить, какие параметры доступны для выполнения. Это позволяет разрабатывать и упаковывать один большой кусок кода со всеми общими функциями, необходимыми для слегка разных целей. С точки зрения пользователя, спецификация «что» для запуска (по имени) ограничивает выбор и представление более управляемым подмножеством опций.

Классический пример - LVM. В свое время HP-UX используются файлы жестко связаны для различных исполняемых файлов (например vgdisplay, vgcreate, vgextendи т.д. В настоящее время , как Linux, эти команды на самом деле символические (мягкие) ссылки к lvmисполняемым.

JRFerguson
источник
Это не имеет ничего общего с вопросом.
rjmunro
1
@ Rjmunro, я позволю себе не согласиться. ОП спросила: «Зачем мне вообще использовать жесткие ссылки?»
JRFerguson
Я не понимаю последний пример. Когда-то были жесткие ссылки на множество исполняемых файлов, теперь есть софт-ссылки на один исполняемый файл. Как эти мягкие ссылки различимы?
Эмануэль Берг
@EmanuelBerg Моя точка зрения заключалась в том, что независимо от того, используются ли жесткие или программные ссылки, именно имя, по которому вызывается исполняемый файл, определяет параметры и аргументы, действительные для выполнения.
JRFerguson
1
@EmanuelBerg TMTOWTDI
JRFerguson