检测 Linux 上的绑定挂载
detecting bind mounts on linux
我正在寻找一种方法来确定给定路径是否是绑定挂载点(在 Linux 上(。检测常规挂载点的标准技术似乎不起作用。即使是挂载点命令也无法检测到绑定挂载。
我不确定是否应该有一种方法可以做到这一点(也许通过 /etc/mtab
或/etc/fstab
除外(,因为我知道绑定挂载是挂载空间(不是文件层次结构(中的某种"硬链接",并且没有办法(一旦绑定挂载发生(区分源挂载点和目标挂载点。
为什么要这么问?绑定挂载(恕我直言(对于从应用程序的角度隐藏这些东西最有用(否则您将使用符号链接 - 甚至是硬链接,在极少数情况下它们是可能的 - 用于目录(
由于您的问题,我刚刚发现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
-ing mountpoint
我发现它正在对 /usr/src
和 /usr/src/..
等目录进行lstat
、stat
和fstat
系统调用
(2016 年 11 月新增:(
参见 /proc/mounts
例如 proc(5( 和 nftw(3(
您可以通过检查路径及其父路径的设备 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
中的多个条目是通用的,你可以假设其中一个是绑定挂载。 找出哪个是绑定,哪个是绑定,仍然是这个答案中缺失的部分。
:注: /proc/mounts
条目对某些有问题的字符使用八进制转义,因此健壮的脚本需要通过 printf %b
或类似字符来清洗这些字符。
findmnt
显示绑定挂载:
$ grep /opt /home /etc/fstab
/home/admin/opt /opt none bind 0
LABEL=raidhome /home ext4 defaults,nodiratime,relatime 0 2
$ findmnt --fstab /opt
TARGET SOURCE FSTYPE OPTIONS
/opt /home/admin/opt none bind
$ findmnt /opt
TARGET SOURCE FSTYPE OPTIONS
/opt /dev/md1[/admin/opt] ext4 rw,nodiratime,relatime,stripe=16
$ findmnt -J /opt
{
"filesystems": [
{
"target": "/opt",
"source": "/dev/md1[/admin/opt]",
"fstype": "ext4",
"options": "rw,nodiratime,relatime,stripe=16"
}
]
}
不是很简单,但信息就在那里。
$ mount | grep bind
我不太清楚你想要什么,这个命令符合你的需要吗?
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 在基于范围的for循环中使用结构化绑定声明
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 视觉studo 2019中的漫画和静态/动态绑定
- 将自由函数绑定为类成员函数
- 将常量指针引用绑定到非常量指针
- 在派生类中绑定非静态模板化成员函数
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 在 openGL 中多次绑定缓冲区
- 定义有趣的宏和正则表达式在Z3 C++绑定
- 使用结构化绑定'Reflection'
- 不同的数学符号绑定与共享库与 dlopen 并直接链接到可执行文件 (Linux)
- beaglebone上的GTK 绑定(ARM Linux)
- Linux 拒绝使用 boost asio 的套接字绑定权限
- 如何确定 Linux 套接字在C++中绑定到哪些接口
- 检测 Linux 上的绑定挂载
- 是否有可能绑定和监听一个IP地址与TCP/IP套接字?(Linux / C)
- 如何防止Linux上fork()后的子进程绑定端口