Почему жесткие ссылки не разрешены для каталогов?

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

Я попробовал эти команды:

$ ln /Some/Direcoty /home/nischay/Hard-Directoryhard link not allowed for directory$ sudo ln /Some/Direcoty /home/nischay/Hard-Directory[sudo] password for nischay: hard link not allowed for directory

Я просто хочу знать причину этого. Является ли это одинаковым для всех дистрибутивов GNU / Linux и версий Unix (BSD, Solaris, HP-UX, IBM AIX) или только в Ubuntu или Linux?

Жесткие ссылки на каталог разрушают файловую систему несколькими способами

Они позволяют вам создавать циклы

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

mkdir -p /tmp/a/bcd /tmp/a/bln -d /tmp/a l

Файловая система с циклом каталогов имеет бесконечную глубину:

cd /tmp/a/b/l/b/l/b/l/b/l/b

Избежать бесконечного цикла при обходе такой структуры каталогов несколько сложно (хотя, например, POSIX требует find чтобы избежать этого).

Файловая система с такой жесткой связью больше не является деревом, потому что дерево по определению не должно содержать цикл.

Они нарушают однозначность родительских каталогов

При цикле файловой системы существует несколько родительских каталогов:

cd /tmp/a/bcd /tmp/a/b/l/b

В первом случае, /tmp/a является родительским каталогом /tmp/a/b.
Во втором случае, /tmp/a/b/l является родительским каталогом /tmp/a/b/l/b, что то же самое , что /tmp/a/b.
Таким образом, у него есть два родительских каталога.

Они размножают файлы

Файлы идентифицируются по путям после разрешения символических ссылок. Так

/tmp/a/b/foo.txt/tmp/a/b/l/b/foo.txt

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

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

Ваш пример

$ ln /Some/Direcoty /home/nischay/Hard-Directory$ echo foo > /home/nischay/Hard-Directory/foobar.txt$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt$ echo bar >> /Some/Direcoty/foobar.txt$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt$ cat /Some/Direcoty/foobar.txtfoobar

Как тогда могут работать мягкие ссылки на каталоги?

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

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

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

Команда readlink может разрешить путь к его каноническому пути:

$ readlink -f /some/symlinked/path

Программные ссылки отличаются от того, что использует файловая система

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


От man readlink:

 NAME        readlink - print resolved symbolic links or canonical        file names SYNOPSIS        readlink [OPTION]... FILE... DESCRIPTION        Print value of a symbolic link or canonical file name        -f, --canonicalize               canonicalize by  following  every  symlink  in               every component of the given name recursively;               all but the last component must exist        [  ...  ]

"Вы, как правило, не должны использовать жесткие ссылки в любом случае" является чрезмерно широким. Вы должны понимать разницу между жесткими ссылками и символическими ссылками и использовать каждую из них соответствующим образом. Каждый из них имеет свой собственный набор преимуществ и недостатков:

Символические ссылки могут:

  • Указывайте на каталоги
  • Указывать на несуществующие объекты
  • Указывают на файлы и каталоги за пределами одной и той же файловой системы

Жесткие ссылки могут:

  • Не допускайте удаления файла, на который они ссылаются

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

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

К вашему сведению, вы можете добиться того же, что и жесткие ссылки для каталогов, используя mount:

mount -t bind /var/www /home/user/workspace/www

Это очень опасно, потому что большинство инструментов и программ не будут знать о привязке. Однажды я сделал что-то вроде приведенного выше примера, а затем приступил к rm -rf /home/user. К счастью, в /var/www.

Причина, по которой жесткие ссылки на каталоги запрещены, немного техническая. По существу, они нарушают структуру файловой системы. В любом случае, как правило, вам не следует использовать жесткие ссылки. Символические ссылки обеспечивают большую часть той же функциональности, не вызывая проблем (например ln -s target link).

Я сделал `ln -F" для каталогов, и это сработало. Но вы не осмеливаетесь удалить каталог после этого, опасаясь повредить файловую систему.

Try `ln -F

Каждый узел хранит количество жестких ссылок, которые указывают на него: содержимое освобождается только после того, как не останется оставшихся ссылок. Таким образом, rmdir может определить, есть ли в каталоге ссылки из других мест. Рекурсивное удаление, rm -r, должно быть закодировано с осторожностью, чтобы быть уверенным, что оно будет действовать правильно, даже если будут такие ошибки, как “отказано в разрешении”. Кстати, UCB = BSD, doh!

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