2012-01-03 3 views
4

私は、特定のパスが(Linux上の)バインドマウントポイントであるかどうかを判断する方法を探しています。定期的なマウントポイントを検出するための標準的な手法は機能していないようです。 mountpointコマンドでさえ、バインドマウントを検出できません。linuxでバインドマウントを検出中

+0

私は本当にそのような質問をしている理由を理解したいと思います。 –

+0

それは私が必要と思っていたものから始まり、今では「もっと知る必要がある」ものが増えています。 元の理由は、私はかなり包括的なファイルシステムのウォーカー/スキャナを書いているということでした。 – Shamless

+0

次に、すでに訪れたiノードを覚えています。 –

答えて

6

私はバインドマウントがマウントスペース(ファイル階層ではない)のような「ハードリンク」であることを理解しているので、(おそらく/etc/mtabまたは/etc/fstabを除いて) )、ソースマウントポイントとターゲットマウントポイントを区別する方法はありません(バインドマウントが発生した後)。

なぜそれを聞いていますか?バインドマウントは(私見)アプリケーションの観点からこのようなことが

mountpoint(そうでなければ、彼らは、ディレクトリのためpossible-あるまれにシンボリックリンク-orも、ハードリンクを使用します)非表示にするには、主に有用ですstraceことで

% 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 

mountpointを-ing私はそれが/usr/src &のようなディレクトリにlstatstatfstatシステムコールを行っていることがわかります:私はちょうど何かを見ているようだあなたの質問への感謝を発見しました(2016年11月に追加:)

も参照/proc/mountsなどを3210


私はあなたが望むものについて非常に明確ではないよproc(5)、およびnftw(3)

+3

私は、マウントポイントが使用する技術は、l/statパスとpath/..を探して、別のデバイスIDか同じiノードを探すことだと思います。 fstatの呼び出しに関しては、そのことはわかりませんが、マウントポイントのチェックに直接関係しないかもしれません。 「理由」については。あなたはそれらが使用されていることについての良い点を確認し、私は通常のディレクトリと同じデバイス内のリンクマウントを検討することに決めました。それは、私はまだ彼らがどのようにそれらを検出するかについては興味があると言われています。 現在、私が見つけた最良の方法は、/ proc/mountsと/ etc/mtabを調べて情報を調べることです。 – Shamless

-3
$ mount | grep bind 

は、このコマンドは、あなたのニーズに合うのですか?

+1

これは機能しません。 –

0

パスとその親のデバイスIDを調べることで、パスがマウントポイントかどうかを検出できます(マウントされたファイルシステムが親ディレクトリのものと異なる場合 - 私はバインドマウントを試みたことはありません)自分自身へのディレクトリ!)。あなたはそれがマウントポイントであることを知っているしたら、そのデバイスIDが/proc/mountsに複数のエントリにcommontされた場合、その後、あなたがそれらのいずれかがバインドマウントであると仮定することができ

$ 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 

:ここ

クイックコマンドラインデモです。どちらがバインドであり、バインドされているかを知ることは、この回答からまだ欠けている部分です。

+0

'stat'では、なぜデバイス番号ではなく、iノード番号をリストアップしていますか? –

+0

@Steve - umm、私は '-f'引数が必要であることを知るために十分注意深くmanページを読んでいなかったので。私はアホです。 –

関連する問題