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

TL; DR: Если вы хотите запустить chmod для файла в GNU / Linux, вы должны быть root или владелец файла.

На странице руководства chmod (2) (системный вызов chmod):

Эффективный UID вызывающего процесса должен соответствовать владельцу файла , или процесс должен быть привилегированным (Linux: он должен иметь возможность CAP_FOWNER ).

На странице руководства features (7) :

CAP_FOWNER

  • Обход проверок разрешений для операций, которые обычно требуют, чтобы UID файловой системы процесса соответствовал UID файла (например, { {1}} chmod (2), utime (2)), за исключением операций, охватываемых CAP_DAC_OVERRIDE и CAP_DAC_READ_SEARCH; [...]

Из setfacl (1) страница руководства:

РАЗРЕШЕНИЯ

Владелец файла и процессы, способные выполнять CAP_FOWNER, получают право на изменение ACL файла. Это аналогично разрешениям , необходимым для доступа к файловому режиму. (В текущих системах Linux root - единственный пользователь с возможностью CAP_FOWNER .)

37
22.02.2017, 20:05
8 ответов

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

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

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

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

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

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

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

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

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

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

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

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

Да.

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

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

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

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

Да.

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

Нет. У файла есть индексный дескриптор, он не является индексным дескриптором.

61
27.01.2020, 19:36

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

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

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

1
27.01.2020, 19:36

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

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

1
27.01.2020, 19:36

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

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

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

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

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

18
27.01.2020, 19:36

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

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

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

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

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

3
27.01.2020, 19:36

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

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

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

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

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

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

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

8
27.01.2020, 19:36

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

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

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

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

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

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

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

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

1
27.01.2020, 19:36

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

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

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

6
27.01.2020, 19:36

Теги

Похожие вопросы