Eu vi essa pergunta no stackoverflow, mas não gostei de nenhuma das respostas, e é realmente uma pergunta que deveria estar aqui no U&L de qualquer maneira.
Basicamente, um inode é usado para cada arquivo no sistema de arquivos. Portanto, ficar sem inodes geralmente significa que você tem muitos arquivos pequenos por aí. Portanto, a pergunta realmente se torna: "qual diretório tem um grande número de arquivos?"
Nesse caso, o sistema de arquivos com o qual nos preocupamos é o sistema de arquivos raiz /
, para que possamos usar o seguinte comando:
find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n
Isso irá despejar uma lista de todos os diretórios no sistema de arquivos prefixados com o número de arquivos (e subdiretórios) nesse diretório. Assim, o diretório com o maior número de arquivos estará na parte inferior.
No meu caso, isso mostra o seguinte:
1202 /usr/share/man/man1
2714 /usr/share/man/man3
2826 /var/lib/dpkg/info
306588 /var/spool/postfix/maildrop
Então, basicamente, /var/spool/postfix/maildrop
está consumindo todos os inodes.
Observe que esta resposta tem três advertências em que consigo pensar. Ele não lida corretamente com nada com novas linhas no caminho. Sei que meu sistema de arquivos não possui arquivos com novas linhas e, como isso está sendo usado apenas para consumo humano, não vale a pena solucionar o problema em potencial (e sempre é possível substituir o \n
por \0
e usar sort -z
acima). Ele também não controla se os arquivos estão espalhados por um grande número de diretórios. Isso não é provável, então considero o risco aceitável. Ele também contará links físicos para o mesmo arquivo (portanto, usando apenas um inode) várias vezes. Mais uma vez, é improvável que dê falsos positivos
A principal razão pela qual não gostei de nenhuma das respostas na resposta do stackoverflow é que todas elas cruzam os limites do sistema de arquivos. Como meu problema estava no sistema de arquivos raiz, isso significa que ele atravessaria todos os sistemas de arquivos montados. Jogar -xdev
os comandos find nem funcionaria corretamente.
Por exemplo, a resposta mais votada é esta:
for i in `find . -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n
Se mudarmos isso para
for i in `find . -xdev -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n
mesmo que /mnt/foo
seja uma montagem, também é um diretório no sistema de arquivos raiz; portanto, ele aparece find . -mount -type d
e é passado para o ls -a $i
, que entrará na montagem.
Em find
minha resposta, em vez disso, lista o diretório de cada arquivo na montagem. Então, basicamente, com uma estrutura de arquivos como:
/foo/bar
/foo/baz
/pop/tart
acabamos com
/foo
/foo
/pop
Então, apenas precisamos contar o número de linhas duplicadas.
/tmp
e depois o sistema esteja configurado para montar um tmpfs/tmp
. Então você não poderá encontrar os arquivosfind
sozinho. Senario improvável, mas vale a pena notar.-printf
parece ser uma extensão GNU a ser encontrada, pois a versão BSD disponível no OS X não a suporta.Isso é publicado aqui a pedido do autor:
E se você quiser permanecer no mesmo sistema de arquivos, faça:
Aqui está um exemplo de saída:
AGORA COM LS:
Várias pessoas mencionaram que não possuem coreutils atualizados e a opção --inodes não está disponível para eles. Então, aqui está o sl:
Se você estiver curioso, o coração e a alma desse pedaço tedioso
regex
estão substituindo os resultados de pesquisa recursivosfilename
em cada um dosls's
resultados pelo nome do diretório em que foram encontrados. A partir daí, é apenas uma questão de espremer números de inodes repetidos e, em seguida, contar nomes de diretórios repetidos e classificar de acordo.A
-U
opção é especialmente útil na classificação em que ela especificamente não é classificada e, em vez disso, apresenta a lista de diretórios na ordem original - ou, em outras palavras, peloinode
número.E,
-1
é claro, é incrivelmente útil, pois garante um único resultado por linha, independentemente de novas linhas possivelmente incluídas nos nomes de arquivos ou outros problemas espetacularmente infelizes que podem ocorrer quando você tenta analisar uma lista.E, é claro,
-A
para todos,-i
para o inode e-R
para o recursivo, e esse é o longo e curto disso.O método subjacente a isso é que eu substituo todos os nomes de arquivos de ls pelo seu nome de diretório que contém sed. Na sequência disso ... Bem, estou um pouco confusa. Tenho certeza de que está contando com precisão os arquivos, como você pode ver aqui:
Isso está me fornecendo resultados praticamente idênticos ao
du
comando:DU:
LS:
Eu acho que a
include
coisa depende apenas de qual diretório o programa parece primeiro - porque eles são os mesmos arquivos e têm links físicos. Tipo como a coisa acima. Eu posso estar errado sobre isso - e congratulo-me com a correção ...DU DEMO
Faça um diretório de teste:
Alguns diretórios filhos:
Faça alguns arquivos:
Alguns hardlinks:
Veja os hardlinks:
Eles são contados sozinhos, mas sobe um diretório ...
Em seguida, executei meu script de baixo e:
E Graeme's:
Então, acho que isso mostra que a única maneira de contar inodes é por inode. E como contar arquivos significa contar inodes, você não pode contar inodes duplamente - contar arquivos com inodes com precisão não pode ser contado mais de uma vez.
fonte
--inodes
? quais "variantes" / "sabores" / "posix-wannabes" / "implementações" / o que quer que seja?Eu usei esta resposta da SO Q&A intitulada: Onde estão sendo usados todos os meus inodes? quando nosso NAS acabou há cerca de 2 anos:
Exemplo
Verificando os inodes do dispositivo
Dependendo do seu NAS, ele pode não oferecer um
df
comando completo . Portanto, nesses casos, você pode recorrer ao usotune2fs
:Cruzando os limites do sistema de arquivos
Você pode usar a
-xdev
opção para direcionarfind
para restringir sua pesquisa apenas ao dispositivo em que você está iniciando a pesquisa.Exemplo
Digamos que eu tenha minha
/home
montagem automática de diretório por meio de compartilhamentos NFS do meu NAS, cujo nome é mulder.Observe que o ponto de montagem ainda é considerado local para o sistema.
Agora, quando inicio
find
:Ele encontrou
/home
mas nenhum conteúdo montado automaticamente porque está em um dispositivo diferente!Tipos de sistema de arquivos
Você pode utilizar a opção para
find
,-fstype
para controlar quais tipos de sistemas de arquivosfind
serão analisados.Exemplo
Que sistema de arquivos eu tenho?
Então você pode usar isso para controlar o cruzamento:
somente ext3
somente nfs
ext3 e ext4
fonte
/
está cheio, e você tem sistemas de arquivos de rede montados, não deseja mergulhar nos sistemas de arquivos de rede.-fstype
afind
.-xtype
exclui os sistemas de arquivos, mas sim o tipo de arquivo. Só estou encontrando exemplos como este:find . \( -fstype nfs -prune \)
find
cruzar os limites do sistema de arquivos. Em seu ex. ele menciona "Como se / está cheio, e você tem sistemas de arquivos de rede montados, você não quer mergulhar nos sistemas de arquivos de rede".Comando para encontrar o inode usado:
fonte
Para listar o uso detalhado do inode
/
, use o seguinte comando:fonte
Definitivamente, responda com upvotes máximos para ajudar a entender o conceito de inodes no linux e no unix, no entanto, não ajuda muito quando se trata de lidar com o problema real de excluir ou remover os inodes do disco. Uma maneira mais simples de fazer isso em sistemas baseados no ubuntu é remover cabeçalhos e imagens indesejados do kernel do linux.
Faria isso por você. No meu caso, o uso de inodes foi de 78%, devido ao qual recebi um alerta.
Depois de executar o
sudo apt-get autoremove
comando, ele caiu para 29%Esta foi apenas a minha observação que economizou meu tempo. As pessoas podem encontrar uma solução melhor que essa.
fonte
Acho que é mais rápido e fácil fazer uma busca detalhada usando o seguinte comando:
Você pode então acessar,
var
por exemplo, e ver qual é o grande inode usando diretórios.fonte
Até agora, todas as respostas assumem que o problema ocorre com muitos arquivos em um único diretório, em vez de muitos subdiretórios, todos contribuindo para o problema. Felizmente, a solução é simplesmente usar menos sinalizadores.
Ou com opções mais curtas:
du --inodes -x | sort -n
. Infelizmente nem todas as versõesdu
possuem a opção inodes.fonte