I am trying to understand difference between using ln -s and mount --bind. In basic scenario I can use both to access one directory from somewhere else. In what scenarios those two will behave differently ?

  • 7
    I should warn against rm -r on a mount --bind. With a ln, it removes the link, whereas for a --bind, it has the same effect as running the rm -r on the target. Not good, as I found shortly before rebuilding one of my servers... – Mark K Cowan Dec 8 '14 at 12:18
  • @MarkKCowan that's true unless you created a hard link. – JohnnyQ Jul 15 '16 at 4:31
  • @JohnnyQ Can't hardlink directories – Mark K Cowan Jul 15 '16 at 8:56

They will behave differently in at least two cases:

  • In a chroot, if the link target is outside the chroot, the link will be dead. A bind mount will still be accessible.
  • Several programs can distinguish between symbolic links and actual directories or files. Few (if any) can distinguish between a directory or file and the one mounted on it. This also extends to symbolic links to something (A) which have something else (B) mounted on them. The link will show the contents of mount target (B) instead of the original (A).

Also, you can bind mount a directory or file on an existing directory or file, masking the original contents (rendering the original contents inaccessible unless the original was bind mounted elsewhere). A symbolic link requires that the original be moved or deleted.

| improve this answer | |

Well, ln -s creates a symbolic link, whereas mount --bind creates a mount.

A symbolic link is a special type of file. If you do ln -s /var/target /var/link, then /var/link will be a file containing the path "/var/target" in it. The only difference between a symbolic link and an ordinary file is that when a program tries to perform an operation on a symbolic link, the operation is usually performed on the target instead of the file. So now if you do ls /var/link, the ls program will try to get a directory listing for /var/link, but will actually get a directory listing for /var/target instead.

Symbolic links are still just files, though. They can be renamed and deleted and all that jazz. Note that you can't create a symbolic link (or an ordinary file, for that matter) called /var/link if there's already a file called /var/link; you'd need to get rid of it first.

A mount isn't a file; it's a record that the kernel keeps in memory. If you do mount --bind /var/target /var/mount, the kernel will record the fact that /var/mount is now a new name for /var/target. (I don't know the details; in particular, I don't know if mounting something in a subdirectory of /var/target will make it show up in /var/mount as well, or why or why not. Edits to this answer would be appreciated.) So now if you do ls /var/mount, the same thing will happen as if you did ls /var/target, because /var/mount and /var/target are the same directory.

Mounts aren't files. I don't know what would happen if you tried to rename or delete /var/mount. Note that you can't mount anything at /var/mount unless there's already a directory at /var/mount.

| improve this answer | |
  • 1
    I haven't used mount --bind, but I doubt it can replicate the behavior of a symlink like ln -s ../../myfile .. If you move that to another directory, it will point somewhere else because it's a relative link. This can be useful if you need to backup a sub-tree and still have the links work in the backup. – Joe Dec 17 '14 at 4:41

Additionally, ln -s would survive a reboot; whereas mount --bind would not, unless you edit /etc/fstab to make it persistent.

| improve this answer | |

In addition to the other answers. The system does not allow hard link to directory:

# ln mydir mpoint
ln: `mydir': hard link not allowed for directory

The mount let you make hard link-like ie two or more names for same one inode:

# mount -B mydir/ mpoint/
# ls -d -i *
807175  mpoint/  807175  mydir/

(One can find it helps for snapshot-backup with old version of rsync.)

Also, note that this mount is not complete:

# mount -B -oro mydir/ mpoint/
mount: warning: mpoint/ seems to be mounted read-write.
# mount | grep mpoint
/root/learn/mydir on /root/learn/mpoint type none (rw,bind)

So, the mount is still read and write even if I asked for the option ro (read only).

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.