Why are hard links not allowed for directories?

274,101

Solution 1

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.

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
        [  ...  ]

Solution 2

"You generally should not use hard links anyway" is over-broad. You need to understand the difference between hard links and symlinks, and use each as appropriate. Each comes with its own set of advantages and disadvantages:

Symlinks can:

  • Point to directories
  • Point to non-existent objects
  • Point to files and directories outside the same filesystem

Hard links can:

  • Keep the file that they reference from being deleted

Hard links are especially useful in performing "copy on write" applications. They allow you to keep a backup copy of a directory structure, while only using space for the files that change between two versions. Note that the implementation must first break the link (or modifications will apply to the original file, too!).

The command cp -al is especially useful in this regard. It makes a complete copy of a directory structure, where all the files are represented by hard links to the original files. You can then proceed to update files in the structure (after creating actual copies of only these files), and only the files that you update will take up additional space. This is especially useful when maintaining multigenerational backups.

Solution 3

FYI, you can achieve the same thing as hard links for directories by using mount:

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

This is very dangerous because most tools and programs will not be aware of the binding. I once did something like in the above example and then proceeded to rm -rf /home/user. Luckily, there was nothing relevant in /var/www.

Solution 4

The reason hard-linking directories is not allowed is a little technical. Essentially, they break the file-system structure. You should generally not use hard links anyway. Symbolic links allow most of the same functionality without causing problems (e.g ln -s target link).

Share:
274,101

Related videos on Youtube

Nischay
Author by

Nischay

Updated on September 18, 2022

Comments

  • Nischay
    Nischay almost 2 years

    I am using Ubuntu 12.04. When I try to create a hard link for any directory, it fails. I can create hard links for files inside file system boundary. I know the reason why we cannot create hardlinks for files beyond file system.

    I tried these commands:

    $ ln /Some/Directory /home/nischay/Hard-Directory
    hard link not allowed for directory
    $ sudo ln /Some/Directory /home/nischay/Hard-Directory
    [sudo] password for nischay: 
    hard link not allowed for directory
    

    I just want to know the reason behind this. Is it same for all GNU/Linux distros and Unix flavours (BSD, Solaris, HP-UX, IBM AIX) or only in Ubuntu or Linux?

    • Admin
      Admin over 11 years
    • Admin
      Admin over 9 years
      Try 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.
    • Admin
      Admin over 9 years
      @StevePitchers How can 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.
    • Admin
      Admin over 9 years
      Each node stores the number of hard links that point to it: the contents are only released once there are no remaining links. So 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!
    • Admin
      Admin over 8 years
      I have done ln -F on directories and have it work. But you don't dare delete the directory afterwards for fear of corrupting the file system.
  • Sander Steffann
    Sander Steffann over 10 years
    Hard links have good use cases. Saying you should generally not use them is a little too broad.
  • msb
    msb over 10 years
    +2 for providing the link that actually answers the OP's question (and mine), -1 for emitting an opinion ("You should generally not use hard links anyway" - if it had links to support it, it would be ok). Which was good, because I can't give +2 anyway. ;D
  • Alexander Grosul
    Alexander Grosul over 10 years
    I've used mount --bind <src> <dest>. Use with care not to wipe the src ;)
  • Charlie Parker
    Charlie Parker about 10 years
    the link " they break the file-system structure" does not work.
  • Udi Idan
    Udi Idan about 10 years
    regarding the last paragraph, if you edit "copied" hardlinked file, the original file is also changed - see unix.stackexchange.com/questions/70531/…
  • Oxwivi
    Oxwivi almost 10 years
    Try to summarize the contents of the link in the answer, and keep the link as a reference. This a Stack Exchange good practice to avoid link rot, thanks.
  • dev
    dev about 9 years
    Why can't a soft link do all this?
  • Volker Siegel
    Volker Siegel about 9 years
    @Tanay Right, it could help the expanation to compare it to similar cases with soft links. Ill try.
  • matty
    matty almost 9 years
    This description of hard links is rather misleading. It's basically true that hard links "keep the file that they reference from being deleted", but that's just a side effect of hard links. It's certainly NOT true that you can create hard links in one directory, change the "original" file, and then expect the hard links to somehow point to the old content. In fact, the guiding truth of hard links is the fact that it's not a link at all, at least not any more so than the original "file", which is just a name pointing to a file. A hard link is simply another name pointing to the same file.
  • Mark
    Mark almost 9 years
    The backup idea is good and I actually use that a lot, but I think users should be warned that changing a file will also change the backup.
  • Wizek
    Wizek over 8 years
    I get: mount: unknown filesystem type 'bind'
  • Edward Falk
    Edward Falk over 8 years
    Heck, a symlink need not point to anything at all. ln -s "Don't use this directory" README is legitimate. In fact, if you think about it, a directory can be used as a relational database and not contain any actual files at all.
  • STW
    STW about 8 years
    A bit off-topic, but if you're looking for a backup solution that leverages links take a look at github.com/laurent22/rsync-time-backup -- it creates point-in-time snapshots that will hardlink unchanged files
  • Mat M
    Mat M over 7 years
    on Busybox, it it mount -o bind src dest
  • inetknght
    inetknght about 7 years
    Exactly how does this pertain to only directories? The way I understand it, these problems are also a problem for hardlinked files too. Moreover, I see hardlinking as an easy way to change a given directory's permission to allow others inside, without having to allow them inside the parent chain too. Sounds very useful if you don't have the ability to add/modify groups...
  • Eliran Malka
    Eliran Malka over 6 years
    well done @CharlieParker; best unintended (?) ironic comment of all times :)
  • hanshenrik
    hanshenrik over 6 years
    @MatM same with Debian
  • wjandrea
    wjandrea over 6 years
    -1 This doesn't answer the question, and some info is plain wrong.
  • Damien
    Damien about 6 years
    great answer, but then... how did Apple solve these issues for Time Machine ?
  • Volker Siegel
    Volker Siegel about 6 years
    Sounds very interesting! But I know nothing about what the issue is - can you give me a hint?
  • zanerock
    zanerock over 5 years
    If you only need to mount for read, you can set permissions on the mount point and avoid the rm -rf problem. superuser.com/questions/320415/…
  • ceving
    ceving almost 5 years
    Hard links do not "copy on write".
  • Iluvathar
    Iluvathar almost 5 years
    Your "They multiply files" is also true for hard links to files—yet these are still allowed.
  • Manchineel
    Manchineel over 4 years
    @EliranMalka Maybe no filesystem structure was broken, but apparently a hypertextual one was
  • flarn2006
    flarn2006 over 3 years
    Can't you create loops anyway using FUSE?
  • Volker Siegel
    Volker Siegel over 3 years
    @flarn2006 Good point. I assume you mean loop involving a FUSE filesystem and the underlying filesystem. Do you know what happens or have you seen it fail?
  • FantomX1
    FantomX1 over 2 years
    Good, but ("recursive) mounts are not capable/allowed, of breaking the filesystem similarly as hardlinks?
  • Jim Balter
    Jim Balter over 2 years
    Does not answer the question.