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

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

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

441 голос | спросил ste_kwr 29 FebruaryEurope/MoscowbWed, 29 Feb 2012 13:03:12 +0400000000pmWed, 29 Feb 2012 13:03:12 +040012 2012, 13:03:12

10 ответов


28

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


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

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

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

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

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

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

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


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

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

sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib32/libGL.so.1
             (----------Источник назначение )

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

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

<hr>
<p> <strong> Вопрос: </strong> Как создать жесткую ссылку? </p>

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

<p> Предположим, у меня есть скрипт в каталоге <code>/script</code> с именем <code>firefox</code>. </p>

<pre><code>ls -i # Показывает вам индекс
 5898242 firefox

 ln /scripts /firefox /scripts /on-fire
       ( Источник назначение )
</code></pre>

<p> <img src =

ответил Qasim 9 Mayam13 2013, 04:42:13
312

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

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

ответил vartec 18 Maypm11 2011, 13:51:53
287

«Картина стоит тысячи слов». «Изобразительное


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

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

$ touch blah1
$ touch blah2

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

$ echo "Cat"> blah1
$ echo "Собака"> blah2

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

$ cat blah1; cat blah2
Кот
Собака

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

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

Посмотрим, что только что произошло:

$ ls -l

blah1
blah1 твердолобый
blah2
blah2-soft -> blah2

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

$ mv blah1 blah1-new
$ cat blah1-hard
Кот

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

$ mv blah2 blah2-new
$ ls blah2-soft
blah2-софт
$ cat blah2-soft
cat: blah2-soft: нет такого файла или каталога

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


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

ответил ABcDexter 21 J000000Thursday16 2016, 10:33:10
87

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

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

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

ответил psusi 18 Maypm11 2011, 19:23:46
56

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

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

ответил knittl 29 FebruaryEurope/MoscowbWed, 29 Feb 2012 13:20:47 +0400000000pmWed, 29 Feb 2012 13:20:47 +040012 2012, 13:20:47
20

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

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

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

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

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

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

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

ответил Oli 18 Maypm11 2011, 19:10:56
15

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

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

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

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

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

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

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

ответил Osama 7 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 07 Sep 2014 03:48:49 +0400 2014, 03:48:49
7

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

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

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

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

ответил Gonesoft 1 MarpmSun, 01 Mar 2015 14:28:57 +03002015-03-01T14:28:57+03:0002 2015, 14:28:57
3

Для отличного noob и ex-Windoze -user- дружественного объяснения с хорошими диаграммами и FAQ ознакомьтесь с этой страницей http: //www.geekride.com/hard-link-vs-soft-link/. Их ограничения copyright не позволяют мне извлекать их материалы, поэтому достаточно, чтобы я предоставил ссылку здесь.

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

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

ответил nutty about natty 10 FebruaryEurope/MoscowbSun, 10 Feb 2013 20:03:40 +0400000000pmSun, 10 Feb 2013 20:03:40 +040013 2013, 20:03:40
0

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

ответил Jim Driscoll 3 J000000Sunday16 2016, 18:39:06

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132