Search code examples
linuxfilesystemsmount

Create a loop in a Linux filesystem


How do I create a loop in the Linux filesystem? I want to break the directed acyclic graph (DAG) property of the Linux filesystem. Is this possible? I have seen this condition once when I installed the scratchbox cross compiler on my Ubuntu.

I don't know how to reproduce it now.


Solution

  • Some other responders have already answered how to set up a mount using the loopback device, but you specifically asked about bind mounts, which are a little bit different. If you want to use a bind mount, you just specify --bind in the mount command. For example:

    mount --bind /original/path /new/path
    

    This will make the filesystem location accessible at /original/path also accessible through /new/path. Note that this will not following mountpoints! For example, suppose I have the following mountpoints:

    /something
    /something/underneath/that
    

    Now suppose I make a bind mount for /something:

    mount --bind /something /new_something
    

    I will be able to access files like /something/myfile via the path /new_something/myfile. But I will not be able to access files like /something/underneath/that/otherfile via the path /new_something/underneath/that/otherfile. You must set up a separate bind mount for each filesystem; or if you have a relatively new kernel, you can use rbind mounts, which do follow mountpoints:

    mount --rbind /something /new_something
    

    One caveat about rbind mounts: they do not handle the case where a filesystem is mounted after the rbind is setup. That is, suppose I have a mount like this:

    /something
    

    Then I set up my rbind as above, and then I mount /something/underneath/that: the rbind will not magically make the new mount visible through the rbind location. Also be aware that apparently due to a bug in the kernel, you cannot unmount an rbind mount.

    Also, just in case you meant "How do I set up bind mounts using the mount(2) system call?": you must specify the MS_BIND flag (defined in mount.h) when you call mount(2) for a regular bind mount. For an rbind mount, you must specify MS_BIND and the undocument MS_REC flag (defined in linux/fs.h).

    Hope that helps,

    Eric Melski