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

Я использую 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?

130
задан 22 April 2018 в 00:03

4 ответа

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

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

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

0
ответ дан 22 April 2018 в 00:03

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

Симлинки могут:

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

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

  • Сохранить файл, на который они ссылаются, от удаления

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

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

0
ответ дан 22 April 2018 в 00:03

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

0
ответ дан 22 April 2018 в 00:03

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

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

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

mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l

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

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

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

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

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

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

cd /tmp/a/b
cd /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.txt
foo
bar

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

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

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

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

Команда 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
        [  ...  ]
0
ответ дан 22 April 2018 в 00:03

Другие вопросы по тегам:

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