在linux上检测绑定挂载

时间:2012-01-03 10:58:16

标签: c++ python c linux

我正在寻找一种方法来确定给定路径是否是绑定挂载点(在linux上)。检测常规安装点的标准技术似乎不起作用。甚至mountpoint命令也无法检测绑定挂载。

3 个答案:

答案 0 :(得分:6)

我不确定应该有办法做到这一点(除了/etc/mtab/etc/fstab之外),因为我知道绑定挂载是一种“硬链接” mount空间(不是文件层次结构),并且没有办法(一旦发生绑定挂载)区分源和目标挂载点。

为什么这么问?从应用程序的角度来看,绑定挂载(IMHO)对于隐藏这些东西非常有用(否则你会使用符号链接 - 甚至是硬链接,在极少数情况下它们是可能的 - 用于目录)

由于你的问题,我刚刚发现的mountpoint似乎看到了一些东西:

% grep /home /etc/fstab
UUID=000008-0003-000c-9ecd-0f1a /home           ext3    defaults        0       2
% grep /usr/src /etc/fstab
/home/Src /usr/src none bind 0 0
% mountpoint /usr/src
/usr/src is a mountpoint
% mountpoint /home/Src
/home/Src is not a mountpoint

通过strace - mountpoint我发现它在lstat&等目录上正在进行statfstat/usr/src系统调用/usr/src/..


(2016年11月补充:)

另请参阅/proc/mounts,例如proc(5)nftw(3)

答案 1 :(得分:0)

您可以通过检查路径及其父路径的设备ID来检测路径是否为挂载点(前提是挂载的文件系统与父目录的设备ID不同 - 我从未尝试过绑定挂载一个目录到它自己!)。

这是一个快速的命令行演示:

$ cut -d ' ' -f2 /proc/mounts | xargs stat -c '%d %n'
18 /sys
4 /proc
6 /dev
19 /dev/pts
20 /run
2049 /
7 /sys/kernel/security
21 /dev/shm
22 /run/lock
23 /sys/fs/cgroup
24 /sys/fs/cgroup/unified
25 /sys/fs/cgroup/systemd
26 /sys/fs/pstore
27 /sys/fs/cgroup/perf_event
28 /sys/fs/cgroup/cpu,cpuacct
29 /sys/fs/cgroup/pids
30 /sys/fs/cgroup/blkio
31 /sys/fs/cgroup/memory
32 /sys/fs/cgroup/cpuset
33 /sys/fs/cgroup/net_cls,net_prio
34 /sys/fs/cgroup/devices
35 /sys/fs/cgroup/freezer
39 /proc/sys/fs/binfmt_misc
17 /dev/mqueue
8 /sys/kernel/debug
37 /dev/hugepages
2066 /home
39 /proc/sys/fs/binfmt_misc
44 /run/user/1000
45 /sys/fs/fuse/connections
2049 /run/schroot/mount/my-chroot-cb43935e-0812-45ea-af4f-965a1e2de91d
4 /run/schroot/mount/my-chroot-cb43935e-0812-45ea-af4f-965a1e2de91d/proc
18 /run/schroot/mount/my-chroot-cb43935e-0812-45ea-af4f-965a1e2de91d/sys
6 /run/schroot/mount/my-chroot-cb43935e-0812-45ea-af4f-965a1e2de91d/dev
19 /run/schroot/mount/my-chroot-cb43935e-0812-45ea-af4f-965a1e2de91d/dev/pts
2066 /run/schroot/mount/my-chroot-cb43935e-0812-45ea-af4f-965a1e2de91d/home
2049 /run/schroot/mount/my-chroot-cb43935e-0812-45ea-af4f-965a1e2de91d/tmp

一旦你知道它是一个挂载点,那么如果它的设备id与/proc/mounts中的多个条目通信,你可以假设它们中的一个是绑定挂载。找出哪一个是绑定,哪个是绑定仍然是这个答案的缺失部分。

答案 2 :(得分:-3)

$ mount | grep bind

我不太清楚你想要什么,这个命令是否适合你的需要?