В чем разница между жесткой ссылкой и символической ссылкой?
Как видно из названия, я хотел бы знать разницу между жесткой ссылкой и мягкой ссылкой, созданной командой ln
, Команда man ln
действительно предоставляет информацию, но недостаточно отвечает на мой вопрос.
Кроме того, было бы неплохо, если бы кто-то мог предоставить параметр, где жесткая ссылка может быть предпочтительнее, чем символическая ссылка.
9 ответов
В Linux/Unix ярлыки называются ссылками
Ссылки бывают двух типов: мягкие ссылки (символические ссылки) или жесткие ссылки.
Soft Links (символические ссылки)
Вы можете создавать ссылки на файлы и каталоги, а также создавать ссылки (ярлыки) в другом разделе и с другим номером иноде, чем в оригинале.
Если реальная копия удалена, ссылка не будет работать.
Жесткие ссылки
Жесткие ссылки предназначены только для файлов; Вы не можете связать файл с другим разделом с другим номером инода.
Если реальная копия удалена, ссылка будет работать, потому что она получает доступ к базовым данным, к которым обращалась реальная копия.
Вопрос: Как сделать мягкую ссылку?
Ответ: мягкая ссылка может быть сделана с 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 балл), если источник удален, ссылка не будет работать.
"Одна картинка стоит тысячи слов." https://ask-ubuntu.ru/images/2637481 d8e45499fe306b5875dfcabd418ac50bb.jpg
И "Пример стоит сто абзацев..."
Создайте два файла:
$ 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!
Жесткая ссылка - это не указатель на файл, это запись в каталоге (файл), указывающая на тот же индекс. Даже если вы измените имя другого файла, жесткая ссылка все равно будет указывать на файл. Если вы замените другой файл новой версией (скопировав его), жесткая ссылка не будет указывать на новый файл. Вы можете иметь жесткие ссылки только в одной файловой системе. С жесткими ссылками у вас нет концепции исходных файлов и ссылок, все равны (воспринимайте это как ссылку на объект). Это концепция очень низкого уровня.
С другой стороны, символическая ссылка фактически указывает на другой путь (имя файла); он разрешает имя файла каждый раз, когда вы получаете к нему доступ через символическую ссылку. Если вы переместите файл, символическая ссылка не будет следовать. Если вы замените файл другим, сохранив имя, символическая ссылка укажет на новый файл. Симлинки могут охватывать файловые системы. С символическими ссылками у вас есть очень четкое различие между фактическим файлом и символической ссылкой, которая не хранит никакой информации, кроме пути о файле, на который он указывает.
Оба являются указателями на файлы; Разница в виде указателя. Символическая ссылка указывает на другой файл по имени. Он имеет специальный бит режима, который идентифицирует его как символическую ссылку, а его содержимое - это имя реального файла. Поскольку оно просто содержит имя, это имя фактически не должно существовать или может существовать в другой файловой системе. Если вы замените названный файл (измените его содержимое, не затрагивая его имя), то ссылка все равно будет содержать то же имя, и теперь она указывает на новый файл. Вы можете легко определить символическую ссылку и увидеть имя файла, на который она указывает.
Жесткая ссылка указывает на файл по номеру инода. Таким образом, жесткие ссылки ничем не отличаются от имени файла. Нет "настоящего" имени против имени с жесткой ссылкой; все жесткие ссылки являются одинаково действительными именами для файла. Из-за этого файл, на который вы ссылаетесь, должен фактически существовать и находиться в той же файловой системе, где вы пытаетесь создать ссылку. Если вы удалите оригинальное имя, то жесткая ссылка все равно будет указывать на тот же файл. Поскольку все жесткие ссылки являются одинаково действительными именами для файла, вы не можете смотреть на одну и видеть другие имена для файла; чтобы найти это, вы должны посмотреть на каждый файл и сравнить их номер инода, чтобы найти другие имена, которые имеют тот же номер инода.
Вы можете сказать, сколько имен имеет файл из вывода ls -l
, Первое число после режима файла - это количество ссылок. Файл с более чем 1 ссылкой имеет другие имена где-то, и, наоборот, файл с количеством ссылок только 1 не имеет (других) жестких ссылок.
Жесткая ссылка может работать только в одной и той же файловой системе, это просто другое имя для одного и того же inode (файлы имеют внутреннюю ссылку inode). Файл будет удален с диска только тогда, когда последняя ссылка на его индекс исчезнет (вы rm
д или unlink
д последняя ссылка). Жесткие ссылки обычно работают только для файлов, а не для каталогов.
Символьная ссылка (символическая ссылка) - это специальный файл, содержащий путь к другому файлу. Этот путь может быть абсолютным или относительным. Символьные ссылки могут работать в разных файловых системах и даже могут указывать на разные файлы, если вы, например, отключили внешний жесткий диск и заменили его другим, у которого другой файл находится по тому же пути. Символьная ссылка может указывать либо на файлы, либо на каталоги.
В одном из ответов из другой ветки (теперь ссылка на которую есть в верхней части вашего поста) упоминается эта страница, которая, я думаю, является довольно хорошим объяснением среднего уровня. Если вы заблудились в ascii art, вот версия tl; dr:
- Стандартные файлы - это указатель от файловой системы на индекс, который, в свою очередь, указывает на физические данные. Файловый компонент хранит свою ссылку на файловую систему (по существу, ее путь) и ссылку на inode.
- Жесткие ссылки, как файлы. Они просто дополнительный указатель непосредственно на индекс.
- Символьные ссылки - это отдельные файлы (включая отдельные inode и данные), которые хранят путь файловой системы к файлу.
Ядро и файловые системы переводят все прозрачно.
Итак, основываясь на этом:
- Жесткие ссылки разрешают только ссылки на одну и ту же файловую систему. Симлинки могут указывать на любой путь.
- Жесткие ссылки (по сути) указывают на абсолютные данные. Симлинки могут указывать на относительные пути (например,
../parent.file
) - Более того, если вы перемещаете целевой указатель жесткой ссылки (которая, помните, сама по себе является просто жесткой ссылкой, указывающей на индекс), жесткая ссылка все еще работает. Перемещение цели символической ссылки обычно нарушает символическую ссылку.
- Разрешение жесткой ссылки будет быстрее, но неизмеримо. Эта незначительная часть скорости достигается за счет негибкой файловой системы.
Возможно, я немного запутался, но, читая разные вещи, я изо всех сил пытаюсь найти разницу между стандартным файлом и жесткой ссылкой. Как я понимаю, каждый файл состоит из жесткой ссылки (хранящей имя файла), ссылающейся на индекс, который указывает на физические данные.
Добавление жесткой ссылки просто предоставляет inode дополнительный указатель на основе файловой системы. Это правильно?
Когда использовать Soft Link:
Связь между файловыми системами. Если вы хотите связать файлы между файловыми системами, вы можете использовать только символические / программные ссылки.
Ссылки на каталог: если вы хотите связать каталоги, то вы должны использовать мягкие ссылки, так как вы не можете создать жесткую ссылку на каталог.
Когда использовать Hard Link:
Место для хранения. Жесткие ссылки занимают очень незначительное пространство, так как при создании жестких ссылок новые иноды не создаются. В мягких ссылках мы создаем файл, который занимает место (обычно 4 КБ, в зависимости от файловой системы)
Производительность. Производительность будет немного выше при обращении к жесткой ссылке, поскольку вы напрямую обращаетесь к указателю диска, а не просматриваете другой файл. Перемещение местоположения файла: если вы переместите исходный файл в другое место в той же файловой системе, жесткая ссылка все равно будет работать, но мягкая ссылка не будет выполнена.
Избыточность: если вы хотите убедиться в безопасности ваших данных, вы должны использовать жесткую ссылку, как в жесткой ссылке, данные в безопасности, пока все ссылки на файлы не будут удалены, вместо того, чтобы в мягкой ссылке, вы потеряете данные, если главный экземпляр файла удален.
Путаница возникает, когда вы пытаетесь найти разницу между "именем файла" и жесткой ссылкой, потому что ее нет.
Каждый созданный вами файл состоит из данных на диске и жесткой ссылки, которая представляет собой имя файла в каталоге и указатель на данные на диске. Конец истории. Когда удаляется последняя (или единственная) жесткая ссылка, ОС знает, что данные больше не нужны.
Отсюда видно, что фактические данные никогда не удаляются, а только жесткие ссылки. И когда он становится достаточно загруженным на диске, данные могут быть перезаписаны данными другого файла. До этого данные из удаленного файла могут быть восстановлены, но без жесткой ссылки их довольно сложно найти.
Симлинки, как уже объяснялось ранее, просто говорят вам "есть файл с именем <targetname>
в папке с именем <targetfolder>
". Они указывают на жесткую ссылку. Они не знают, где находятся данные. Жесткая ссылка знает это.
Это очень просто Файлы (и каталоги!) Хранятся по адресам на блочном устройстве (HDD или что-то еще). Обычно у вас есть одно имя, сопоставленное с адресом, и именно так вы получаете свой файл. Жесткая ссылка - это второе, третье и т. Д. Имя, сопоставленное с тем же адресом. Символическая ссылка вместо этого относится к символу - имени - и второе имя сопоставляется с первым именем. Что касается ядра, то, как только оно прочитает цель символьной ссылки, оно остановится и вернется к началу с целевым значением в качестве имени файла (более или менее), так что относительные символические ссылки возможны, но крайне бесполезны. Имя цели не используется выше уровня файловой системы, за исключением случаев, когда оно явно запрашивается в коде пользовательского пространства.