Каково различие между символьными и жесткими ссылками?

Файл

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

Inode

inode (короткий для "индексного узла") является набором атрибутов о файле, который хранит Linux. Существует один inode для каждого файла (хотя с некоторыми файловыми системами, Linux должен создать свой собственный inodes, потому что информация распространена вокруг файловой системы). inode хранит информацию как то, кто владеет файлом, насколько большой файл, и кому разрешают открыть файл. Каждый inode также содержит число, уникальное для раздела файловой системы; это похоже на порядковый номер для файла, описанного этим inode.

Dentry

dentry (короткий для "записи каталога") что использование ядра Linux отслеживать иерархию файлов в каталогах. Каждый dentry отображает inode число на имя файла и родительский каталог.

Суперблок

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

55
18.03.2011, 21:08
10 ответов

Другая семантика между твердым и гибкими ссылками делает их подходящими для разных вещей.

Жесткие ссылки:

  • неотличимый от других записей каталога, потому что каждая запись каталога является жесткой ссылкой
  • "исходный" может быть перемещен или удален, не разрывая другие жесткие связи к тому же inode
  • только возможный в той же файловой системе
  • полномочия должны совпасть с полномочиями на "оригинале" (полномочия хранятся в inode, не записи каталога),
  • может только быть сделан в файлы, не каталоги

Символьные ссылки (гибкие ссылки)

  • просто записи, которые указывают на другой путь к файлу. (ls -l покажет то, что соединяет символьную ссылку каналом точки к),
  • повредится, если исходный перемещен или удален. (В некоторых случаях на самом деле желательно для ссылки указать на любой файл, в настоящее время занимает конкретное местоположение),
  • может указать на файл в другой файловой системе
  • может указать на каталог
  • на некоторых форматах файловой системы для символьной ссылки возможно иметь различные полномочия, чем файл, на который это указывает на (это редко),
40
27.01.2020, 19:33
  • 1
    Хороший список. Просто требуемый, чтобы добавить, что можно также повредить символьную ссылку относительного пути путем перемещения самой символьной ссылки. –  jw013 25.10.2011, 06:50
  • 2
    " [E] очень запись каталога является жесткой ссылкой". Это - точное замечание, которое я никогда не видел выраженный прежде, но я волнуюсь, что кто-то только начинающий переносить его или голову вокруг ссылок не получит его. Для тех, которые в этой ситуации, вот подсказка: расположение файлов и каталогов, которые Вы видите при выполнении команды ls, не является точно тем же самым как системой хранения, которую это представляет. Жесткие ссылки являются ссылками на отдельный файл в системе хранения. Файл хранится однажды. Читайте на "inodes". –  Mario 12.06.2015, 22:32
  • 3
    @Mario: да. Каждая запись каталога связывает имя к inode. Системный вызов удаления имени файла даже называют unlink(2). "нормальные" файлы (с числом каналов 1) являются просто особым случаем. Если это помогает, можно думать о inodes как об объектах, и имена как касательно - считаемые указатели (число каналов inode является подсчетом ссылок). –  Peter Cordes 30.08.2015, 01:53
  • 4
    Вы могли думать о символьной ссылке как о текстовом файле с именем в нем. Это интерпретируется как символьная ссылка из-за специального флага в файл. Примеры жесткой ссылки, которые Вы знаете, .. и .. –  Ned64 30.08.2015, 16:28
  • 5
    здесь является другим ответом, который объясняет, почему жесткие ссылки не могут быть сделаны к каталогам. Я нахожу этот ответ полезным, потому что это более кратко и легче читать. –  Trevor Boyd Smith 02.12.2016, 16:10

Точка обоих типов ссылок должна позволить заставлять файл появиться в двух местах одновременно. Это имеет большое использование. 9 раз из 10 Вы хотите использовать символьные ссылки.

Символьные ссылки или "символьные ссылки" работают немного как ярлыки Windows. Содержание символьной ссылки является указателем на реальное местоположение файла/каталога. При удалении реального файла символьная ссылка станет "свисанием" и не будет работать. Удаление символьной ссылки не удаляет реальный файл. У Вас может быть столько символьных ссылок на единственный файл (или даже другие символьные ссылки), сколько Вам нравится.

В отличие от Windows, хотя, они работают над уровнем файловой системы, не, окружают или прикладной уровень, так же в значительной степени любое приложение будет "следовать" за символьными ссылками как ожидалось. ls -al может использоваться в качестве быстрого способа видеть, где символьные ссылки "указывают" на.

Hardlinks работают даже на более низком уровне. hardlink является фактической, физической on-the-filesystem-level записью каталога файла. Технически, запись каталога является hardlink, таким образом каждый файл имеет по крайней мере один hardlink в каталоге где-нибудь. Hardlinks не являются отдельными из файла, на который они указывают; если файл имеет несколько hardlinks в различных каталогах, удаляя hardlink с утилитами как rm действительно не удалит файл, пока всех hardlinks не не стало.

Я не могу думать о ситуации, где использование hardlinks является общим, или даже необходимое, если Вы намеренно не хотите препятствовать файлам то, чтобы быть удаленным или делаете некоторую странную работу низкого уровня с разделами или другими связанными с файловой системой вещами.Править: Существуют прекрасные идеи в других ответах на этот вопрос, хотя!

18
27.01.2020, 19:33
  • 1
    Кроме того, символьные ссылки имеют полномочия как нормальные файлы, но операционная система не консультируется с ними, она консультируется, полномочия предназначались для файла вместо этого для решения поведения. И, не делайте круговых цепочек символьных ссылок. Очень плохо. –  LawrenceC 18.03.2011, 21:01
  • 2
    Это действительно очень плохо? Что произойдет? Большая часть волнения, которое я могу воссоздать, является "Слишком многими уровнями символьных ссылок" сообщения об ошибках. –  mattdm 18.03.2011, 21:05
  • 3
    ls -l достаточно должен видеть то, что связывается символьной ссылкой, a обозначает --all, см. страницу справочника. И даже если работа символьных ссылок над файловой системой, существуют альтернативные функции для использования символьных ссылок в качестве файлов вместо, следуют. –  D4RIO 18.03.2011, 21:37
  • 4
    Windows на самом деле очень отличаются от символьных ссылок: они следуют за своей целью, и они - также регулярные файлы. (Windows также имеет символьные ссылки, но они не используются очень.) Символьные ссылки являются чисто текстовыми, целевой текст прочитан каждый раз, когда Вы получаете доступ к файлу. Зависит ли вопрос полномочий символьной ссылки от ОС и файловой системы. –  Gilles 'SO- stop being evil' 18.03.2011, 22:04
  • 5
    AFAIK, содержание файла символьной ссылки является путем, на который указывает символьная ссылка, который виден при рассмотрении размера файла символьной ссылки: ln -s /home 1; ls -l 1 шоу, что символьная ссылка 1 5 байтов длиной, тогда как ln -s /usr/share/ 2; ls -l 2 showas, что 2 11 байтов длиной. –  daniel kullmann 20.01.2012, 19:48

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

13
27.01.2020, 19:33
  • 1
    Возможно, механизмы управления дисковой версии? Если Вы hardlink что-то, то это не резервное копирование. Если исходный файл повреждается, каждый hardlink к нему повреждается также. –  D4RIO 18.03.2011, 21:04
  • 2
    Думайте о системах инкрементного резервного копирования как Машина времени Apple. (Должно быть очевидно, что это не резервные копии типа аварийного восстановления, но "ой, я удалил тот файл случайно" резервные копии.) Все неизменные файлы в инкрементном резервном копировании являются hardlinked вместе; когда файл изменяется, следующие возрастающие копии это вместо того, чтобы связаться с предыдущей версией. –  geekosaur 18.03.2011, 21:09
  • 3
    Спасибо, затем системы инкрементного резервного копирования являются довольно аналогичными системам управления версиями этот путь =D –  D4RIO 18.03.2011, 21:22
  • 4
    Но как механизм инкрементного резервного копирования сохраняет "старую" версию файла? Созданный 1) Скопируйте созданный, это hardlinked файл F; 2) Файл F изменяется; 3) на следующий день Резервное копирование B созданный... Похож я не получаю что-то –  Dmitry Pashkevich 01.03.2013, 18:00

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

С жесткой ссылкой у Вас есть один файл с несколькими именами. Вы не можете сказать, что один из тех является "реальным" файлом, и другие - просто ссылка на него. Они все равны. Нет такой вещи как разорванная жесткая связь пути, там поврежденные символьные ссылки.

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

Другая большая разница - то, что происходит, когда Вы удаляете связанный файл. Если Вы удалите одну из пары hardlinked файлов, то создадите новый файл с тем же именем, то у Вас будет два отдельных файла (ссылки не стало). Если Вы удалите цель символьной ссылки и создадите новый файл с тем же именем, то ссылка укажет на новый файл.

4
27.01.2020, 19:33

Жесткие ссылки являются просто ссылками на те же дисковые пространства, thath, 'почему' Вы не можете hardlink что-то в другой файловой системе.

Символьные ссылки являются файлами, связывающими другие файлы (как ярлыки Windows), возможно, в той же файловой системе, возможно, нет.

Править: Я объясню что-то больше. Каждый файл, который существует, имеет минимум 1 жесткой ссылки. Жесткие ссылки являются способом получить доступ к содержанию inode файловой системы. Можно получить inode количество файла с ls -i, и получите количество hardlinks с stat следующим образом в этом примере:

$ stat plantilla-disenos.odt 
  File: «plantilla-disenos.odt»
  Size: 12367       Blocks: 32         IO Block: 4096   fichero regular
Device: 803h/2051d  Inode: 319875      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/   d4rio)   Gid: ( 1000/   d4rio)
Access: 2011-02-11 21:36:19.000000000 -0300
Modify: 2010-03-02 23:27:28.000000000 -0300
Change: 2010-04-10 17:46:27.000000000 -0300

Спасибо @geekosaur для этой ссылки:

Ядро должно перезапустить pathname-to-inode перевод (пересекающий дерево каталогов) для расширения символьных ссылок, тогда как жесткие ссылки все использование тот же inode. (Вы будете часто видеть это называемое namei с названия функции ядра, которая сделала это в традиционном Unix.)

и (отредактированный):

Жесткие ссылки очень полезны для находящихся на диске механизмов инкрементного резервного копирования как Машина времени Apple, потому что у Вас может быть полное дерево каталогов для каждого резервного копирования при совместном использовании пространства для файлов, которые не изменились — и файловая система отслеживает подсчет ссылок, поэтому когда последняя ссылка на данную версию уходит, потому что резервное копирование истеклось/удалилось по причинам пространства, пространство, которое это использовало, автоматически освобождено. Некоторые почтовые клиенты также используют его для сообщений, зарегистрированных нескольким папкам по той же причине.

Удачи

3
27.01.2020, 19:33
  • 1
    Выигрыши в производительности к использованию жестких ссылок? Или, почему Вы когда-либо использовали бы жесткую ссылку вместо символьной ссылки? –  ripper234 18.03.2011, 20:52
  • 2
    Ядро должно перезапустить pathname-to-inode перевод (пересекающий дерево каталогов) для расширения символьных ссылок, тогда как жесткие ссылки все использование тот же inode. (Вы будете часто видеть это называемое как namei, с названия функции ядра, которая сделала это в традиционном Unix.) –  geekosaur 18.03.2011, 20:57
  • 3
    @ripper234: Hardlinks являются сохраняющими дисковое пространство решениями. Вы не должны знать о файловой системе для создания символьной ссылки, но необходимо думать прежде, чем создать символьные ссылки, потому что можно создать цикл или длинный путь разрешения, так функции как stat перестанет работать. –  D4RIO 18.03.2011, 21:12
  • 4
    @geekosaur: я добавляю Ваш ответ на мой, так как это очень полезно –  D4RIO 18.03.2011, 21:16
  • 5
    Без проблем. Я на самом деле начал писать это как комментарий к Вашему, но комментарии слишком коротки. –  geekosaur 18.03.2011, 21:18

Жесткая ссылка сохранит файл на диске до всех жестких ссылок на него, даже первое ("имя файла" является технически жесткой ссылкой), были удалены. Гибкую ссылку можно оставить, "свиснув" до файла, на который она указывает (s/ed) к заменяется.

0
27.01.2020, 19:33

"твердые" ссылки совместно используют тот же inode

$ touch foo
$ ln foo foolink # Creates a hard  link
$ ls -li foo foolink
54996 -rw-r--r-- 2 bsd users 0 2011-12-11 09:06 foo
54996 -rw-r--r-- 2 bsd users 0 2011-12-11 09:06 foolink

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

$ rm foo
$ ls -li foo foolink
ls: cannot access foo: No such file or directory
54996 -rw-r--r-- 1 bsd users 0 2011-12-11 09:06 foolink

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

$ touch foo
$ ln -s foo foolink # Create symlink
$ ls -li foo foolink
55029 -rw-r--r-- 1 bsd users 0 2011-12-11 09:11 foo
55033 lrwxrwxrwx 1 bsd users 3 2011-12-11 09:11 foolink -> foo

Если я редактирую или нечто или дурачащий существует все еще только один файл, и это будет обновлено.

Если я удалю только символьную ссылку, то inode и данные сохранятся. Если я удалю нечто, то данные закончатся, символьная ссылка сохранится, но укажет на несуществующий файл.

$ rm foo
removed `foo'
$ ls -l foo foolink 
ls: cannot access foo: No such file or directory
lrwxrwxrwx 1 bsd bsd 3 2011-12-11 09:11 foolink -> foo
3
27.01.2020, 19:33
  • 1
    Но что такое практический пример использования для этого? –  ewwhite 11.12.2011, 17:10
  • 2
    Одно использование, то же как "короткий путь", Другое использование, наличие нескольких версий приложения в системе позволяет устанавливать, тестировать новую версию, указывая приложение полным путем, в то время как символьная ссылка в мусорном ведре указывает на производство. После того, как тестирование является полной символьной ссылкой изменения на новую версию, оставьте старую версию на месте для любых пользователей, которые имеют зависимый код версии. Думайте о жемчуге, Python, и т.д. –  bsd 11.12.2011, 18:16
  • 3
    практический пример использования для жестких ссылок. В настоящее время в моей файловой системе я нашел, что большое количество hardlinks в/usr/share/zoneinfo Думает обо всех именованных файлах, представляющих часовые пояса, которые все идентичны EST. Мы оставляем свободное место файловой системы, не имея избыточные копии и допускаем более легкое управление пакетом, не имея управления наверху символьными ссылками, устанавливают/удаляют, как пакеты установлены/удалены. Даже если Вы удалены, исходные данные сохраняются. Извините у меня не было времени для более педантичного объяснения. –  bsd 11.12.2011, 18:30

Жесткие ссылки - это дополнительные записи каталога для того же файла. Это означает

  • , что все жесткие ссылки на файл должны находиться в одной файловой системе (поскольку запись каталога не может указывать на файл в другой файловой системе), но не обязательно в одном каталоге.
  • Нет никакой разницы между исходной записью каталога и новой жесткой ссылкой; с точки зрения операционной системы, это всего лишь две записи в каталоге одного и того же файла. Файл удаляется только в том случае, если все жестких ссылок удалены (и, кроме того, не остается процесса, в котором этот файл все еще открыт).
  • Если вы переместите / переименуете «оригинал», если вы не переместите его в другую файловую систему, другие жесткие ссылки не будут затронуты; они по-прежнему указывают на один и тот же файл.
  • Многие редакторы не записывают новое содержимое в тот же файл при сохранении, а вместо этого выполняют следующую процедуру:

    1. Записывают новое содержимое в новый файл.
    2. Переименуйте старый файл в имя резервной копии (или, если не сохраняете резервную копию предыдущей версии файла, просто удалите ее).
    3. Переименуйте вновь записанный файл в имя предыдущего файла.

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

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

Символические ссылки, с другой стороны, хранят путь к файлу (имя файла - или, скорее, его запись в каталоге - потенциально включая его путь, например / bin / sh или subdir / foo.bar ) - другого файла. Если путь является относительным, он всегда интерпретируется относительно каталога, в котором содержится ссылка. Это означает:

  • Символьная ссылка может относиться к файлам в другой файловой системе (даже к файловой системе, которая сама не поддерживает жесткую или мягкие ссылки, такие как FAT).

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

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

  • Если исходный файл заменяется новым файлом с тем же именем (как в сценарии редактора, описанном выше), ссылка ссылается на новый файл.

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

Обычно, если вам нужна ссылка, вы используете символическую ссылку. Один из примеров: когда вы перемещаете каталог в другой раздел (потому что тот, в котором он находится, заполняется), вы можете установить мягкую ссылку со старой позиции на новую, так что любые программы, пытающиеся получить доступ к каталогу в старом месте, будут вместо этого получите доступ к нему на новом месте. Это было бы невозможно с жесткими ссылками. Однако имейте в виду, что символические ссылки в перемещенном каталоге могут разорваться, если они содержат относительные пути, ведущие из перемещенного каталога.

1
27.01.2020, 19:33

HARD LINK (только файлы) vs SOFT LINK (файлы или каталоги) vs BIND (HARD LINK для каталогов)

VIEW THIS IMAGE BEFORE READING POST
(источник: freesoftwareservers.com )

Хотя ответ daxelrod объясняет вопрос ну, я подумал, что картина в этом случае имеет большое значение, особенно для новичков, которые еще не понимают inodes и сложный жаргон Linux.

Подумайте об этом: если вы «удалили» все со своего диска, вы можете запустить программное обеспечение для восстановления данных, потому что 1 и 0 все еще там, вы просто удалили все жесткие ссылки. Цель Recovery Software - восстановить жесткие ссылки, чтобы разобраться в нулях и единицах

. Я прочитал отличный «один лайнер», в котором все это имеет смысл, и я хотел поделиться!

Все файлы в Linux являются «жесткими ссылками» на 0 и 1 на диске. Когда вы создаете данные (0 и 1), ОС создает жесткую ссылку в дереве файлов для ссылки на это место на жестком диске.

Создать HARD LINK 2 и удалить HARD LINK 1 Исходный файл :

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

Удалить ФАЙЛ (ЖЕСТКАЯ ССЫЛКА 1), с которым МЯГКАЯ ССЫЛКА связана:

Если вы удалили ЖЕСТкую ССЫЛКУ 1, как вы думаете, МЯГКАЯ ССЫЛКА будет работать? Нет, ОС сообщит, что HARD LINK 1 не существует.

Удалить SOFT LINK на HARD LINK:

И наоборот, если вы удалите SOFT LINK, будет ли работать либо HARD LINK? Да. Пока в ОС есть один файл HARD LINK , он сообщит, что заливка не была удалена.

- Также стоит изучить / отметить BIND, способ BIND двух каталогов, такой как символическое связывание двух каталогов, но он прозрачен для ОС (ОС могут определить, когда вы используете Symlink, а у некоторых есть правила, касающиеся погоды, они могут следовать Symlinks). Он использует Mount, а не LS, и его можно настроить через FSTAB.

Что такое крепление BIND

1
27.01.2020, 19:33

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

Я музыкант, поэтому у меня много-много-много аудиофайлов разного типа на нескольких жестких дисках, подключенных к моему Mac. Стоит терабайт. У меня они в основном очень хорошо организованы с каталогами символических ссылок, так что я могу найти их по издателю контента, стилю / звуку и другим критериям, в зависимости от того, как я думаю в то время. К сожалению, одна программа, которую я использую, Ableton Live, полностью неспособна просматривать псевдонимы или символические ссылки из своего файлового браузера. Единственное решение, которое я нашел, - это создать жесткие ссылки на каталоги, которые я хочу, чтобы он мог видеть, и тогда все будет отлично работать.

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

0
20.08.2021, 13:37

Теги

Похожие вопросы