特定のマウントのdfがすべてのマウントに対して繰り返されるのはなぜですか?

特定のマウントのdfがすべてのマウントに対して繰り返されるのはなぜですか?

実行するとそうではないため、他のすべてのマウントポイントdf /nfs/mount/pointよりも高速になると予想されます。df | grep /nfs/mount/pointstat

ただし、すべてのNFSマウントが実行されたことをstrace示しstat、その後、特定のマウントポイントの出力を表示します。

これはバグですか?それとも、すべてのマウントポイントを確認する必要があるより深い理由はありますか?

カーネル 2.6.32 がインストールされている CentOS 6.6、df バージョン 8.4 でこの現象が表示されます。

サンプル出力(会社情報を削除するように編集)

$ strace df /home/user1/some/Directory
~  
~  
stat("/home/user2", {st_mode=S_IFDIR|0755, st_size=12288, ...}) = 0  
stat("/home/user3", {st_mode=S_IFDIR|0777, st_size=20480, ...}) = 0  
stat("/home/user4", {st_mode=S_IFDIR|0777, st_size=36864, ...}) = 0  
stat("/home/user5", {st_mode=S_IFDIR|0755, st_size=663552, ...}) = 0  
stat("/software/bin", {st_mode=S_IFDIR|0755, st_size=12288, ...}) = 0  
stat("/scratch/space", {st_mode=S_IFDIR|0777, st_size=8192, ...}) = 0  
stat("/eng/tools", {st_mode=S_IFDIR|0755, st_size=20480, ...}) = 0  
~  
~

答え1

新しいバージョンでは、この問題は解決されたようです。df私のDebianシステム(バージョン8.23)では、df次のようになります。

$ strace -e stat df >/dev/null 
stat("/sys", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
stat("/proc", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
stat("/dev", {st_mode=S_IFDIR|0755, st_size=3920, ...}) = 0
stat("/dev/pts", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/run", {st_mode=S_IFDIR|0755, st_size=1360, ...}) = 0
stat("/", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/run/lock", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=80, ...}) = 0
stat("/sys/fs/pstore", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/run/shm", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=220, ...}) = 0
stat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/mnt/bigboy", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
stat("/mnt/movies", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
stat("/sys/fs/fuse/connections", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/nfs_shares/lacoloc", {st_mode=S_IFDIR|0754, st_size=20480, ...}) = 0
stat("/nfs_shares/movies", {st_mode=S_IFDIR|0777, st_size=24576, ...}) = 0
stat("/nfs_shares/music", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/nfs_shares/series", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
stat("/winblows", {st_mode=S_IFDIR|0777, st_size=8192, ...}) = 0
stat("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=520, ...}) = 0
stat("/run/rpc_pipefs", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
stat("/proc/sys/fs/binfmt_misc", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/fs/cgroup", {st_mode=S_IFDIR|0755, st_size=60, ...}) = 0
stat("/run/cgmanager/fs", {st_mode=S_IFDIR|0755, st_size=240, ...}) = 0
stat("/run/user/1000", {st_mode=S_IFDIR|0700, st_size=60, ...}) = 0
stat("/proc/fs/nfsd", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/run/user/120", {st_mode=S_IFDIR|0700, st_size=100, ...}) = 0
stat("/run/user/1002", {st_mode=S_IFDIR|0700, st_size=60, ...}) = 0
stat("/run/user/1003", {st_mode=S_IFDIR|0700, st_size=60, ...}) = 0
stat("/run/user/1004", {st_mode=S_IFDIR|0700, st_size=60, ...}) = 0
stat("/run/user/1001", {st_mode=S_IFDIR|0700, st_size=120, ...}) = 0
stat("/run/user/1001/gvfs", {st_mode=S_IFDIR|0500, st_size=0, ...}) = 0
stat("/dev/cgroup/cpu", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
stat("/dev", {st_mode=S_IFDIR|0755, st_size=3920, ...}) = 0
stat("/run", {st_mode=S_IFDIR|0755, st_size=1360, ...}) = 0
stat("/", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/run/lock", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=80, ...}) = 0
stat("/sys/fs/pstore", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/run/shm", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=220, ...}) = 0
stat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/mnt/bigboy", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
stat("/mnt/movies", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
stat("/winblows", {st_mode=S_IFDIR|0777, st_size=8192, ...}) = 0
stat("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=520, ...}) = 0
stat("/proc/sys/fs/binfmt_misc", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/fs/cgroup", {st_mode=S_IFDIR|0755, st_size=60, ...}) = 0
stat("/run/cgmanager/fs", {st_mode=S_IFDIR|0755, st_size=240, ...}) = 0
stat("/run/user/1000", {st_mode=S_IFDIR|0700, st_size=60, ...}) = 0
stat("/proc/fs/nfsd", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/run/user/120", {st_mode=S_IFDIR|0700, st_size=100, ...}) = 0
stat("/run/user/1002", {st_mode=S_IFDIR|0700, st_size=60, ...}) = 0
stat("/run/user/1003", {st_mode=S_IFDIR|0700, st_size=60, ...}) = 0
stat("/run/user/1004", {st_mode=S_IFDIR|0700, st_size=60, ...}) = 0
stat("/run/user/1001", {st_mode=S_IFDIR|0700, st_size=120, ...}) = 0
stat("/run/user/1001/gvfs", {st_mode=S_IFDIR|0500, st_size=0, ...}) = 0
stat("/dev/cgroup/cpu", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
+++ exited with 0 +++

ただし、ファイルシステムが与えられると、ターゲットファイルシステムのみが確認されます。

$ strace -e stat df /home/ >/dev/null 
stat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
+++ exited with 0 +++

答え2

私はこれを部分的な答えとして残します。 gnulib/coreutils 開発者がなぜこれを選択したのか説明できません。

で見ることができますhttp://git.savannah.gnu.org/cgit/coreutils.git/tree/src/df.c#n1681dfソースコードは、マウントされたファイルシステムのリストを要求します。この関数のソースは次のように始まります。http://git.savannah.gnu.org/cgit/gnulib.git/tree/lib/mountlist.c#n418、マウントされた各ファイルシステムを繰り返します(/proc/self/mountinfo経由)。後で明示的に言及されたファイルシステムが印刷されます。

関連情報