В чем разница между символической и жесткой связью?

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

22 ответов


под файлами файловой системы представлены inodes (или это несколько inodes не уверены)

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

при удалении файла он удаляет одну ссылку на базовый индекс. Индекс удаляется (или удаляется / перезаписывается) только тогда, когда все ссылки на индекс были удалены.

символическая ссылка-это ссылка на другое имя в файловой системе.

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

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


хорошая интуиция, которая может помочь, используя любую консоль Linux(ish).

создать два файла:

$ touch blah1; touch blah2

введите в них некоторые данные:

$ echo "Cat" > blah1
$ echo "Dog" > blah2

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

и как и ожидалось:

$cat blah1; cat blah2
Cat
Dog

давайте создадим жесткие и мягкие ссылки:

$ ln blah1 blah1-hard
$ ln -s blah2 blah2-soft

давайте посмотрим, что это просто случилось:

$ ls -l

blah1
blah1-hard
blah2
blah2-soft -> blah2

изменение имени blah1 не важно:

$ mv blah1 blah1-new
$ cat blah1-hard
Cat

blah1-жесткие точки к индексу, содержимому, файла - это не было изменено.

$ mv blah2 blah2-new
$ ls blah2-soft
blah2-soft
$ cat blah2-soft  
cat: blah2-soft: No such file or directory

содержимое файла не удалось найти, потому что мягкая ссылка указывает на имя, которое было изменено, а не на содержимое. Аналогично, если blah1 удален, blah1-hard все еще содержит содержимое; если blah2 удален, blah2-soft-это просто ссылка на несуществующий файл.


enter image description here

вот как мы доберемся до этой картины:

  1. создать имя myfile.txt в файловой системе, которая указывает на новый индекс (который содержит метаданные для файла и указывает на блоки данных, содержащие его содержимое, т. е. текст "Hello, World!":

    $ echo 'Hello, World!' > myfile.txt
    
  2. создать жесткую ссылку my-hard-link в файл myfile.txt, что означает "создать файл, который должен указывать на тот же inode, который myfile.txt указывает на":

    $ ln myfile.txt my-hard-link
    
  3. создать мягкую ссылку my-soft-link в файле myfile.txt, что означает "создать файл, который должен указывать на файл myfile.txt":

    $ ln -s myfile.txt my-soft-link
    

посмотрите, что теперь произойдет, если myfile.txt удалены (или перемещены): my-hard-link по-прежнему указывает на то же содержание и, таким образом, не влияет, тогда как my-soft-link теперь ничего не указывает. Другие ответы обсуждают плюсы и минусы каждого.


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

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

жесткие ссылки занимают меньше время для разрешения-символические ссылки могут указывать на другие символические ссылки, которые находятся в символических каталогах. И некоторые из них могут быть на NFS или других файловых системах с высокой задержкой, и поэтому могут привести к разрешению сетевого трафика. Жесткие ссылки, всегда находящиеся в одной и той же файловой системе, всегда разрешаются в одном поиске и никогда не включают сетевую задержку (если это жесткая ссылка в файловой системе NFS, сервер NFS будет выполнять разрешение, и это будет невидимо для клиентской системы). Иногда это важно. Не для меня, но я могу представить высокопроизводительные системы, где это может быть важно.

Я также думаю, что такие вещи, как mmap(2) и даже open(2), используют ту же функциональность, что и жесткие ссылки, чтобы поддерживать индекс файла активным, так что даже если файл получает unlink(2)ed, индекс остается, чтобы процесс продолжал доступ, и только после того, как процесс закрывается, файл действительно уходит. Это позволяет гораздо безопаснее временные файлы (если вы можете получить открыть и разорвать связь, чтобы произойти атомарно, что для этого может быть API POSIX, который я не помню, тогда у вас действительно есть безопасный временный файл), где вы можете читать/писать свои данные без доступа к ним. Ну, это было верно до того, как /proc дал всем возможность посмотреть ваши файловые дескрипторы, но это другая история.

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


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

Итак, если у нас есть файл под названием " a "и создать жесткую ссылку" b "и символическую ссылку" c", которые все относятся к файлу" a":

echo "111" > a
ln a b
ln -s a c

выходные данные "a", "b" и " c " будут :

cat a --> 111
cat b --> 111
cat c --> 111

Теперь удалим файл " a "и посмотрим, что произойдет с выводами" a"," b "и"c":

rm a
cat a --> No such file or directory
cat b --> 111
cat c --> No such file or directory

Так что случилось?

потому что файл " c "указывает на сам файл "a", если файл" a "удаляется, то файл" c " не будет иметь ничего, чтобы указать, на самом деле он также удаляется.

однако файл " b "указывает на место хранения или индекс файла"a". Поэтому, если файл "a" удален, он больше не будет указывать на индекс, но поскольку файл "b" делает, индекс будет продолжаться хранить содержимое, принадлежащее "а", до тех пор, пока на него больше не укажут жесткие ссылки.


Мягкая Ссылке:

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

синтаксис мягкой ссылки: ln -s Pathof_Target_file link

выход : link -> ./Target_file

доказательство: readlink link Также в ls -l link выход вы увидите первую букву в lrwxrwxrwx as l что указывает на то, что файл является мягкой ссылкой.

удаление ссылки: unlink link

Примечание: если вы хотите, ваш softlink может работать даже после перемещения его в другое место из текущего реж. Убедитесь, что вы даете абсолютный путь, а не относительный путь при создании мягкой ссылки. т. е. (начиная с /root/user/Target_file и не ./Target_file)

жесткий Ссылка:

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

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

после создания жесткой ссылки ССЫЛКА имеет индекс исходного файла. Удаление переименования или перемещение исходного файла не повлияет на жесткие ссылки как ссылки на иноде. Любые изменения данных в индексе отражаются во всех файлах, ссылающихся на этот индекс.

синтаксис жесткой ссылки: ln Target_file link

выход: файл с именем link будет создан с тем же номером индекса, что и Targetfile.

доказательство: ls -i link Target_file (проверьте их inodes)

удаление ссылки: rm -f link (удалить ссылку как обычный файл)

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

символические ссылки имеют некоторые особенности жесткие ссылки не хватает:

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

причина, по которой жесткие ссылки не могут пересекать файловые системы или разделы:

на жестком диске много секторов.

скажем, файл начинается с inode (сектор) 4001 и заканчивается на 5000. Файл " / export / home/john / mail.doc"

затем: 1. Жесткая ссылка на " mail.doc", который называется "hardLinkToMail", содержит значение: "4001". 2. Мягкая ссылка на " mail.doc", который называется "softLinkToMail", содержит значение: "/ export/home/john / mail.доктор."

в 1) жесткая ссылка может указывать только на тот же диск. Он нельзя указывать на другой диск. Все диски имеют индекс значения "4001", как жесткая связь может различать все диски? Какой диск "4001"?

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


символические ссылки Ссылка на путь. Это может быть где угодно в дереве файлов системы и даже не должно существовать при создании ссылки. Конечный путь может быть относительным или абсолютным.

жесткие ссылки являются дополнительными указателями на индекс, то есть они могут существовать только на том же томе, что и цель. Дополнительные жесткие ссылки на файл неотличимы от" исходного " имени, используемого для ссылки на файл.


Я бы указал вам на Википедию:

несколько моментов:

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

жесткие ссылки очень полезны при выполнении инкрементных резервных копий. См.rsnapshot, например. Идея состоит в том, чтобы сделать копию с помощью жестких ссылок:

  • скопируйте номер резервной копии n в n + 1
  • копировать резервную копию n-1 в n
  • ...
  • копировать резервную копию 0 в резервную копию 1
  • обновить резервную копию 0 с любыми измененными файлами.

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


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

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

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

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

некоторая информация об индексе:

Linux хранит административные данные о файлах в inodes. Каждый файл в Linux имеет inode, а в inode хранится важная информация о файле:

  1. блок данных, в котором находится содержимое файла хранится
  2. дата создания, доступа и изменения
  3. разрешения
  4. владельцы файлом

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


Я добавляю на вопрос Ника: когда жесткие ссылки полезно или необходимо? Единственное приложение, которое приходит мне на ум, в котором символические ссылки не будут выполнять эту работу, - это предоставление копии системного файла в chrooted среде.


также:

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

то, что вы думаете как обычный "файл", на самом деле две отдельные вещи: данные файла и запись в каталоге. Когда вы создаете жесткую ссылку для файла, вы фактически создаете вторую запись каталога, которая ссылается на те же данные. Обе записи каталога имеют одинаковую функциональность; каждая из них может быть использована для открытия файла для его чтения. Таким образом, у вас действительно нет "файла плюс жесткая ссылка", у вас есть "файловые данные с двумя записями каталога". Что вы думаете об удалении файла на самом деле удаляет запись каталога, а при удалении последней записи каталога для данных удаляются и сами данные. Для обычных файлов, которые имеют только одну запись каталога, удаление каталога удаление данных, как всегда. (Во время открытия файла ОС создает временную ссылку на файл, поэтому даже при удалении всех записей каталога данные остаются, но исчезают, как только вы закрываете файл).

в качестве примера создайте файл A.txt, жесткая связь B.txt, и удалить A.txt - ... Когда вы создали A.txt, некоторые данные были созданы, и запись каталога A.txt - ... Когда вы создали жесткую ссылку, другая запись каталога B.txt был создан, указывая на те же самые данные. При удалении A.txt, у вас все еще есть все данные и одна запись в каталоге B.txt, точно так же, как если бы вы создали файл B.txt во-первых.

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


Hard link vs Soft link

Hard link Vs Soft link можно легко объяснить этим изображением.


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

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


С MSDN,

символическую ссылку

символическая ссылка-это объект файловой системы, который указывает на другой объект файловой системы. Объект, на который указывают, называется целью.

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

символические ссылки предназначены для помощь в миграции и применении совместимость с операционными системами UNIX. Microsoft реализовала его символические ссылки функционируют так же, как ссылки UNIX.

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

пример абсолютной символики Ссылка

X: "C:\alpha\beta\absLink\gamma\file"
Link: "absLink" maps to "\machineB\share"
Modified Path: "\machineB\share\gamma\file"

пример относительных символических ссылок

X: C:\alpha\beta\link\gamma\file
Link: "link" maps to "..\..\theta"
Modified Path: "C:\alpha\beta\..\..\theta\gamma\file"
Final Path: "C:\theta\gamma\file"

ссылка

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

чтобы создать жесткую ссылку в windows, перейдите туда, где ссылка должна быть создана и введите это команда:

mklink /H Link_name target_path

обратите внимание, что вы можете удалить жесткие ссылки в любом порядке, независимо от того, в каком порядке они были созданы. Кроме того, жесткие ссылки не могут быть созданы, когда

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

перекрестке

NTFS поддерживает другой тип соединения, называемый junction. MSDN определяет его следующим образом:

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

полужирные части в разделе жесткого соединения и разделе соединения показывают основную разницу между этими двумя.

команда для создания соединения в windows, перейдите к где ссылка должна быть создана, а затем введите:

mklink /J link_name target_path

запись каталога-это ссылка на structrue:

struct dentry{
    ino_t ino;
    char  name[256];
}

ino-это номер индекса, имя-имя файла, структура индекса, возможно, как:

struct inode{
      link_t nlink; 
      ...
}

например, вы создаете файл /1, запись в каталоге может выглядеть так:

struct dentry{
     ino_t ino; /* such as 15 */
     char  name[256]; /* "1" */
} 

структура inode может быть, как:

   struct inode{ /* inode number 15 */
         link_t nlink; /* nlink = 1 */
         ...
    }

затем вы создаете жесткую ссылку(может быть /100), запись в каталоге может быть как:

  struct dentry{
     ino_t ino; /* 15 */
     char  name[256]; /* 100 */
  }

структура inode может быть например:

   struct inode{ /* inode numebr 15 */
         link_t nlink; /* nlink = 2 */
         ...
    }

затем вы создаете символическую ссылку (может быть /200) на файл 1, запись в каталоге может быть как:

  struct dentry{
        ino_t ino; /* such as 16 */
        char  name[256]; /* "200" */
  }

структура inode может быть, как:

   struct inode{ /* inode number 15 */ 
         link_t nlink; /* nlink = 2 */
         ...
    }

   struct inode{ /* inode number 16 */
         link_t nlink; /* nlink = 1 */
         ...
    } /* the data of inode 16 maybe /1 or 1 */

добавление ко всем вышеперечисленным ответам, разница в поиске файла hardlink и softlink можно понять, как показано ниже:

у меня есть файл f6 в моем текущем каталоге, а также в каталоге с именем t2.

файл с именем f1 и ./t2/f2 являются символическими ссылками на f6.

файл с именем f7 и ./t2/f8 жесткие ссылки f6.

чтобы найти мягкую, а также жесткую ссылку, мы можем использовать:

$ find -L . -samefile f6 

> ./f1
> ./f6
> ./f7
> ./t2/f2
> ./t2/f8

для найти только hardlink мы можем использовать:

$ find . -xdev -samefile f6

> ./f6
> ./f7
> ./t2/f8

поскольку жесткие ссылки могут быть созданы в одной файловой системе, мы можем искать все жесткие ссылки без используется (с -xdev option) в той же файловой системе/точке монтирования. Это экономит ненужный поиск в разных точках монтирования.

поэтому поиск по hardlink несколько быстрее, чем поиск по softlinks (пожалуйста, исправьте, если я ошибаюсь или не ясно).


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


Я только что нашел простой способ понять, жесткие связи в общем случае, установка программного обеспечения.

однажды я загрузил программное обеспечение в папку Downloads для установки. После того как я сделал sudo make install некоторые файлы cped в локальную папку bin. Вот,cp создает ссылка. Я был счастлив, но вскоре понял, что Downloads не очень хорошее место в долгосрочной перспективе. Так Что Я mved папку программного обеспечения в . Ну, я могу по-прежнему запускайте программное обеспечение, как и раньше, не беспокоясь о каких-либо целевых ссылках, как в Windows. Это значит ссылка находит inode непосредственно и другие файлы вокруг.


в этом ответе, когда я говорю файл, я имею в виду местоположение в памяти

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

символическая link-это особый вид файла.Поскольку это также файл, он будет иметь имя файла и номер индекса.Как сказано выше, номер индекса присоединяется к индексу, который указывает на данные.Теперь, что делает символическую ссылку особенной, так это то, что номера inodenumbers в символических ссылках обращаются к тем индексам, которые указывают на "путь" к другому файлу.Более конкретно номер индекса в символической ссылке присоединяется к тем индексам, которые указывают на другую жесткую ссылку.

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


мои два цента на использование:

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

ln -s /long/folder/name/on/long/path/file.txt /short/file.txt

изменения /short/file.txt будет применен к исходному файлу.

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

$ ls -lh /myapp/dev/
total 10G
-rw-r--r-- 2 root root 10G May 22 12:09 application.bin

ln /myapp/dev/application.bin /myapp/prd/application.bin

мгновенное копирование в другую папку и исходный файл (on /myapp/dev) может быть перемещен или удален, не касаясь файла на /myapp/prd