Acabei de perceber que estávamos falando de um sistema de arquivos de cluster OCFS2 aqui e não de um sistema de arquivos local em disco regular. Esta seção se aplica especificamente ao OCFS2. Veja abaixo os sistemas de arquivos normais.
Se eu criar um novo sistema de arquivos em branco 1GiB OCFS2 e montá-lo, vejo uma contagem de inode usada de 36378.
Depois de criar 100 arquivos vazios, não vejo esse número aumentando.
Depois de criar 10000 arquivos, vejo isso subir para 72730.
Se eu apagar todos esses arquivos, o número não diminuirá, mas se eu desmontar o FS e montá-lo de volta, eu o vejo mudando para 45634.
Portanto, embora eu não possa dizer por que, como não estou familiarizado com esse sistema de arquivos, parece que a IUsed
count retornada por df
não corresponde ao número de i-nodes ou sistema de arquivos, i-nodes não são usados apenas para arquivos ou que o sistema não rastreia seu número de i-nodes usados ou livres, com exceção da granularidade muito grosseira.
Se você executar o2info --freeinode
do ocfs2-tools 1.8.2 ou superior, poderá obter um número mais próximo do esperado:
$ du -ax ///mnt/1 | grep -c ///
102
$ df -i /mnt/1
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/loop0 262144 45634 216510 18% /mnt/1
$ o2info --freeinode /mnt/1
Slot Space Free
0 10240 10129
1 0 0
Total 10240 10129
$ echo $((10240-10129))
111
$ touch /mnt/1/a{1..100}
$ o2info --freeinode /mnt/1
Slot Space Free
0 10240 10029
1 0 0
Total 10240 10029
$ o2info --freeinode /mnt/1 | awk 'END{print $2-$3}'
211
$ touch /mnt/1/b{1..20000}
$ o2info --freeinode /mnt/1
Slot Space Free
0 20480 259
1 0 0
Total 20480 259
$ o2info --freeinode /mnt/1 | awk 'END{print $2-$3}'
20221
Agora, para sistemas de arquivos convencionais ...
Para obter uma correspondência para a contagem de inode rastreando entradas de diretório, você precisa manter um controle dos arquivos que você viu com base nos números de inode.
find /u -xdev -printf '%i\n' | sort -u | wc -l
du
(pelo menos a implementação GNU) também irá pular múltiplas instâncias de um mesmo arquivo (hard links), então você pode usar:
du -xa ///u | grep -c ///
que deve fornecer o mesmo resultado que o find
um.
Espero que o resultado seja um pouco menor que o df -i
, pois alguns sistemas de arquivos (incluindo ext4
) possuem alguns inodes especiais que não estão vinculados a nenhum diretório para uso interno.
Ele também não contará os arquivos que foram excluídos, mas que ainda estão abertos por algum processo (consulte lsof +aL1 /u
para a lista) e aqueles que são mascarados por outro sistema de arquivos montado (não no caso do seu exemplo).
Usar a substituição de comando ( '...'
) como você está errado. Isso é invocar o operador split + glob que, por padrão, se divide em espaços em branco e executa globbing nas palavras resultantes. Isso só pode dar um resultado significativo se nenhum dos nomes de arquivo contiver espaço, guia, nova linha, *
, ?
ou [
caracteres.
ls -a
inclui as entradas .
e ..
que você não deseja contar, pois são links físicos para alguns inodes que você já contou (exceto a entrada .
em /u
). E da mesma forma, você vai contar outros links físicos várias vezes.