Жесткие ссылки эквивалентны ярлыкам Windows?

52

Википедия определяет жесткую ссылку как:

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

Мне интересно, если концепция жесткой ссылки эквивалентна концепции ярлыка Windows .

Если жесткие ссылки не эквивалентны ярлыкам, то какая функция Windows ближе всего к жестким ссылкам?

Computernerd
источник
1
На этой вики-странице есть несколько замечательных ссылок, которыми вы поделились.
eccentricSam
8
Microsoft NTFS поддерживает hardlink, и они очень похожи на unix hardlink. Я думаю, что ярлыки - это особый объект в среде Windows, но они не связаны с организацией файловых систем, в отличие от реальных
жестких
Следующая ссылка дает хорошие объяснения: comptb.cects.com/…
3
Я думаю, что параллель вводит в заблуждение, ярлыки - это «интерфейсные» ссылки, просто файлы с текстовой информацией о цели, которые интерпретируются интерфейсом, а не файловой системой. Из командной строки они на самом деле не указывают на что-то в смысле файловой системы. Windows (или, точнее, NTFS) имеет правильные символические ссылки en.wikipedia.org/wiki/NTFS_symbolic_link , которые не являются ни ярлыками, ни жесткими ссылками. Фактически, я использую их в Windows, чтобы иметь папки Dropbox где угодно, это нельзя сделать с помощью ярлыков.
alfC
5
Файлы ярлыков Windows очень похожи на файлы Linux .desktop. Симлинки и жесткие ссылки в Linux - это совершенно разные вещи, которые иногда служат одной и той же цели.
mikebabcock

Ответы:

113

Нет, жесткая ссылка совершенно другая. Мягкая ссылка ближе к ярлыку Windows (хотя есть важные различия, символические ссылки больше похожи на ярлыки Windows, чем жесткие ссылки). Жесткая ссылка - это совсем другое, и она вам почти никогда не понадобится.

Вкратце, мягкая ссылка создается с помощью этой команды:

ln -s foo bar

Если вы затем запустите ls -l, вы увидите:

lrwxrwxrwx 1 terdon terdon 3 Mar 10 15:58 bar -> foo
-rw-r--r-- 2 terdon terdon 0 Mar 10 15:58 foo

В ->означает , что barявляется ссылкой foo. Таким образом, открытие bar, например, с помощью текстового редактора, фактически откроет отдельный файл foo. Тем не менее, удаление barбудет просто удалить ярлык, это не повлияет на файл foo.

Жесткие ссылки, с другой стороны, создаются с помощью этой команды:

ln foo bar

Если вы сейчас запустите ls -l, нет никаких признаков какой-либо связи между файлами:

-rw-r--r-- 2 terdon terdon 0 Mar 10 15:58 bar
-rw-r--r-- 2 terdon terdon 0 Mar 10 15:58 foo

Но - и это очень важно - это фактически один и тот же файл . Файлы в файловых системах Unix хранятся с использованием инодов ; inode - это, по сути, способ, которым файловая система отображает имя файла в определенном месте на физическом жестком диске. Таким образом, жесткие ссылки - это файлы, которые указывают на тот же индекс, что и их цель. Другой способ выразить это так: все файлы на самом деле являются жесткими ссылками, указывающими на их иноды. Создание жесткой ссылки на файл просто создает новый указатель (файл) в файловой системе, который указывает на тот же индекс. Каждый индекс может иметь несколько файлов, указывающих на него, либо один, либо ни одного.

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

ln -s foo SoftLinkToFoo
ln foo HardLinkToFoo

Теперь проверьте их inode:

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

Как вы можете видеть выше, оба fooи HardLinkToFooимеют один и тот же индекс (16648029), тогда как SoftLinkToFoo имеет другой (16648036).

Что произойдет , если мы переименуем fooс mv foo bar?

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

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

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

Тердон
источник
6
@Kiwy Все наоборот: абсолютные символические ссылки выходят из строя по-разному (как только вы перемещаете данные, монтируете их в другое место, копируете их…), и их лучше избегать.
Жиль "ТАК - перестань быть злым"
3
Стоит также отметить, что удаление (через rmили unlink()) жесткой ссылки только уменьшает количество ссылок, пока количество ссылок не достигнет нуля, когда блоки, занятые содержимым файла, будут освобождены. Я не уверен, что высказывание «жесткие ссылки - это на самом деле два экземпляра одного и того же файла» является строго правильным, поскольку два имени указывают на один и тот же индекс и, следовательно, на одно и то же содержимое, а не на то, что два экземпляра самого файла любое чувство.
Эммет
7
Обратите внимание, что ярлык Windows - это файл, используемый оболочкой, и поэтому он может делать вещи, о которых знает оболочка, но не файловую систему. Например, вы можете создавать ярлыки в пространстве имен оболочки (например, Панель управления, Компьютер и т. Д.) Или создавать ярлыки для приложений, которые еще не установлены (которые будут установлены при первом использовании). Эти вещи не имеют прямого эквивалента в мире файловых систем.
Джои
2
Мне нравится этот ответ, но на самом деле он довольно плохо разбирается в ярлыке Windows. @Shaakunthala ниже имеет лучший отклик, так как ярлык Windows больше похож на файл .desktop в Linux, чем на символическую ссылку.
mikebabcock
18

Есть хорошее объяснение, что такое мягкие и жесткие ссылки, но нужно уточнить одну вещь.

Ярлыки Windows эквивалентны или не похожи ни на мягкие ссылки, ни на жесткие ссылки . На уровне файловой системы это просто файлы. Это оболочка, которая понимает их структуру и интерпретирует их как ссылки. Ярлыки Windows также могут указывать на объекты в пространствах имен оболочки, которые не связаны с файловой системой (принтеры, элементы панели управления, виртуальные папки).

Ярлыки Windows, помимо имени объекта файловой системы, содержат следующую информацию: PIDL (непрозрачный двоичный «путь» в пространстве имен оболочки), описание, горячая клавиша, значок, рабочий каталог. Windows также добавляет идентификаторы объектов NTFS, если используется файловая система NTFS, чтобы исправить неисправные ярлыки.

Грубый эквивалент ярлыка Windows - файл .desktop . Посмотрите этот вопрос на SuperUser: есть ли эквивалент .lnk в Linux?

Асария
источник
6

Нет. В Linux все работает иначе.

Каждый файл представлен объектом с именем «inode». С каждым индексом связан номер (ID).

Как мы знаем, люди не умеют запоминать числа, а имена. (Так развивались телефонные книги)

Таким образом, имя файла вошло в рисунок, чтобы дать каждому inode удобочитаемое имя. По сути, жесткая ссылка связывает имя файла с индексом. Индод может иметь несколько жестких ссылок. Если для определенного inode отсутствуют жесткие ссылки, дисковое пространство, используемое inode, может быть перераспределено для новых файлов. Это означает, что для каждого файла должна присутствовать хотя бы одна жесткая ссылка. Имя файла (визуализируемое как имя файла / значок, которое вы видите в файловом браузере) само по себе является жесткой ссылкой.

В Windows ярлык - это отдельный файл (файл * .lnk). Он содержит информацию об исходном файле (понятно, путь к файлу). В восприятии Linux ярлык Windows будет другим индексом, жестко связанным с именем файла, оканчивающимся на «.lnk».

Shaakunthala
источник
3
NTFS на самом деле работает очень похоже на это. Файл является записью в MFT, а записи каталога просто сопоставляют имена файлов с идентификаторами файлов. Он поддерживает жесткие ссылки и, начиная с 2008/7 / Vista (?), Даже символические ссылки. На данный момент самая большая разница культурная.
cHao
2

В Windows вы также можете создавать жесткие ссылки, если у вас есть файловая система NTFS.

fsutil hardlink create target_file source_file

Файлы должны быть на одном логическом диске.

привидение
источник
Это верно - NTFS также поддерживает жесткие ссылки. Часто инструменты требуют наличия прав администратора для их создания. О «том же логическом диске» - точнее сказать, они должны быть в одной файловой системе. Логический диск может быть что угодно, в том числе буквы диска , созданной substкомандой. Инструмент может не знать / заботиться об этом и, следовательно, отказаться от создания жесткой ссылки. Очень полезная вещь - расширение Shell Shell, которое позволяет проводнику создавать их.
Тобиас
1

Большая разница, жесткая ссылка не может быть создана для папок, но для файлов.

Ярлыки могут быть созданы для папок, поэтому вы не можете сказать, что они эквивалентны.

Ваш вопрос должен быть разницей между символической ссылкой или мягкой ссылкой и ярлыком .

в соответствии с этим:

Символическая ссылка - это уровень файловой системы, и все видят ее как исходный файл. Приложение не нуждается в специальной поддержке для использования символической ссылки.

«Ярлык» - это обычный файл, имеющий ссылку на конечный файл или каталог.

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

Ярлык Windows и панель запуска Linux (указывающая на какое-то место) будут идентичны.

Nux
источник
2
Какая? Мягкие ссылки - это просто файлы, хотя и странные, они также занимают иноды, например. Они НЕ рассматриваются как оригинальные (это жесткие ссылки). Несмотря на то, что жесткие ссылки не разрешены для каталогов в большинстве ОС, это всего лишь функция безопасности, и есть исключения из этого (например, машина времени OSX). И, конечно, вы можете переходить на ярлыки (я полагаю, вы имеете в виду ярлыки Windows, поскольку, как вы говорите, вы можете переходить на софлинки).
Terdon
1
Вы уверены, что можете использовать cmd для перехода на ярлык?
nux
1
Я просто запустил свою виртуальную машину Windows и создал ярлык для папки на рабочем столе, ярлыки Windows очень похожи (если не идентичны) на символические ссылки. Хотя по какой-то причине вы не можете подключиться к ним с помощью cmd.exe, вы можете создать .lnk для каталога и использовать его через проводник.
Terdon
1
вниз избиратели должны дать повод для downvoting
Nux
5
Извините, все еще не правильно. Симлинки - это файлы, содержащие свою цель в виде простого текста (см. Здесь ), символические ссылки не рассматриваются как оригиналы, в этом вся разница между симлинками и жесткими ссылками. Средства запуска Linux (я предполагаю, что вы имеете в виду файлы .desktop) не имеют к этому никакого отношения, они совершенно разные. Как вы сами говорите, ярлыки Windows могут указывать на файлы (включая программы) и папки (в Mac и Windows есть папки, в Linux есть каталоги). Файлы Ddesktop просто позволяют запускать программу. Они нигде не ссылаются.
Terdon