Intereting Posts
Как Linux отличается между открытием файла в режиме чтения и фактическим чтением данных из него? Разделение одного файла на несколько файлов на основе совпадающих строк в Linux Не удается найти Krita в меню «Пуск» (Linux Mint) Самый изящный способ прекратить навязчивую программу Сколько места занимает инодекс? xargs: слишком длинная строка аргументов Запуск Python на ChromeOS Восстановить исходную конфигурацию для каждого пакета в системе У меня есть два адаптера bluetooth для usb, которые не работают (hci1), но, по-видимому, по умолчанию. Как отключить его, чтобы я мог использовать другой (hci0)? Просмотр журналов для последней установки nix-env Последствия безопасности использования неанализированных данных в арифметической оценке оболочки создать хеш md5 из рекурсивного списка файлов, когда некоторые пути имеют пробелы Сколько элементов может хранить массив в unix-скрипте? сортировать часть файла KDE 5 устанавливается без панели задач в Arch Linux

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Да.

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

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

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

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

Да.

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

Нет. В файле есть индекс, он не является inode.

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

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

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

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

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

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

Программная ссылка – это истинная ссылка, то есть это небольшой файл, содержащий имя пути. Решение программной ссылки выполняется прозрачно для приложения: если процесс открывает файл, скажите /this/path/here который является символической ссылкой, указывающей на /that/other/path the /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) для вся история.)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Обычно он включает в себя Directory , Regular File (жесткая ссылка) и Symbolic Link (soft link). И может даже включать устройство и сокет.

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

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

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

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

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

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

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

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

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