Недавно меня спросили об этом во время собеседования. Я был честен и сказал, что знаю, как ведет себя символическая ссылка и как ее создать, но я не понимаю, как использовать жесткую ссылку и чем она отличается от символической.
770
Ответы:
Под файловой системой файлы представлены inode. (Или это несколько inode? Не уверен.)
Файл в файловой системе - это, по сути, ссылка на индекс.
Таким образом, жесткая ссылка просто создает другой файл со ссылкой на тот же базовый индекс.
Когда вы удаляете файл, он удаляет одну ссылку на основной индекс. Индод удаляется (или удаляется / перезаписывается) только тогда, когда все ссылки на индекс удалены.
Символическая ссылка - это ссылка на другое имя в файловой системе.
После создания жесткой ссылки ссылка делается на индекс. Удаление, переименование или перемещение исходного файла не повлияет на жесткую ссылку, поскольку она ссылается на базовый индекс. Любые изменения в данных в этом узле отражаются во всех файлах, которые ссылаются на этот узел.
Примечание. Жесткие ссылки действительны только в одной файловой системе. Символические ссылки могут охватывать файловые системы, поскольку они являются просто именем другого файла.
источник
Хорошая интуиция, которая может помочь при использовании любой консоли Linux (ish).
Создайте два файла:
Введите некоторые данные в них:
(На самом деле, я мог бы использовать echo в первую очередь, поскольку он создает файлы, если они не существуют ... но не обращайте на это внимания.)
И, как и ожидалось:
Давайте создадим жесткие и мягкие ссылки:
Давайте посмотрим, что только что произошло:
Изменение имени foo не имеет значения:
foo-hard указывает на inode, содержимое файла - это не изменилось.
Не удалось найти содержимое файла, поскольку мягкая ссылка указывает на измененное имя, а не на его содержимое.
Аналогично, если
foo
удалено,foo-hard
все еще содержит содержимое; еслиbar
удалено,bar-soft
это просто ссылка на несуществующий файл.источник
touch blah1; touch blah2
можно сократить доtouch blah1 blah2
Как говорится, картинка стоит тысячи слов. Вот как я это представляю:
Вот как мы доберемся до этой картинки:
Создайте имя
myfile.txt
в файловой системе, которое указывает на новый индекс (который содержит метаданные для файла и указывает на блоки данных, которые содержат его содержимое, то есть текст «Hello, World!»:Создайте жесткую ссылку
my-hard-link
на файлmyfile.txt
, что означает «создать файл, который должен указывать на тот же индекс, на которыйmyfile.txt
указывает»:Создайте программную ссылку
my-soft-link
на файлmyfile.txt
, что означает «создать файл, который должен указывать на файлmyfile.txt
»:Посмотрите, что теперь произойдет, если
myfile.txt
удалить (или переместить): по-my-hard-link
прежнему указывает на то же содержимое, и, следовательно, не влияет, в тоmy-soft-link
время как теперь ничего не указывает. Другие ответы обсуждают плюсы / минусы каждого.источник
myfile.txt
). Для софт-ссылки это ссылка не на индекс (который содержит данные), а скорее ссылка на путь к файловой системеmyfile.txt
(например/home/Documents/myfile.txt
)Жесткие ссылки полезны, когда исходный файл перемещается. Например, перемещение файла из / bin в / usr / bin или в / usr / local / bin. Любая символическая ссылка на файл в / bin будет нарушена этим, но жесткая ссылка, являющаяся ссылкой непосредственно на inode для файла, не будет заботиться.
Жесткие ссылки могут занимать меньше места на диске, поскольку они занимают только запись в каталоге, тогда как символическая ссылка нуждается в собственном иноде для хранения имени, на которое она указывает.
Жесткие ссылки также занимают меньше времени для устранения - символические ссылки могут указывать на другие символические ссылки, которые находятся в каталогах с символическими ссылками. И некоторые из них могут быть в NFS или других файловых системах с высокой задержкой, что может привести к разрешению сетевого трафика. Жесткие ссылки, всегда находящиеся в одной и той же файловой системе, всегда разрешаются в одном поиске и никогда не связаны с задержкой в сети (если это жесткая ссылка в файловой системе NFS, сервер NFS будет выполнять разрешение, и он будет невидим для клиентская система). Иногда это важно. Не для меня, но я могу представить высокопроизводительные системы, где это может быть важно.
Я также думаю, что такие вещи, как mmap (2) и даже open (2) используют ту же функциональность, что и жесткие ссылки, чтобы поддерживать активный индекс файла, так что даже если файл получает unlink (2) ed, этот индекс остается, чтобы процесс продолжал доступ, и только когда процесс закрывается, файл действительно исчезает. Это позволяет гораздо более безопасные временные файлы (если вы можете заставить атомы открываться и отменять ссылки, которые могут быть в POSIX API, для которых я не помню, тогда у вас действительно есть безопасный временный файл), где вы можете читать / писать ваши данные без доступа к ним. Что ж, это было верно до того, как / proc дал всем возможность взглянуть на ваши файловые дескрипторы, но это уже другая история.
Говоря об этом, восстановление файла, открытого в процессе A, но не связанного в файловой системе, вращается вокруг использования жестких ссылок для воссоздания ссылок inode, поэтому файл не исчезает, когда открывающий его процесс закрывает его или удаляется.
источник
Soft Link :
soft или symbolic - это скорее сокращение к исходному файлу .... если вы удаляете оригинал, ярлык не срабатывает, и если вы удаляете только ярлык, с оригиналом ничего не происходит.
Синтаксис мягкой ссылки :
ln -s Pathof_Target_file link
Вывод :
link -> ./Target_file
Доказательство:
readlink link
Также вls -l link
выводе вы увидите первую букву вlrwxrwxrwx
виде l, которая указывает на то, что файл является мягкой ссылкой.Удаление ссылки:
unlink link
Примечание: если вы хотите, ваша мягкая ссылка может работать даже после перемещения ее в другое место из текущего каталога. Убедитесь, что вы указали абсолютный путь, а не относительный путь при создании мягкой ссылки. т.е. (начиная с / root / user / Target_file, а не ./Target_file)
Жесткая ссылка:
Жесткая ссылка - это скорее зеркальная копия или несколько путей к одному и тому же файлу. Сделайте что-нибудь с файлом file1, и он появится в файле 2. Удаление одного из них по-прежнему сохраняет в порядке.
Индод (или файл) удаляется только тогда, когда все (жесткие) ссылки или все пути к (одному и тому же файлу) индоду были удалены.
После создания жесткой ссылки ссылка имеет индекс исходного файла. Удаление переименования или перемещение исходного файла не повлияет на жесткую ссылку, так как она ссылается на основной индекс. Любые изменения в данных в этом узле отражаются во всех файлах, которые ссылаются на этот узел.
Синтаксис жесткой ссылки :
ln Target_file link
Вывод: Будет создан файл со ссылкой на имя с тем же номером инода, что и в Targetfile.
Доказательство:
ls -i link Target_file
(проверьте их иноды)Удаление ссылки:
rm -f link
(Удалить ссылку как обычный файл)Примечание . Символические ссылки могут охватывать файловые системы, поскольку они являются просто именем другого файла. Принимая во внимание, что жесткие ссылки действительны только в той же файловой системе.
Символьные ссылки имеют некоторые функции, которые отсутствуют:
Вы сразу же знаете, на что указывает символическая ссылка, в то время как с жесткими ссылками вам нужно исследовать всю файловую систему, чтобы найти файлы с одинаковым индексом.
# find / -inum 517333
жесткие ссылки не могут указывать на каталоги.
Жесткие ссылки имеют два ограничения:
источник
Простой способ увидеть разницу между жесткой ссылкой и символической ссылкой - простой пример. Жесткая ссылка на файл будет указывать на место, где хранится файл, или на индекс этого файла. Символическая ссылка будет указывать на сам файл.
Итак, если у нас есть файл с именем «a» и мы создаем жесткую ссылку «b» и символическую ссылку «c», которые все ссылаются на файл «a»:
Вывод "a", "b" и "c" будет:
Теперь давайте удалим файл «a» и посмотрим, что происходит с выходными данными «a», «b» и «c»:
Так что случилось?
Поскольку файл "c" указывает на сам файл "a", если файл "a" будет удален, то файлу "c" будет нечего указывать, фактически он также будет удален.
Однако файл "b" указывает на место хранения или индекс файла "a". Таким образом, если файл «a» удален, он больше не будет указывать на индекс, но, поскольку файл «b» делает это, индекс будет продолжать хранить все содержимое, принадлежащее «a», до тех пор, пока больше не будет жестких ссылок на него.
источник
Символические ссылки ссылаются на путь. Это может быть где угодно в системном дереве файлов, и даже не должно существовать при создании ссылки. Целевой путь может быть относительным или абсолютным.
Жесткие ссылки - это дополнительные указатели на индекс, то есть они могут существовать только на том же томе, что и целевой объект. Дополнительные жесткие ссылки на файл неотличимы от «оригинального» имени, используемого для ссылки на файл.
источник
Я хотел бы указать вам на Википедию:
Несколько моментов:
источник
Жесткие ссылки очень полезны при создании инкрементных резервных копий. Смотрите rsnapshot , например. Идея состоит в том, чтобы сделать копию, используя жесткие ссылки:
Новая резервная копия не займет дополнительного места, кроме внесенных вами изменений, поскольку все инкрементные резервные копии будут указывать на одинаковый набор инодов для файлов, которые не были изменены.
источник
Жесткая ссылка и мягкая ссылка может быть легко объяснена этим изображением.
источник
Я добавлю к вопросу Ника: когда жесткие ссылки полезны или необходимы? Единственное приложение, которое мне приходит в голову, в котором символические ссылки не справляются с этой задачей, - это предоставление копии системного файла в изолированной среде.
источник
Из MSDN ,
Символьная ссылка
Пример абсолютной символической ссылки
Пример относительных символических ссылок
Жесткая ссылка
Чтобы создать жесткую ссылку в Windows, перейдите туда, где должна быть создана ссылка, и введите следующую команду:
Обратите внимание, что вы можете удалять жесткие ссылки в любом порядке, независимо от того, в каком порядке они были созданы. Кроме того, жесткие ссылки не могут быть созданы, когда
узловой
NTFS поддерживает другой тип ссылки, называемый junction. MSDN определяет это следующим образом:
Части, выделенные полужирным шрифтом в жесткой и соединительной частях, показывают принципиальное различие между ними.
Команда для создания соединения в окнах, перейдите туда, где должна быть создана ссылка, а затем введите:
источник
Также:
источник
Просто, жесткая ссылка: это просто добавление нового имени в файл, это означает, что файл может иметь много имен в одно и то же время, все имена равны друг другу, никто не предпочитает, Жесткая ссылка не означает копировать все содержимое файла и сделать новый файл не то, это просто создать альтернативное имя, которое будет известно ..
Символическая ссылка (символическая ссылка): указатель файла на другой файл, если символическая ссылка указывает на существующий файл, который впоследствии удаляется, символическая ссылка продолжает указывать на то же имя файла, даже если имя больше не называет никакого файла.
источник
То, что вы считаете обычным «файлом», на самом деле две разные вещи: данные файла и запись в каталоге. Когда вы создаете жесткую ссылку для файла, вы фактически создаете вторую запись каталога, которая ссылается на те же данные. Обе записи каталога имеют одинаковую функциональность; каждый из них может быть использован для открытия файла, чтобы прочитать его. Таким образом, у вас нет «файла плюс жесткая ссылка», у вас есть «данные файла с двумя записями каталога». То, что вы считаете удалением файла, фактически удаляет запись каталога, и когда удаляется последняя запись каталога для данных, то и сами данные также удаляются. Для обычных файлов, которые имеют только одну запись каталога, удаление записи каталога приведет к удалению данных как всегда. (Пока файл открыт, ОС создает временную ссылку на файл,
В качестве примера создайте файл A.txt, жесткую ссылку B.txt и удалите A.txt. Когда вы создали A.txt, были созданы некоторые данные и запись каталога A.txt. Когда вы создали жесткую ссылку, была создана другая запись каталога B.txt, указывающая на те же самые данные. При удалении A.txt у вас все еще остаются все данные и одна запись каталога B.txt, точно так же, как если бы вы сначала создали файл B.txt.
Мягкая ссылка - это просто (почти) обычный файл, за исключением того, что он содержит не данные, а путь к другой записи каталога. Если вы удалите файл, на который ссылается мягкая ссылка, то мягкая ссылка будет содержать путь, который больше не будет указывать на запись в каталоге; оно сломано. Если вы удаляете программную ссылку, это похоже на удаление любого другого файла, файл, на который она указывает, не изменяется.
источник
Запись в каталоге является ссылкой на структуру:
ino - это номер inode, имя - это имя файла, структура inode может быть такой:
например, вы создали файл / 1, запись в каталоге может выглядеть так:
структура inode может выглядеть так:
затем вы создаете жесткую ссылку (может быть / 100), запись в каталоге может выглядеть так:
структура inode может выглядеть так:
затем вы создаете символическую ссылку (может быть / 200) на файл 1, запись в каталоге может выглядеть так:
структура inode может выглядеть так:
источник
В дополнение ко всем приведенным выше ответам разницу в поиске файла с жесткой и мягкой ссылкой можно понять следующим образом:
У меня есть файл
f6
в моем текущем каталоге, а также каталог с именемt2
.Файл назван
f1
и./t2/f2
является символической ссылкой наf6
.Файл с именем
f7
и./t2/f8
жесткие ссылкиf6
.Чтобы найти как мягкую, так и жесткую ссылку, мы можем использовать:
Чтобы найти только жесткую ссылку, мы можем использовать:
Поскольку жесткие ссылки могут быть созданы в одной и той же файловой системе, мы можем искать все жесткие ссылки без
-L
использования опций (с-xdev
опцией) в одной файловой системе / точке монтирования. Это сохраняет ненужный поиск в разных точках монтирования.Таким образом, поиск по жесткой ссылке несколько быстрее, чем поиск по программным ссылкам (пожалуйста, исправьте, если я ошибаюсь или не ясен).
источник
Символические ссылки дают другое имя файла, аналогично жестким ссылкам. Но файл можно удалить, даже если есть оставшиеся символические ссылки.
источник
Мои два цента на использование:
Мягкие ссылки могут использоваться для сокращения длинных имен путей, то есть:
Изменения
/short/file.txt
будут применены к исходному файлу.Жесткие ссылки могут использоваться для перемещения больших файлов:
ln /myapp/dev/application.bin /myapp/prd/application.bin
Мгновенное копирование в другую папку, и исходный файл (вкл
/myapp/dev
) можно перемещать или удалять, не касаясь файла на/myapp/prd
источник
Я просто нашел простой способ понять жесткие ссылки в обычном сценарии, установить программное обеспечение.
Однажды я загрузил программное обеспечение в папку
Downloads
для установки. После этогоsudo make install
некоторые исполняемые файлы былиcp
добавлены в локальную папку bin. Здесьcp
создается жесткая ссылка . Я был счастлив с программным обеспечением, но вскоре понял, чтоDownloads
это не очень хорошее место в долгосрочной перспективе. Поэтому яmv
переместил папку с программным обеспечением вsource
каталог. Ну, я все еще могу запускать программное обеспечение, как и раньше, не беспокоясь о каких-либо целевых ссылках, как в Windows. Это означает, что жесткая ссылка находит непосредственно inode и другие файлы вокруг.источник
В этом ответе, когда я говорю файл, я имею в виду местоположение в памяти
Все сохраненные данные хранятся в памяти с использованием структуры данных, называемой inode. Каждый inode имеет inodenumber. Номер inode используется для доступа к inode. Все жесткие ссылки на файл могут иметь разные имена, но иметь одинаковый номер inode. Поскольку все жесткие ссылки имеют один и тот же inodenumber (который обеспечивает доступ к одному и тому же inode), все они указывают на одну и ту же физическую память.
Символьная ссылка - это особый вид файла. Поскольку это также файл, он будет иметь имя файла и номер инода. Как сказано выше, номер инода принимает индекс, который указывает на данные. Теперь, что делает символическую ссылку особенной, так это то, что номера inode в символических ссылках обращаются к тем inode, которые указывают «путь» к другому файлу. Более конкретно, номер inode в символической ссылке принимает те inode, которые указывают на другую жесткую ссылку.
когда мы перемещаем, копируем, удаляем файл в графическом интерфейсе, мы играем с жесткими ссылками файла, а не с физической памятью. когда мы удаляем файл, мы удаляем жесткую ссылку файла. мы не стираем физическую память. Если все жесткие ссылки на файл будут удалены, доступ к сохраненным данным будет невозможен, хотя они все еще могут присутствовать в памяти.
источник