특정 마운트의 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를 통해). 나중에 명시적으로 언급된 파일 시스템이 인쇄됩니다.

관련 정보