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


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

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


444
2018-02-29 09:03


Источник


одна из отличий ... у вас есть файл, например, файл test. Если вы проверите жесткую ссылку, сделайте ln -s test symlink, а затем переместите проверку файла на другой каталог (или переименуйте), symlink не будет работать. Hardlink будет работать. Теперь попробуйте удалить проверку файла. Hardlink все равно будет работать, на самом деле вы все равно сможете получить доступ к файлу до тех пор, пока количество жестких ссылок на файл не будет 0. То, что из-за inodes, оно написано вручную ... - Denwerko
Я возобновил это, потому что он заслуживает хорошего общего ответа по этому вопросу (в отличие от предыдущего вопроса, который был неясным примером). - Oli♦
Лучший ответ: youtube.com/watch?v=aO0OkNxDJ3c - Abhishek Bhatia
Также довольно полный ответ: stackoverflow.com/questions/185899/... - Elzo Valugi
@AbhishekBhatia видео недоступно - Ooker


Ответы:


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


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

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

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

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

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

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

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


Вопрос: Как сделать софт ссылку?

Ответ: Мягкую связь можно выполнить с помощью 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 балл) если источник удален, ссылка не будет работать.


28
2018-05-09 00:42





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

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


312
2018-05-18 09:51



Вещь, которая (по собственным словам) "указывает на файл"  можно назвать указатель (это тривиально почти тавтологически верно). Если мы nitpicking, то (вообще) понятие hardlinks может существовать, даже если файловая система не использует inodes. - jfs


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


И «Пример стоит сто абзацев ...»

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

$ 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-hard указывает на inode, содержимое файла - это не было изменено.

$ 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 - это просто ссылка на несуществующий файл.


источник: вопиющее копирование Переполнение стека!


287
2017-07-21 07:33



Чтобы быть справедливым для вас - вы добавили прекрасное изображение наверху ... а вы тоже это скопировали! Сочетание двух ответов на самом деле очень полезно :) - icc97
лучше объяснить, нигде! - dennisbot
Я продолжал смотреть на изображение в течение 20 секунд, а затем, внезапно, я понял это. Это на самом деле блестяще. - Mohammed Joraid
btw: Использование жестких ссылок с git  это плохая идея, на всякий случай кто-то (расстроенный по мягким ссылкам) чудес ... может применяться и к другим системам управления версиями. - Frank Nocke
Является ли inode его жесткими ссылками, подобными файлу, хранящемуся в облаке, любому устройству, к которому он обращается? - Ooker


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

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

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


87
2018-05-18 15:23



If you replace the named file, then the link still contains the same name, and so now it points to the new file - Я думаю, что это не совсем понятно. Вы имеете в виду, если я заменю файл, где я получил символическую ссылку, тогда ссылки, содержащие имя, остаются нетронутыми. Но он будет указывать только на замененный файл, когда его имя файла (то есть новый файл, который заменил старый), совпадает с замененным (то есть старым файлом, который был заменен новым), правильно ли? - Mike
@Mike, да: символическая ссылка указывает на исходное имя файла, поэтому замена этого файла означает, что ссылка теперь указывает на новый файл. - psusi
Bbut, только если он получил то же имя? Если бы символическая ссылка указывала на банан, и я заменяю файл оранжевым, тогда ссылка sy не может найти файл банана больше, то есть он не будет работать - Mike
@Mike, мир замещать означает, что оно имеет то же имя, иначе вы просто удаляете один файл и добавляете другое;) - psusi


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

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


56
2018-02-29 09:20



Спасибо, это говорит мне, как они работают, но что конкретно делает жесткая ссылка? И почему он не работает для каталогов? - ste_kwr
@knittl: ты уверен? Кажется, что в некоторых файловых системах жесткие ссылки на каталоги разрешены, но только root может их создать. См. -d, -F, --directory переключатели. И да, я иметь видел заметку в ln(1) страница :) - 0xC0000022L
@kniwor: самый простой способ описания hardlinks - «просто другое имя для того же файла (то есть данные на диске)». И - по крайней мере, на моей системе (ых) ln не могут использоваться для создания ссылок на каталоги. Существуют жесткие ссылки на каталоги, хотя наиболее ярким примером является . а также .., Я не хотел включать это в свой первоначальный ответ, поскольку это только усложнит ситуацию. - knittl
@STATUS_ACCESS_DENIED: хорошо, хорошо ... но обычно это не очень хорошая идея. Вот почему я написал «обычно» в своем первоначальном ответе. Также см. Мои предыдущие комментарии для примеров. - knittl
поэтому жесткая ссылка может указывать на одну и ту же папку / файл с разными именами, например, с разными именами, которые ссылаются на один и тот же индекс? - Charlie Parker


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

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

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

Поэтому на основании этого:

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

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

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


20
2018-05-18 15:10



Я думаю, что вы правы, каждый файл - это путь к inode, а жесткая ссылка - это дополнительное имя пути для того же inode. Таким образом, жесткая ссылка не отличается от обычного файла. - enzotib
Я пытаюсь понять это ... но вы говорите:> «Символические ссылки - это отдельные файлы (в том числе отдельный индексный индекс и данные), которые хранят путь файловой системы к файлу. «Имеет ли символическая ссылка действительно отдельные данные? Тогда это точно так же, как копия каталога, на который он ссылается, правильно? ... и каждый раз, когда что-то записывается в символическую ссылку, оно должно записываться дважды на диск? Не имеет смысла. - MiniGod
@MiniGod Символьная ссылка не является inode блоком данных, который хранит путь к другому inode (filename). Да, это Матрица - как смущающая, но как только вы ее получите, вы никогда не забудете :) - Oli♦
@ Oli Я мог бы смутить, но когда вы говорите: «включая отдельный индексный дескриптор и данные », вы имеете в виду, что символическая ссылка имеет отдельные данные !? - MiniGod
@MiniGod Да. Symlink - это индекс, указывающий на данные (как обычный файл), а данные - путь. Это немного более умно, чем это - позволить прозрачное использование через символические ссылки, но это по существу все, что они есть. - Oli♦


Когда использовать Soft Link:

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

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

Когда использовать Hard Link:

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

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

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


15
2017-09-06 23:48



Обратите внимание, что существует также быстрая символическая ссылка для размера пути до 64 байтов. Он по-прежнему занимает один индекс, но не использует блок 4kb. - syockit


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

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

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

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


7
2018-03-01 11:28