Directory hardlinks break the filesystem in multiple ways
They allow you to create loops
A hard link to a directory can link to a parent of itself, which creates a file system loop. For example, these commands could create a loop with the back link l
:
mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l
A filesystem with a directory loop has infinite depth:
cd /tmp/a/b/l/b/l/b/l/b/l/b
Avoiding an infinite loop when traversing such a directory structure is somewhat difficult (though for example POSIX requires find
to avoid this).
A file system with this kind of hard link is no longer a tree, because a tree must not, by definition, contain a loop.
They break the unambiguity of parent directories
With a filesystem loop, multiple parent directories exist:
cd /tmp/a/b
cd /tmp/a/b/l/b
In the first case, /tmp/a
is the parent directory of /tmp/a/b
.
In the second case, /tmp/a/b/l
is the parent directory of /tmp/a/b/l/b
, which is the same as /tmp/a/b
.
So it has two parent directories.
Even without loops, multiple hardlinks to the same directory will create ambiguous parent directories.
They multiply files
Files are identified by paths, after resolving symlinks. So
/tmp/a/b/foo.txt
/tmp/a/b/l/b/foo.txt
are different files.
There are infinitely many further paths of the file. They are the same in terms of their inode number of course. But if you do not explicitly expect loops, there is no reason to check for that.
A directory hardlink can also point to a child directory, or a directory that is neither child nor parent of any depth. In this case, a file that is a child of the link would be replicated to two files, identified by two paths.
Your example
$ ln /Some/Directory /home/nischay/Hard-Directory
$ echo foo > /home/nischay/Hard-Directory/foobar.txt
$ diff -s /Some/Directory/foobar.txt /home/nischay/Hard-Directory/foobar.txt
Files /Some/Directory/foobar.txt and /home/nischay/Hard-Directory/foobar.txt are identical
$ echo bar >> /Some/Directory/foobar.txt
$ diff -s /Some/Directory/foobar.txt /home/nischay/Hard-Directory/foobar.txt
Files /Some/Directory/foobar.txt and /home/nischay/Hard-Directory/foobar.txt are identical
$ cat /Some/Directory/foobar.txt
foo
bar
How can soft links to directories work then?
A path that may contain softlinks and even soft linked directory loops is often used just to identify and open a file. It can be used as a normal, linear path.
But there are other situations, when paths are used to compare files. In this case, symbolic links in the path can be resolved first, converting it to a minimal, and commonly agreed upon representation creating a canonical path:
This is possible, because the soft links can all be expanded to paths without the link. After doing that with all soft links in a path, the remaining path is part of a tree, where a path is always unambiguous.
The command readlink
can resolve a path to its canonical path:
$ readlink -f /some/symlinked/path
Soft links are different from what the filesystem uses
A soft link cannot cause all the trouble because it is different from the links inside the filesystem. It can be distinguished from hard links, and resolved to a path without symlinks if needed.
In some sense, adding symlinks does not alter the basic file system structure - it keeps it, but adds more structure like an application layer.
From 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
[ ... ]
ln -F <src> <dst>
and it might work. Certainly, it used to work for the superuser in older versions of Unix. Does anyone remember whether that was UCB or System V? Yes, bad things could happen, but usually not. As I recall,rmdir
knew not to carry on deleting past a hard link. However, users could get confused and delete things in error.rmdir
handle hard links in a special way? A hard link is just a normal link - but an additional one. It is not even easy to find out whether an unusual extra links exist without extra recordings.rmdir
can tell whether the directory has links from other places. Recursive removal,rm -r
, must be coded with care, to be sure it will act correctly even should there be errors like "permission denied". BTW, UCB = BSD, doh!ln -F
on directories and have it work. But you don't dare delete the directory afterwards for fear of corrupting the file system.