Жесткая связь определяется как указатель на индексный дескриптор. Мягкая ссылка , также известная как символическая ссылка , определяются как независимый файл , указывающего на другую ссылку без ограничений жестких ссылок.
В чем разница между файлом и жесткой ссылкой? Жесткая ссылка указывает на индекс, так что же такое файл? Сама запись inode? Или инод с жесткой ссылкой?
Допустим, я создаю файл с сенсорным. Затем в таблице inode создается запись inode . И я создаю жесткую ссылку, которая имеет тот же номер инода, что и файл. Так я создал новый файл? Или файл определен как инод?
files
filesystems
symlink
hard-link
Левент Дивилиоглу
источник
источник
Ответы:
Очень короткий ответ:
Файлы и каталоги Unix работают точно так же, как файлы и каталоги в реальном мире (и не похожи на папки в реальном мире); Файловые системы Unix (концептуально) структурированы следующим образом:
Помня об этой метафоре и, в частности, имея в виду, что каталоги Unix работают как каталоги реального мира, а не как папки реального мира, объясняет многие «странности», с которыми часто сталкиваются новички, например: почему я могу удалить файл, который я не делаю? нет доступа для записи? Ну, во-первых, вы не удаляете файл, вы удаляете одно из многих возможных имен файла, и для этого вам нужен только доступ на запись к каталогу, а не к файлу. Как в реальном мире.
Или, почему я могу иметь висячие символические ссылки? Ну, символическая ссылка просто содержит путь. Ничто не говорит о том, что на самом деле должен быть файл с таким именем.
Разница между файлом и жесткой ссылкой такая же, как разница между вами и строкой с вашим именем в телефонной книге.
Файл является анонимной частью данных. Вот и все. Файл не является индексом, у файла есть индекс, так же, как вы не являетесь номером социального страхования, у вас есть SSN.
Жесткая ссылка - это имя файла. Файл может иметь много имен.
Да.
Нет. Жесткая ссылка не имеет номера индекса, поскольку это не файл. Только файлы имеют номера инодов.
Жесткая ссылка связывает имя с номером инода.
Да.
Нет, у файла есть индекс, это не индекс.
источник
Жесткая ссылка - это запись в каталоге. Файл может иметь несколько записей каталога, если он присутствует под разными именами или в разных каталогах. Запись в каталоге называется «жесткой ссылкой», когда она помещается в связь с другими записями в каталоге для того же файла.
Индод содержит метаданные файла, отличные от его имени и содержимого (расположение содержимого, разрешения, метки времени и т. Д.). Там один индекс на файл. (Не все файловые системы помещают метаданные в четко идентифицируемое пространство на диске, которое можно назвать «inode», но это обычная архитектура.) Запись каталога связывает имя с inode. Возможно, что более одной записи в каталоге ссылаются на один и тот же индекс, отсюда и термин «ссылка». Такая ссылка называется «жесткой ссылкой» в противоположность «мягким ссылкам» или «символическим ссылкам», которые не говорят «для этого имени, используйте этот индекс», но «для этого имени ищите это другое имя».
Думайте о файлах как о комнатах, а записи в каталогах - как о дверях. «Открыть файл
/foo/bar
» означает «пойти в коридор/foo
и пойти в комнатуbar
». «Идти в комнатуbar
» на самом деле означает «открыть дверь с пометкойbar
и войти в комнату», но «пойти в комнатуbar
» - это ничем не примечательный способ сказать то же самое более коротким способом. Можно иметь более одной двери, ведущей в одну комнату.Когда вы создаете жесткую ссылку на существующий файл (
ln existing new
), вы создаете вторую ссылку на тот же файл, т.е. вы создаете новую запись каталога, которая ссылается на уже существующий файл. После создания две записи каталога имеют одинаковый статус: не существует ни одной, которая является «первичной», а одна, которая является «вторичной», это просто обе ссылки на один и тот же файл.Вы также можете удалить все ссылки на файл, не удаляя сам файл. Это происходит, если вы удаляете файл (то есть вы удаляете все его записи в каталоге), пока программа все еще имеет открытый файл. Файл остается в файловой системе, он фактически удаляется только тогда, когда последний процесс, открывший файл, закрывает его. В метафоре «комната и двери» комната, в которой нет дверей, все еще занимает место.
источник
В дополнение ко всем другим ответам я хочу отметить следующие важные свойства:
Мягкая ссылка является истинной ссылкой, то есть это небольшой файл, который содержит путь. Разрешение программной ссылки происходит прозрачно для приложения: если процесс открывает файл, скажем
/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
) и сама ОС не готовы иметь дело.источник
Простой ответ:
Запись файла в каталоге является жесткой ссылкой на этот файл.
Некоторые файлы имеют более одной такой жесткой ссылки, так как допускается несколько жестких ссылок на один и тот же файл.
источник
В первые дни Unix файлы внутри были inode на конкретном диске. Имена файлов были более дружественным способом доступа к ним.
Жесткой ссылкой было присвоение более одного имени файла для индекса. Вы можете создать файл, жестко связать с ним второе имя и удалить первое имя, и это будет неотличимо от простого создания файла со вторым именем на первом месте.
Действительно, системный вызов, который программа должна использовать для удаления файла, это «unlink (2)». Данные не исчезают до тех пор, пока фамилия не будет удалена из индекса. (и индекс не открывается каким-то процессом)
Это то, что облегчает Linux обновлять вещи, пока еще работают программы. Если в процессе выполняется исполняемый файл и происходит обновление, тогда имя программы используется повторно, но индекс, содержащий старую версию, все еще существует, поэтому он может продолжать работать. И когда последний процесс, выполняющий эту старую версию, останавливается, это хранилище старой версии освобождается.
Мягкие ссылки появились потому, что когда у вас есть единое файловое дерево с несколькими точками монтирования, вы не можете создать жесткую ссылку с одного жесткого диска на инод на другом. Так что мягкие ссылки были изобретены.
источник
early days
почему сейчас все по-другому? ваш ответ, похоже, не отражает эту точку зрения?Файл - это данные, записанные на диске. На эти данные ссылается его inode, который содержит метаданные о файле, сообщающие системе, какие блоки на диске используются этим файлом, среди прочего. Жесткая ссылка указывает на номер индекса этого файла.
Технически, да, вы создаете новый файл, но весь этот файл содержит номер инода для файла, на который он ссылается, и его имя. Лучше думать об этом как о создании указателя на индекс или указателя на файл.
источник
Файл - это широко распространенное понятие о записях в файловой системе.
Обычно это каталог , обычный файл (жесткая ссылка) и символическая ссылка (мягкая ссылка). И может даже включать устройство и розетку.
Поскольку даже символическая ссылка обычно считается файлом, сама жесткая ссылка также может учитываться как файл. Вы можете сказать, что это файл, независимо от того, является ли это жесткой или мягкой ссылкой.
Эта концепция немного двусмысленна, поэтому можно также сказать, что запись inode - это файл, хотя на самом деле вы можете ссылаться на данные.
Если вы программист на C ++ или Java, вы можете прочитать о std :: filesystem :: file_type , java.io.File и java.nio.file.Files .
Подробную информацию о различиях между жесткой ссылкой и мягкой ссылкой можно найти в ссылке в комментарии infixed.
источник
Разница между «файлом» с заданным именем и «жесткой ссылкой» заключается в истории. (Обычный) файл с заданным именем создается с помощью системного вызова creat, жесткая ссылка создается с помощью системного вызова link.
Однако, в то время как люди обсуждают и запоминают историю записей каталога и соответственно называют их файлами и жесткими ссылками, файловая система этого не делает. Записи каталога «оригинальный файл» и «жесткая ссылка» абсолютно неразличимы по качеству: оба устанавливают ссылку между именем файла и индексом файла, и как только последняя такая ссылка исчезает (ссылки - это не просто имена файлов для файл, а также файловые дескрипторы, с помощью которых можно получить доступ к открытому файлу), файл для несвязанного инода считается удаленным, а индекс и связанное файловое пространство освобождаются.
Таким образом, когда люди противопоставляют «файлы» и «жесткие ссылки», первое возникло с «числом ссылок 1», а все остальные появились с большим количеством ссылок. Разница носит академический характер, и, действительно, переименование файла в одно время заключалось в создании жесткой ссылки для целевого имени, а затем в удалении ссылки для исходного имени. В настоящее время обычно используется один системный вызов, который делает это атомарно.
источник