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