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

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

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

521
задан 17 October 2014 в 15:30

9 ответов

В 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 балл) , если источником является удалил ссылку не получится.

0
ответ дан 17 October 2014 в 15:30

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

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

0
ответ дан 17 October 2014 в 15:30

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

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

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

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

0
ответ дан 17 October 2014 в 15:30

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

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

0
ответ дан 17 October 2014 в 15:30

"Изображение стоит тысячу слов". 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-твердые точки к inode, содержанию, файла - который не был изменен.

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

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

<час>

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

0
ответ дан 17 October 2014 в 15:30

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

0
ответ дан 17 October 2014 в 15:30

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

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

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

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

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

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

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

0
ответ дан 17 October 2014 в 15:30

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

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

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

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

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

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

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

0
ответ дан 17 October 2014 в 15:30

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

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

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

0
ответ дан 17 October 2014 в 15:30

Другие вопросы по тегам:

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