我正在寻找一种方法来确定一个给定的路径是否是一个绑定挂载点(在Linux上)。检测常规挂载点的标准技术似乎不起作用。甚至mountpoint命令也无法检测绑定装载。
pcww981p1#
我不确定是否应该有一种方法来做到这一点(也许除了通过/etc/mtab或/etc/fstab),因为我知道绑定挂载是挂载空间(而不是文件层次结构)中的某种“硬链接”,并且没有办法(一旦绑定挂载发生)区分源和目标挂载点。为什么这么问?绑定挂载(恕我直言)对于从应用程序的Angular * 隐藏 * 这样的东西最有用(否则您将使用符号链接-甚至硬链接,在极少数情况下它们是可能的-用于目录)和mountpoint,我刚刚发现感谢你的问题似乎看到一些东西:
/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)
strace
/usr/src
/usr/src/..
lstat
stat
fstat
/proc/mounts
v64noz0r2#
您可以通过检查路径及其父目录的设备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或类似的方法来清洗这些字符。
printf %b
yyhrrdl83#
findmnt显示绑定挂载:
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" } ] }
字符串不完全是直截了当的,但信息就在那里。
oaxa6hgo4#
$ mount | grep bind
字符串我不是很清楚你想要什么,这个命令符合你的需要吗?
4条答案
按热度按时间pcww981p1#
我不确定是否应该有一种方法来做到这一点(也许除了通过
/etc/mtab
或/etc/fstab
),因为我知道绑定挂载是挂载空间(而不是文件层次结构)中的某种“硬链接”,并且没有办法(一旦绑定挂载发生)区分源和目标挂载点。为什么这么问?绑定挂载(恕我直言)对于从应用程序的Angular * 隐藏 * 这样的东西最有用(否则您将使用符号链接-甚至硬链接,在极少数情况下它们是可能的-用于目录)
和
mountpoint
,我刚刚发现感谢你的问题似乎看到一些东西:字符串
通过
strace
-ingmountpoint
,我发现它正在/usr/src
和/usr/src/..
等目录上执行lstat
、stat
和fstat
系统调用(2016年11月新增:)
另见
/proc/mounts
,例如proc(5)和nftw(3)v64noz0r2#
您可以通过检查路径及其父目录的设备ID来检测路径是否是挂载点(假设挂载的文件系统与父目录的文件系统不同-我从未尝试过将目录绑定挂载到其自身!).
下面是一个快速的命令行演示:
字符串
一旦您知道它是一个挂载点,那么如果它的设备ID对于
/proc/mounts
中的多个条目是公共的,那么您可以假设其中一个是绑定挂载。找出哪一个是绑定,哪一个是绑定到仍然是这个答案中缺少的部分。注意:
/proc/mounts
条目对一些有问题的字符使用八进制转义,因此一个健壮的脚本需要通过printf %b
或类似的方法来清洗这些字符。yyhrrdl83#
findmnt
显示绑定挂载:字符串
不完全是直截了当的,但信息就在那里。
oaxa6hgo4#
字符串
我不是很清楚你想要什么,这个命令符合你的需要吗?