how do I check if a bind mount on linux is private or shared?

The mount command allows us to make a bind mount shared, slave, shared+slave, private or unbindable, however, I was unable to figure for a given mount point what is type of subtree rooted at the bind-mount (shared, slave, private, shared+slave or unbindable). How do I find if a bind mount is a slave or private?


Solution 1:

The answer is in the mount(8) manual page as well:

Use findmnt -o TARGET,PROPAGATION to see the current propagation flags.

An example:

$ findmnt -o TARGET,PROPAGATION /opt
TARGET PROPAGATION
/opt   shared

$ sudo mount -o bind /opt /mnt
$ sudo mount --make-slave /opt
$ findmnt -o TARGET,PROPAGATION /opt
TARGET PROPAGATION
/opt   private,slave

$ sudo umount /mnt
$ findmnt -o TARGET,PROPAGATION /opt
TARGET PROPAGATION
/opt   private

Check the findmnt manual page for other options.

For reference, these examples are using:

$ findmnt --version
findmnt from util-linux 2.27.1

Solution 2:

Alternatively to dawud's answer, you can directly ask the kernel like this:

# cat /proc/1/mountinfo
14 19 0:14 / /sys rw,nosuid,nodev,noexec,relatime shared:7 - sysfs sysfs rw
15 19 0:3 / /proc rw,nosuid,nodev,noexec,relatime shared:12 - proc proc rw
[...]

You can see from the 7th field that my /sys filesystem is shared (just like /proc).

Also, it is and in peer group 7 (mounts in the same peer group propagate events to each other).

The number in /proc/1/mountinfo is the PID of a process, because processes can be in different mount namespaces and "see" different results. You may want to use another PID, i.e. if you are working with containers. Otherwise, 1 is simple and straightforward.

Shared mounts are available since Linux kernel version 2.6.15.