Почему жесткие ссылки действительны только в одной файловой системе?

22

Я читаю это вступление в командную строку Марка Бейтса.

В первой главе он упоминает, что жесткие ссылки не могут охватывать файловые системы.

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

Я знаю только одну файловую систему. Тот, который начинается с root ( /). Это утверждение, что жесткие ссылки не могут охватывать файловые системы, не имеет смысла для меня.

Статья Википедии о файловых системах Unix также не помогает.

Антон Парас
источник

Ответы:

29

Надеюсь, я смогу ответить на это так, чтобы это имело смысл для вас. Файловая система в Linux, как правило, состоит из раздела, который отформатирован одним из различных способов (должен любить!), В котором вы храните свои файлы. Будь то ваши системные файлы или ваши личные файлы ... все они хранятся в файловой системе. Эту часть вы, похоже, поняли.

Но что делать, если вы разбили свой жесткий диск на несколько разделов (например, Apple Pie разрезать на части) или добавили дополнительный жесткий диск (возможно, USB-накопитель?). Ради аргумента, у них всех также есть файловые системы.

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

image.jpg             image2.jpg
          \           /
           [your data]

Здесь, image.jpg и image2.jpg указывают непосредственно на ваши данные. Они оба жесткие ссылки. Тем не мение...

image.jpg    <-----------  image2.jpg
           \ 
             [your data]

В этом (сыром) примере image2.jpg не указывает на ваши данные, он указывает на image.jpg ... который является ссылкой на ваши данные.

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

Надеюсь, это поможет лучше понять.

dubkat
источник
Спасибо. Я не осознавал, что разные файловые разделы называются «файловыми системами».
Антон Парас
1
одна из вещей, которую вы можете сделать с разделом - это поместить в него файловую систему, есть другие места, где вы можете поместить файловые системы и другие вещи, которые вы можете сделать с разделами, но наиболее распространенный вариант - это тот, который вы можете использовать.
Джейсен
10
Есть одна файловая иерархия, которая начинается с "/". На нем будет смонтирована одна или несколько файловых систем
mpez0
@ mpez0: Даже нет, например, с помощью chroot(2)реальной или контейнеризации вы можете иметь несколько иерархий, которые могут не иметь ничего общего друг с другом.
Кевин
@Kevin, chrootизолирует часть иерархии для процесса и его потомков, но родительский элемент все еще имеет одну полную иерархию. Контейнерирование может сделать это, в зависимости от того, насколько близко это к виртуальной машине. Но сколько деталей можно добавить в комментарий? Спасибо,
mpez0
23

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

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

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

Разница между soft-ссылкой и hard-ссылкой

Вывод:

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

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

Факундо Виктор
источник
1
Хороший краткий ответ.
Дубкат
Что произойдет, если другая файловая система (скажем, USB) будет иметь файл с тем же ИМЯ, к которому наша символическая ссылка подключена в нашей файловой системе?
Йозеф Климук
@JosefKlimuk, мягкая ссылка будет указывать на путь, скажем так /mnt/myfile. Если вы смонтируете другую файловую систему в /mnt/. Мягкая ссылка будет разрешена для записи смонтированной файловой системы в /mnt/. Таким образом, если вы смонтировали файловую систему с вашего USB-устройства /mnt, программная ссылка разрешит запись в этой файловой системе.
Факундо Виктор
2

Корневая файловая система может состоять из нескольких файловых систем; /usr/localможет быть смонтирован в отдельном разделе и /homeможет находиться в другом разделе сетевого диска где-то еще. В этом случае жесткая ссылка /usr/local/bin/git(например) не может быть создана вне /usr/local, потому что она будет охватывать файловые системы .

Причина этого заключается в том, что дескрипторы выделяются отдельно /, /usr/localи /home(опять же , в этом примере), а также при создании жесткой ссылки вы на самом деле просто сделать дополнительное имя для дескриптора.

Кусалананда
источник
2

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

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

Supercat
источник
Хороший вопрос, но слишком касательный, чтобы быть хорошим ответом.
Джо
@Joe: Разрешение жестких ссылок на кросс-файловые системы может привести к ряду технических трудностей, но большинство из них можно преодолеть, что поднимает вопрос о том, есть ли веские причины, по которым их не должно быть. Проблема поддержания активности может показаться неясной, но в отличие от других проблем она может быть решена только путем введения строгих семантических ограничений на использование таких ссылок, что серьезно ограничит их ценность.
суперкат
Хорошая точка зрения. Файловая система может быть смонтирована на другом устройстве и модифицирована, поэтому inode и ссылки могут быть «не синхронизированы». Каждая файловая система может иметь GUID, и ссылка может включать этот GUID для отслеживания inode в файловых системах. Также может быть какой-то журнал в FS, а затем, когда он смонтирован, хост-системе не нужно будет сканировать его, а может просто прочитать журнал и «догнать» изменения связывания inode (когда мы его очищаем, хотя?). Суть в том, что базовая FS должна быть изменена нетривиальными способами, и она будет работать только на совместимых файловых системах.
Рольф
1

Один номер индекса используется для представления файла в каждой файловой системе. Все жесткие ссылки основаны на номере инода. Ссылка на файловую систему здесь .

ЦКМ
источник