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

420

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

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

    
задан ste_kwr 29.02.2012 в 10:03
источник

10 ответов

265

«Картина стоит тысячи слов».

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

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

$ 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 21.07.2016 в 09:33
источник
302

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

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

    
ответ дан vartec 18.05.2011 в 11:51
источник
87

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

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

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

    
ответ дан psusi 18.05.2011 в 17:23
источник
55

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

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

    
ответ дан knittl 29.02.2012 в 10:20
источник
20

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

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

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

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

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

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

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

    
ответ дан Oli 18.05.2011 в 17:10
источник
19

В Linux / Unix Shortcuts известен как Link

Ссылка имеет два типа: Soft links (символические ссылки) или Hard link

  1. Софт-ссылки (символические ссылки)

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

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

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

    Только для файлов & amp; вы не можете создавать на другом разделе (он должен быть на одном разделе) & amp; получил тот же номер inode, что и оригинал

    Если копия real удалена, ссылка будет работать (поскольку она действует как исходный файл)

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

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

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

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

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

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

У меня есть сценарий в / имя папки сценария firefox

 ls -i   ( Shows you the inode )
 5898242 firefox

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

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

У меня есть проверка, что ссылка работает или нет, тогда я удалил сценарий firefox

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

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

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

    
ответ дан Qasim 09.05.2013 в 02:42
источник
14

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

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

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

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

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

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

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

    
ответ дан Osama 07.09.2014 в 01:48
источник
6

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

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

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

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

    
ответ дан Gonesoft 01.03.2015 в 12:28
источник
3

Для отличного noob и ex-Windoze -user- дружественного объяснения с хорошими диаграммами и FAQ ознакомьтесь с этой страницей Ссылка . Их ограничения copyright не позволяют мне извлекать их материалы, поэтому достаточно, чтобы я предоставил ссылку здесь.

Это моя вторая или даже третья попытка схватывания загадки мягкой / жесткой ссылки, всегда бросающей полотенце и откладывающей мое понимание до неопределенного момента времени в будущем - как только объяснения и man-страницы получить глубокое ядерное и сверхтехническое с помощью inodes и всех ...

Наслаждайтесь!

    
ответ дан nutty about natty 10.02.2013 в 17:03
источник
0

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

    
ответ дан Jim Driscoll 03.07.2016 в 17:39
источник

Ознакомьтесь с другими вопросами по меткам