Por que o df em uma montagem específica itera sobre todas as montagens?

2

Ao executar df /nfs/mount/point , espero que seja mais rápido que df | grep /nfs/mount/point , porque não será stat de todos os outros pontos de montagem.

Mas strace mostra que stat é executado em todas as montagens do NFS e, em seguida, a saída é mostrada para o ponto de montagem específico.

Isso é um bug? Ou há algum motivo mais profundo para passar por cima de todos os pontos de montagem?

Estou vendo isso com o df versão 8.4, no CentOS 6.6, com o kernel 2.6.32.

Exemplo de saída (com edições para remover informações da empresa)

$ 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  
~  
~
    
por Prem 20.10.2015 / 20:02

2 respostas

2

Isto parece ter sido corrigido em versões mais recentes. Com o df no meu sistema Debian ( df versão 8.23), eu recebo:

$ 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 +++

Mas apenas o sistema de arquivos de destino é examinado quando um é dado:

$ 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 +++
    
por 20.10.2015 / 20:41
2

Vou colocar isso como uma resposta parcial; Não sei dizer por que os desenvolvedores do gnulib / coreutils escolheram fazer isso dessa maneira.

Você pode ver no link que a fonte df código pede a lista de sistemas de arquivos montados. A fonte dessa função, começando pelo link , faz um loop todos os sistemas de arquivos montados (via / proc / self / mountinfo). Somente mais tarde, sistemas de arquivos explicitamente mencionados são impressos.

    
por 20.10.2015 / 20:42