Я использую Ubuntu 12.04. Когда я пытаюсь создать жесткую ссылку для любой директории, она не работает. Я могу создать жесткие ссылки для файлов внутри границы файловой системы. Я знаю причину, по которой мы не можем создавать жесткие ссылки для файлов за пределами файловой системы.
Я попробовал эти команды:
$ ln /Some/Direcoty /home/nischay/Hard-Directory
hard 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?
filesystem
directory
hard-link
Nischay
источник
источник
ln -F <src> <dst>
и это может сработать. Конечно, раньше он работал на суперпользователя в старых версиях Unix. Кто-нибудь помнит, был ли это UCB или System V? Да, плохие вещи могут случиться, но обычно нет. Насколько я помню,rmdir
знал , что не следует удалять прошлые жесткие ссылки. Тем не менее, пользователи могут запутаться и удалить вещи по ошибке.rmdir
обрабатывать жесткие ссылки особым образом? Жесткая ссылка - это обычная ссылка, но дополнительная. Даже нелегко узнать, существуют ли необычные дополнительные ссылки без дополнительных записей.rmdir
можете сказать, есть ли в каталоге ссылки из других мест. Рекурсивное удалениеrm -r
должно быть закодировано с осторожностью, чтобы быть уверенным, что оно будет работать правильно даже в случае ошибок типа «отказано в разрешении». Кстати, UCB = BSD, дох!ln -F
на каталогах, и это работает. Но вы не рискуете впоследствии удалить каталог, опасаясь испортить файловую систему.Ответы:
Жесткие ссылки на каталоги нарушают файловую систему несколькими способами
Они позволяют создавать петли
Жесткая ссылка на каталог может ссылаться на самого родителя, который создает цикл файловой системы. Например, эти команды могут создать цикл с обратной ссылкой
l
:Файловая система с циклом каталогов имеет бесконечную глубину:
Избежать бесконечного цикла при обходе такой структуры каталогов довольно сложно (хотя, например, POSIX требует
find
этого).Файловая система с такой жесткой ссылкой больше не является деревом, потому что дерево по определению не должно содержать цикл.
Они нарушают однозначность родительских каталогов
В цикле файловой системы существует несколько родительских каталогов:
В первом случае
/tmp/a
это родительский каталог/tmp/a/b
.Во втором случае
/tmp/a/b/l
это родительский каталог/tmp/a/b/l/b
, который совпадает с/tmp/a/b
.Таким образом, у него есть два родительских каталога.
Они умножают файлы
Файлы идентифицируются путями после разрешения символических ссылок. Так
это разные файлы.
Существует бесконечно много дальнейших путей к файлу. Конечно, они одинаковы по количеству инодов. Но если вы явно не ожидаете циклов, нет причин проверять это.
Жесткая ссылка на каталог также может указывать на дочерний каталог или каталог, который не является ни дочерним, ни родительским. В этом случае файл, являющийся дочерним по отношению к ссылке, будет реплицирован на два файла, идентифицированных двумя путями.
Ваш пример
Как тогда могут работать мягкие ссылки на каталоги?
Путь, который может содержать программные ссылки и даже программно-связанные циклы каталогов, часто используется только для идентификации и открытия файла. Его можно использовать как обычный линейный путь.
Но есть и другие ситуации, когда для сравнения файлов используются пути. В этом случае символические ссылки в пути могут быть разрешены в первую очередь, преобразуя его в минимальное и обычно согласованное представление, создавая канонический путь :
Это возможно, потому что все программные ссылки могут быть расширены до путей без ссылки. После этого со всеми мягкими ссылками в пути, оставшийся путь является частью дерева, где путь всегда однозначен.
Команда
readlink
может разрешить путь к своему каноническому пути:Мягкие ссылки отличаются от того, что использует файловая система
Мягкая ссылка не может вызвать все проблемы, потому что она отличается от ссылок внутри файловой системы. Его можно отличить от жестких ссылок и при необходимости разрешить по пути без символических ссылок.
В некотором смысле добавление символических ссылок не меняет основную структуру файловой системы - она сохраняет ее, но добавляет дополнительную структуру, например уровень приложения.
От
man readlink
:источник
«Вы вообще не должны использовать жесткие ссылки в любом случае» - это слишком широко. Вы должны понимать разницу между жесткими ссылками и символическими ссылками и использовать их по мере необходимости. Каждый из них имеет свои преимущества и недостатки:
Симлинки могут:
Жесткие ссылки могут:
Жесткие ссылки особенно полезны при выполнении приложений «копирование при записи». Они позволяют сохранять резервную копию структуры каталогов, используя только пространство для файлов, которые меняются между двумя версиями.
Команда
cp -al
особенно полезна в этом отношении. Он создает полную копию структуры каталогов, где все файлы представлены жесткими ссылками на исходные файлы. Затем вы можете приступить к обновлению файлов в структуре, и только файлы, которые вы обновите, займут дополнительное пространство. Это особенно полезно при сохранении резервных копий нескольких поколений.источник
ln -s "Don't use this directory" README
законно Фактически, если вы подумаете об этом, каталог может использоваться как реляционная база данных и вообще не содержать никаких реальных файлов.К вашему сведению, вы можете добиться того же, что и жесткие ссылки для каталогов, используя mount:
Это очень опасно, потому что большинство инструментов и программ не будут знать о привязке . Однажды я сделал что-то подобное в приведенном выше примере, а затем приступил к
rm -rf /home/user
. К счастью, не было ничего уместного в/var/www
.источник
mount --bind <src> <dest>
. Используйте с осторожностью, чтобы не вытеретьsrc
;)mount: unknown filesystem type 'bind'
mount -o bind src dest
rm -rf
проблемы. superuser.com/questions/320415/…Причина, по которой жесткие ссылки на каталоги не разрешены, является немного технической. По сути, они нарушают структуру файловой системы . Как правило, вы не должны использовать жесткие ссылки в любом случае. Символьные ссылки обеспечивают большую часть той же функциональности, не вызывая проблем (например
ln -s target link
).источник