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

488

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

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

ste_kwr
источник
15
одно из отличий ... у вас есть какой-то файл, например файл test. Если вы сделаете ln test hardlink, сделайте ln -s test symlink, а затем переместите файл test в другой каталог (или переименуйте), symlink работать не будет. Hardlink будет работать. Теперь попробуйте удалить файл теста. Жесткая ссылка по-прежнему будет работать, фактически вы все равно сможете получить доступ к файлу, пока количество жестких ссылок на файл не станет 0. Это из-за inode, это написано в руководстве ...
Denwerko
5
Я вновь открыл это, потому что оно заслуживает хорошего общего ответа по этому вопросу (в отличие от предыдущего вопроса, который был неясным примером C).
Оли
4
Лучший ответ: youtube.com/watch?v=aO0OkNxDJ3c
Абхишек Бхатия
1
Также довольно полный ответ: stackoverflow.com/questions/185899/…
Эльзо Валуги
@AbhishekBhatia видео не доступно
Ooker

Ответы:

59

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


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

  1. Soft Links (символические ссылки)

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

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

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

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

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


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

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

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

введите описание изображения здесь

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


Вопрос: Как мне сделать Hard link?

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

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

 ls -i # Shows you the inode
 5898242 firefox

 ln /scripts/firefox /scripts/on-fire
       ( Source )    ( Destination )

введите описание изображения здесь

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

введите описание изображения здесь

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


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

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

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

Касим
источник
Могу ли я создать жесткую ссылку и предоставить индекс в качестве источника?
TMOTTM
324

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

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

Vartec
источник
1
То, что (по его собственным словам) «указывает на файл», можно назвать указателем (это тривиально почти тавтологически верно). Если мы придираемся, то (в общем) понятие жестких ссылок может существовать, даже если файловая система не использует inode.
Jfs
320

"Одна картинка стоит тысячи слов." Наглядное представление


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

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

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


источник: явно копирует это из StackOverflow!

ABcDexter
источник
13
Чтобы быть справедливым к вам - вы добавили прекрасное изображение вверху ... ах, вы тоже скопировали это! Объединение двух ответов на самом деле очень полезно :)
icc97
2
лучше объяснил, никуда!
Денисбот
3
Я продолжал смотреть на изображение в течение 20 секунд, а потом вдруг понял. Это на самом деле великолепно.
Мохаммед Джорайд
1
Кстати: использование жестких ссылок с git является плохой идеей , на тот случай, если кто-то (расстроенный из-за мягких ссылок) задастся вопросом ... может также обратиться к другим системам управления версиями.
Франк
1
Похож ли индекс на его жесткие ссылки на файл, хранящийся в облаке, на какое-либо устройство, которое обращается к нему?
Ooker
89

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Оли
источник
5
Я думаю, что вы правы, каждый файл - это путь к индексу, а жесткая ссылка - это дополнительный путь к тому же индоду. Так что жесткая ссылка ничем не отличается от обычного файла.
энзотиб
Я пытаюсь понять это ... но вы говорите:> "Символические ссылки - это отдельные файлы (включая отдельный inode и данные ), которые хранят путь файловой системы к файлу". Действительно ли символическая ссылка имеет отдельные данные? Тогда это как копия каталога, на который он ссылается, верно? ... и каждый раз, когда что-то записывается в символическую ссылку, это должно быть записано дважды на диск? Без разницы.
MiniGod
@MiniGod Нет, символическая ссылка является индексом для блока данных, в котором хранится путь к другому индексу (имени файла). Да, это похоже на Матрицу, но когда ты это получишь, ты никогда не забудешь :)
Оли
@ Оли Может быть, я запутался, но когда вы говорите: «включая отдельный индекс и данные », вы имеете в виду, что символическая ссылка имеет отдельные данные !?
MiniGod
1
@MiniGod Да. Симлинк - это индекс, указывающий на данные (как обычный файл), а эти данные - это путь. Это немного умнее - разрешить прозрачное использование через символические ссылки - но это, по сути, все, что они есть.
Оли
15

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

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

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

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

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

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

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

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

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

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

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

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

Gonesoft
источник
0

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

Джим Дрисколл
источник