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

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

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

"Картинка стоит тысячи слов". Pictorial representation


И еще: "Пример стоит сотни абзацев..."

Создайте два файла:

$ touch blah1   $ touch blah2

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

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

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

$cat blah1; cat blah2CatDog

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

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

Давайте посмотрим, что только что произошло:

$ ls -lblah1blah1-hardblah2blah2-soft -> blah2

Изменение имени blah1 не имеет значения:

$ mv blah1 blah1-new$ cat blah1-hardCat

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

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

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


источник: откровенное копирование его с StackOverflow!

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

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

В Linux/Unix ярлыки известны как Ссылки


Ссылки бывают двух типов: мягкие ссылки (символические ссылки) или жесткие ссылки.

  1. Мягкие ссылки (символические ссылки)

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

    Если реальный копия удалена, ссылка не сработает.

  2. Жесткие ссылки

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

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


Вопрос: Как мне создать мягкую ссылку?

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

 sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib32/libGL.so.1             (----------Source-------)             ( Destination )

enter image description here

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


Вопрос: Как мне создать жесткую ссылку?

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

Допустим, у меня есть сценарий в /script каталог с именем firefox.

 ls -i # Shows you the inode 5898242 firefox ln /scripts/firefox /scripts/on-fire       ( Source )    ( Destination )

enter image description here

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

enter image description here

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


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

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

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

Оба являются указателями на файлы; разница заключается в добрый из указателя. Символическая ссылка указывает на другой файл по имени. У него есть бит специального режима, который идентифицирует его как символическую ссылку, а его содержимое - это имя реального файла. Поскольку он содержит только имя, это имя на самом деле не обязательно должно существовать или может существовать в другой файловой системе. Если вы замените файл с именем (измените его содержимое, не затрагивая его имя), то ссылка по-прежнему будет содержать то же имя, и поэтому теперь она указывает на новый файл. Вы можете легко идентифицировать символическую ссылку и увидеть имя файла, на который она указывает.

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

Вы можете определить, сколько имен имеет файл, из выходных данных ls -l. Первое число после режима файла - это количество ссылок. Файл с более чем 1 ссылкой где-то имеет другое имя (имена), и наоборот, файл с количеством ссылок всего 1 не имеет (других) жестких ссылок.

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

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

В одном из ответов из другой темы (теперь ссылка в верхней части вашего поста) упоминается эта страница что, я думаю, является довольно хорошим объяснением среднего уровня. Если вы заблудились в искусстве ascii, вот версия tl; dr:

  • Стандартные файлы - это указатель из файловой системы на индекс, который, в свою очередь, указывает на физические данные. Файловый компонент хранит свою ссылку на файловую систему (по сути, ее путь) и ссылку на индекс.
  • Жесткие ссылки - это точно так же, как файлы. Они просто дополнительный указатель непосредственно на индекс.
  • Символические ссылки - это отдельные файлы (включая отдельный индекс и данные), в которых хранится путь к файлу в файловой системе.

Задействованные ядро и файловые системы переводят все прозрачно.

Итак, основываясь на этом:

  • Жесткие ссылки разрешают только привязку к одной и той же файловой системе. Символические ссылки могут указывать на любой путь.
  • Жесткие ссылки (по сути) указывают на абсолютные данные. Символические ссылки могут указывать на относительные пути (например ../parent.file)
  • В дополнение, если вы переместите целевой указатель на жесткую ссылку (которая, помните, сама по себе, по сути, является просто жесткой ссылкой, указывающей на индекс), жесткая ссылка все еще работает. Перемещение цели символической ссылки обычно приводит к разрыву символической ссылки.
  • Разрешение жесткой ссылки было бы быстрее, но неизмеримо быстрее. Эта незначительная часть скорости достигается за счет негибкой файловой системы.

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

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

Когда использовать программную ссылку:

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

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

Когда использовать жесткую ссылку:

Место для хранения: Жесткие ссылки занимают очень незначительное количество места, так как при создании жестких ссылок не создаются новые индексные индексы. В soft links мы создаем файл, который занимает много места (обычно 4 КБ, в зависимости от файловой системы).

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

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

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

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

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

Символические ссылки, как объяснялось ранее, просто сообщают вам: "есть файл с именем <targetname> в папке с именем <targetfolder>". Они указывают на жесткую ссылку. Они не знают, где находятся эти данные. Жесткая ссылка знает это.

Это очень просто. Файлы (и каталоги!) Хранятся по адресам на блочном устройстве (жесткий диск или что-то еще). Обычно у вас есть одно имя, сопоставленное с адресом, и именно так вы получаете свой файл. A жесткая ссылка это второе, третье и т.д. Имя, сопоставленное с тем же адресом. A символическая ссылка вместо этого ссылается на символ - имя - и поэтому второе имя сопоставляется с первым именем. Что касается ядра, как только оно считывает целевую символическую ссылку, оно останавливается и возвращается к началу с целевым значением в качестве имени файла (более или менее), поэтому относительные символические ссылки возможны, но совершенно бесполезны. Целевое имя не используется выше уровня файловой системы, за исключением случаев, когда оно явно запрашивается в коде пользовательского пространства.

одно из отличий… у вас есть какой-то файл, например файл test. Если вы создадите жесткую ссылку ln test, создадите символическую ссылку ln -s test, а затем переместите файл test в другой каталог (или переименуете ), символическая ссылка не будет работать. Жесткая ссылка будет работать. Теперь попробуйте удалить тестовый файл. Жесткая ссылка все равно будет работать, фактически вы все равно сможете получить доступ к файлу до тех пор, пока количество жестких ссылок на файл не достигнет 0. Это из-за индексов, это написано вручную…

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

Лучший ответ: MicroNuggets: Hard Links versus Soft Links Explained - YouTube

Также довольно полный ответ: unix - What is the difference between a symbolic link and a hard link? - Stack Overflow

@AbhishekBhatia видео недоступно