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

81

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

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

$ 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.

    
задан Nischay 01.11.2012 в 22:18
источник

4 ответа

71

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

Символы могут:

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

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

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

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

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

    
ответ дан user133232 18.02.2013 в 16:06
источник
109

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

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

Жесткая ссылка на каталог может ссылаться на родителя самого себя, что создает петлю файловой системы. Например, эти команды могут создать цикл с обратной связью 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

Любая команда find без предиката -maxdepth будет работать в бесконечном цикле. Это означает, что вы больше не сможете использовать find , которая является важной командой, в соответствии. Аналогично для не менее важной команды locate .

Дерево, по определению, не имеет циклов, поэтому файловая система больше не является деревом.

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

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

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

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

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

Ваш пример

$ 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
        [  ...  ]
    
ответ дан Volker Siegel 17.09.2014 в 13:06
35

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

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

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

    
ответ дан stackount 07.11.2013 в 18:39
17

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

    
ответ дан astex 01.11.2012 в 22:25