O número de arquivos não corresponde a inodes

1

Noto que o número de inodes usados na partição OCFS2 é de cerca de 28 milhões. Mudei uma pasta que continha 518K arquivos e o número se tornou 22 milhões.

O script a seguir encontra o número de arquivos, em torno de 65.000 e o número de pastas em 40.

Minha pergunta, de onde vem o número 22 milhões? isso é normal?

[root@bopapp1 ~]# cat /etc/issue
Oracle Linux Server release 6.5
Kernel \r on an \m

[root@bopapp1 ~]# uname -a
Linux bopapp1 3.8.13-16.2.1.el6uek.x86_64 #1 SMP Thu Nov 7 17:01:44 PST 2013 x86_64 x86_64 x86_64 GNU/Linux

[root@bopapp1 ~]# df -i
Filesystem                        Inodes    IUsed    IFree IUse% Mounted on
/dev/mapper/vg_testapp2-lv_root  3276800   765283  2511517   24% /
tmpfs                            3089556        3  3089553    1% /dev/shm
/dev/sda1                         128016       55   127961    1% /boot
/dev/mapper/vg_testapp2-lv_home  4882432     9662  4872770    1% /home
/dev/dm-4                       39321087 22543323 16777764   58% /u
/dev/dm-5                       26214055  8319457 17894598   32% /usr/oracle

[root@bopapp1 ~]# cd /u

[root@bopapp1 u]# for i in 'find . -type d '; do echo 'ls -a $i 2> /dev/null | wc -l' $i; done | sort -n | awk '{sum+=$1} END{print "sum=",sum}'
sum= 62950
    
por Osama Jaber 07.10.2015 / 13:05

2 respostas

2

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.

    
por 07.10.2015 / 13:29
0

Você nunca conseguirá igualar esses números, pois há arquivos abertos, mas excluídos, que são inodes usinf, mas não são visualizáveis para usuários que atravessam o sistema de arquivos.

Também existem inodes ocultos (por exemplo, usados por definições de ACL e arquivos de atributos estendidos) que não podem ser vistos com o comando find .

Por outro lado, você precisaria evitar a contagem de tempos vinculados difíceis várias vezes. Isto pode ser conseguido via:

find /u -xdev -ls | sort -n -u +0 | wc -l

mas observe que isso geralmente conta com poucos arquivos (veja acima).

    
por 07.10.2015 / 14:27