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


37

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

В чем разница между файлом и жесткой ссылкой? Жесткая ссылка указывает на индекс, так что же такое файл? Сама запись inode? Или инод с жесткой ссылкой?

Допустим, я создаю файл с сенсорным. Затем в таблице inode создается запись inode . И я создаю жесткую ссылку, которая имеет тот же номер инода, что и файл. Так я создал новый файл? Или файл определен как инод?


Это почти наверняка дубликат unix.stackexchange.com/questions/9575/…
вставленный

7
@infixed Точно нет, я спрашиваю разницу между файлом и жесткой ссылкой.
Левент Дивилиоглу

Поэтому я восстановил свой первоначальный ответ, который, как мне кажется, также был отражен в ответах на этот связанный вопрос. Так это все еще «точно нет»?
добавлено

7
Разница между файлом и жесткой ссылкой такая же, как разница между вами и строкой с вашим именем в телефонной книге.
Йорг Миттаг,

Ответы:


61

Очень короткий ответ:

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

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

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

Помня об этой метафоре и, в частности, имея в виду, что каталоги Unix работают как каталоги реального мира, а не как папки реального мира, объясняет многие «странности», с которыми часто сталкиваются новички, например: почему я могу удалить файл, который я не делаю? нет доступа для записи? Ну, во-первых, вы не удаляете файл, вы удаляете одно из многих возможных имен файла, и для этого вам нужен только доступ на запись к каталогу, а не к файлу. Как в реальном мире.

Или, почему я могу иметь висячие символические ссылки? Ну, символическая ссылка просто содержит путь. Ничто не говорит о том, что на самом деле должен быть файл с таким именем.

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

Разница между файлом и жесткой ссылкой такая же, как разница между вами и строкой с вашим именем в телефонной книге.

Жесткая ссылка указывает на индекс, так что же такое файл? Сама запись Inode? Или Inode с жесткой ссылкой?

Файл является анонимной частью данных. Вот и все. Файл не является индексом, у файла есть индекс, так же, как вы не являетесь номером социального страхования, у вас есть SSN.

Жесткая ссылка - это имя файла. Файл может иметь много имен.

Допустим, я создаю файл с помощью touch, затем в таблице Inode создается запись Inode .

Да.

И я создаю жесткую ссылку, которая имеет тот же номер Inode с файлом.

Нет. Жесткая ссылка не имеет номера индекса, поскольку это не файл. Только файлы имеют номера инодов.

Жесткая ссылка связывает имя с номером инода.

Так я создал новый файл?

Да.

Или файл просто определен как Inode?

Нет, у файла есть индекс, это не индекс.


15
Я никогда не понимал (или правильно думал), какая метафора скрывается за словом «каталог». Пример телефонной книги - отличный пример; возможно, вам следует представить это раньше (когда вы впервые упоминаете реальный мир). Точно так же большинство людей редко имеют дело с «файлами» вне компьютера, поэтому, возможно, было бы более понятным сказать «точно так же, как бумажные файлы, и каталог, похожий на телефонную книгу».
IMSoP

2
@IMSoP Это разрыв между поколениями. До компьютеров телефонная книга была одним из видов справочника. Словарь Кембриджский говорит: « каталог: книга , которая содержит список имен, адресов или других фактов [... пример] Посмотрите их количество в телефонном справочнике. »
kubanczyk

2
@kubanczyk Действительно - людям, которые работали в до-цифровых офисах, я думаю, что метафоры кажутся настолько очевидными, что их объяснение кажется почти снисходительным Но для моего поколения и ниже, это так же неясно, как то, почему область хранения в задней части автомобиля называется «багажник» или «багажник», так что вы должны действительно разобрать это.
IMSoP

Слово «иметь» в фразе «Жесткая ссылка не имеет номера инода», возможно, вводит в заблуждение, потому что тогда вы говорите, что «Жесткая ссылка связывает имя с номером инода». Структура данных записи каталога «hardlink» фактически содержит inode # - так ссылка «ассоциируется» с inode #. Под «не имеет» я думаю, что вы имеете в виду, что жесткая ссылка не имеет индекса #, который указывает, где ссылка хранится на диске.
Кельвин

2
Сказать, что у файла есть индекс, несколько назад. Индод - это структура, которая содержит информацию о том, где находится «блок данных». Если нет инода, там нет файла.
Бармар

18

Жесткая ссылка - это запись в каталоге. Файл может иметь несколько записей каталога, если он присутствует под разными именами или в разных каталогах. Запись в каталоге называется «жесткой ссылкой», когда она помещается в связь с другими записями в каталоге для того же файла.

Индод содержит метаданные файла, отличные от его имени и содержимого (расположение содержимого, разрешения, метки времени и т. Д.). Там один индекс на файл. (Не все файловые системы помещают метаданные в четко идентифицируемое пространство на диске, которое можно назвать «inode», но это обычная архитектура.) Запись каталога связывает имя с inode. Возможно, что более одной записи в каталоге ссылаются на один и тот же индекс, отсюда и термин «ссылка». Такая ссылка называется «жесткой ссылкой» в противоположность «мягким ссылкам» или «символическим ссылкам», которые не говорят «для этого имени, используйте этот индекс», но «для этого имени ищите это другое имя».

Думайте о файлах как о комнатах, а записи в каталогах - как о дверях. «Открыть файл /foo/bar» означает «пойти в коридор /fooи пойти в комнату bar». «Идти в комнату bar» на самом деле означает «открыть дверь с пометкой barи войти в комнату», но «пойти в комнату bar» - это ничем не примечательный способ сказать то же самое более коротким способом. Можно иметь более одной двери, ведущей в одну комнату.

Когда вы создаете жесткую ссылку на существующий файл ( ln existing new), вы создаете вторую ссылку на тот же файл, т.е. вы создаете новую запись каталога, которая ссылается на уже существующий файл. После создания две записи каталога имеют одинаковый статус: не существует ни одной, которая является «первичной», а одна, которая является «вторичной», это просто обе ссылки на один и тот же файл.

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


когда были введены жесткие и мягкие ссылки, соответственно?
n611x007

2
@ n611x007: Не могли бы вы открыть новый вопрос, если у вас есть новый или дополнительный вопрос? Раздел комментариев не подходит или предназначен для новых вопросов или расширенного обсуждения. Спасибо.
Дэвид Фёрстер

1
@ n611x007 Жесткие ссылки старше, чем Unix, они были в v1 . Симлинки в Unix немного новее; Википедия имеет некоторую историю.
Жиль "ТАК - перестань быть злым"

Номера и двери это отличная аналогия! Симлинки - это как знаки для дверей.
curiousdannii

1
@curiousdannii: Симлинки больше похожи на комнаты, в которых сидит человек, который говорит: «Неправильный кабинет,
Легкость гонок с Моникой

8

В дополнение ко всем другим ответам я хочу отметить следующие важные свойства:

Мягкая ссылка является истинной ссылкой, то есть это небольшой файл, который содержит путь. Разрешение программной ссылки происходит прозрачно для приложения: если процесс открывает файл, скажем /this/path/here, символическая ссылка, на которую указывает, /that/other/pathто вся обработка открытия /that/other/pathвыполняется ОС. Кроме того, если /that/other/pathэто сама символическая ссылка, то это также решается операционной системой. Фактически, ОС следует цепочке символических ссылок, пока не найдет что-то еще (например, обычный файл) или пока не достигнет SYMLOOP_MAX(см. sysconf(3)) Многих записей, и в этом случае ОС (точнее: соответствующий системный вызов) возвращает ошибку и устанавливает errnoк ELOOP. Таким образом, циклическая ссылка, подобная xyz -> xyz, не остановит процесс. (Для систем Linux смотрите path_resolution(7)подробности.)

Обратите внимание, что процесс может проверить, является ли путь-символ символической ссылкой или нет, с помощью lstat(2)и может изменить свои атрибуты файла (сохраненные в таблице inode) lchown(2)и т. Д. (См. symlink(7)Всю историю).

Теперь, с точки зрения разрешения, вы заметите, что символические ссылки всегда имеют разрешения 777 ( rwxrwxrwxв символической записи). Это связано с тем, что любые другие разрешения могут быть обойдены путем доступа к реальному файлу в любом случае. И наоборот, 777 для символьной ссылки не делает доступным символьный файл, если он не был доступен в первую очередь. Например, символическая ссылка с разрешениями 777, указывающая на файл с разрешениями 640, делает файл недоступным для «других» (широкой общественности). Другими словами, файл xyzдоступен по символической ссылке тогда и только тогда, когда он доступен напрямую, то есть без косвенного обращения. Таким образом, разрешения символической ссылки не имеют никакого эффекта безопасности вообще.

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

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

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


6

Простой ответ:

  • Запись файла в каталоге является жесткой ссылкой на этот файл.

  • Некоторые файлы имеют более одной такой жесткой ссылки, так как допускается несколько жестких ссылок на один и тот же файл.


3

В первые дни Unix файлы внутри были inode на конкретном диске. Имена файлов были более дружественным способом доступа к ним.

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

Действительно, системный вызов, который программа должна использовать для удаления файла, это «unlink (2)». Данные не исчезают до тех пор, пока фамилия не будет удалена из индекса. (и индекс не открывается каким-то процессом)

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

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


Я полагаю, что это дубликат unix.stackexchange.com/questions/9575/…
вставлен

2
early daysпочему сейчас все по-другому? ваш ответ, похоже, не отражает эту точку зрения?
n611x007

@ n611x007 Потому что в наши дни такие вещи, как Linux, могут монтировать файловые системы не-unix-типа, которые не соответствуют модели inode. Например, производные FAT и ISO-9660. Это гораздо более разнообразная экология файловой системы, чем универсальный для всех
вставлено

1

Файл - это данные, записанные на диске. На эти данные ссылается его inode, который содержит метаданные о файле, сообщающие системе, какие блоки на диске используются этим файлом, среди прочего. Жесткая ссылка указывает на номер индекса этого файла.

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


1

Файл - это широко распространенное понятие о записях в файловой системе.

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

Мой вопрос просто в чем разница между файлом и жесткой ссылкой? Жесткая ссылка указывает на индекс, так что же такое файл? Сама запись Inode? Или Inode с жесткой ссылкой?

Допустим, я создаю файл с помощью touch, затем в таблице Inode создается запись Inode. И я создаю жесткую ссылку, которая имеет тот же номер Inode с файлом. Так я создал новый файл? Или файл просто определен как Inode?

Поскольку даже символическая ссылка обычно считается файлом, сама жесткая ссылка также может учитываться как файл. Вы можете сказать, что это файл, независимо от того, является ли это жесткой или мягкой ссылкой.

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

Если вы программист на C ++ или Java, вы можете прочитать о std :: filesystem :: file_type , java.io.File и java.nio.file.Files .

Подробную информацию о различиях между жесткой ссылкой и мягкой ссылкой можно найти в ссылке в комментарии infixed.


1

Разница между «файлом» с заданным именем и «жесткой ссылкой» заключается в истории. (Обычный) файл с заданным именем создается с помощью системного вызова creat, жесткая ссылка создается с помощью системного вызова link.

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

Таким образом, когда люди противопоставляют «файлы» и «жесткие ссылки», первое возникло с «числом ссылок 1», а все остальные появились с большим количеством ссылок. Разница носит академический характер, и, действительно, переименование файла в одно время заключалось в создании жесткой ссылки для целевого имени, а затем в удалении ссылки для исходного имени. В настоящее время обычно используется один системный вызов, который делает это атомарно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.