Como posso aumentar o número de inodes em um sistema de arquivos ext4?

61

Eu tive um problema (novo para mim) na semana passada. Eu tenho um sistema de arquivos ext4 (Fedora 15). O aplicativo que é executado no servidor parou de repente. Não consegui encontrar o problema à primeira vista.

dfmostrou 50% de espaço disponível. Depois de pesquisar por cerca de uma hora, vi um post no fórum onde o cara usava df -i. A opção procura o uso de inodes. O sistema estava sem inodes, um problema simples que eu não percebi. A partição tinha apenas 3,2 milhões de inodes.

Agora, minhas perguntas são: Posso fazer com que o sistema tenha mais inodes? Deve / pode ser definido ao formatar o disco? Com os inodes de 3,2 milhões, quantos arquivos eu poderia ter?

piovisqui
fonte
11
Cada arquivo ou diretório usa um inode. Um link físico para um arquivo não cria um inode. en.wikipedia.org/wiki/Inode
Paul Tomblin

Respostas:

33

Parece que você tem muito mais arquivos do que a expectativa normal.

Não sei se existe uma solução para alterar dinamicamente o tamanho da tabela de inodes. Receio que você precise fazer backup de seus dados, criar um novo sistema de arquivos e restaurar seus dados.

Para criar um novo sistema de arquivos com uma tabela de inodes tão grande, você precisa usar a opção '-N' do mke2fs (8).

Eu recomendo usar a opção '-n' primeiro (que não cria o fs, mas exibe as informações úteis) para que você possa obter o número estimado de inodes. Então, se precisar, use '-N' para criar seu sistema de arquivos com um número de inode específico.

cinsk
fonte
11
Você pode usar mke2fs -ipara especificar o número de inodes. Sua documentação indica que "não é possível expandir o número de inodes em um sistema de arquivos após a criação".
Gilles 'SO- stop be evil'
2
@piovisqui: cada arquivo consome no inode, que é um ponteiro no sistema de arquivos. se o arquivo é um link físico para outro arquivo, ele tem o mesmo inode.
Hanan N.
6
@Gilles As -iopções especificam o tamanho do inode, e não quantos existem. A -Nopção define o número de inodes.
23414 theillien
11
A relação entre inodes e números de arquivos não é necessariamente 1: 1. O primeiro inode contém uma lista de ponteiros para os blocos em que o arquivo está armazenado. Se a lista de blocos não puder caber em um inode, o inode conterá uma lista de ponteiros para inodes que listam os blocos em que o arquivo está armazenado. Se não couber lá,
serão
2
@StuWhitby Isso não está certo. Um único inode possui vários ponteiros diretos e um ponteiro indireto único, duplo e triplo. Se a lista de blocos não puder caber nos ponteiros diretos, o ponteiro indireto único apontará para um bloco de dados (NÃO outro inode) que contenha mais ponteiros. Se forem necessários mais ponteiros do que o necessário, o ponteiro indireto duplo aponta para um bloco que contém ponteiros indiretos únicos e o indireto triplo para um bloco com ponteiros indiretos duplos. Na verdade, um arquivo usa apenas um inode, independentemente do tamanho.
user125355
11

Como outra solução alternativa, eu poderia sugerir considerar compactar enormes coleções de arquivos em um tararquivo compactado (!) E depois usá archivemount-lo para montá-lo como um sistema de arquivos. Um arquivo tar é melhor para compartilhar do que uma imagem do sistema de arquivos e fornece desempenho semelhante ao fazer backup em uma nuvem ou outro armazenamento.


Se a coleção deve ser somente leitura, squashfspode ser uma opção, mas requer certas opções ativadas no kernel, e a xzcompactação está disponível para tar, com o mesmo desempenho.

tijagi
fonte
2
Boa sugestão.
Piovisqui
11

Com 3,2 milhões de inodes, você pode ter 3,2 milhões de arquivos e diretórios no total (mas vários hardlinks para um arquivo usam apenas um inode).

Sim, pode ser definido ao criar um sistema de arquivos na partição. As opções -T usage-type, -N number-of-inodesou -i bytes-per-inodepodem definir o número de inodes. Eu geralmente uso -i, depois de comparar a saída de du -se find | wc -lpara uma coleção semelhante de arquivos e permitir alguma folga.

Não, não pode ser alterado no local em um sistema de arquivos existente. Contudo:

  • Se você estiver executando o LVM ou o sistema de arquivos estiver em um LUN da SAN (diretamente no LUN ou como a última partição no LUN) ou tiver espaço vazio no disco após a partição, você poderá aumentar a partição e, em seguida, use resize2fspara expandir o sistema de arquivos. Isso adiciona mais inodes em proporção ao espaço adicionado, aproximadamente. Se você deseja evitar a falta de inodes antes do espaço, supondo que os arquivos futuros tenham em média o mesmo tamanho, defina uma porcentagem de bloco reservada alta o suficiente usando tune2fs -m.
  • Se você tiver espaço suficiente e puder colocar o sistema de arquivos offline, coloque-o offline, crie um novo sistema de arquivos com mais inodes e copie todos os arquivos.
  • Se apenas um subconjunto dos arquivos estiver usando muitos inodes e você tiver espaço livre suficiente, crie um sistema de arquivos em um dispositivo de loop suportado por um arquivo no sistema de arquivos, crie um sistema de arquivos com mais inodes (e talvez blocos menores) nele e mova os diretórios incorretos para ele. Provavelmente é um problema de desempenho e um aborrecimento de manutenção, mas é uma alternativa.
  • E, é claro, se você pode excluir muitos arquivos desnecessários, isso também deve ajudar.
david
fonte
6

Eu tenho soluções alternativas para esta situação. Digamos que você tenha 1000 inodes em uma partição de 10G. Mas devido ao limite de inodes, você não deve usar todo o espaço da partição . Mas nessas soluções, você poderá usar o espaço restante da partição sem formatá- la.

$ df -i  # see list ( I need just one free inode here so move just one file into other PARTITION)
/dev/part1  1000 999 1 99.9%     /data

$ dd if=/dev/zero of=/data/new_data
$ mkfs.ext4 /data/new_data
$ mkdir /data1
$ mount /data/new_data /data1

para montagem permanente

$ echo "/data/new_data /data1 ext4 defaults 0 1" >> /etc/fstab
SANJEET
fonte
2
Bem-vindo ao U&L. Tomei a liberdade de reformatar sua resposta para a representação mais usual do código aqui, inserindo um prompt ( $) para distinguir claramente entre comandos e saída (se eles fossem apenas comando, normalmente o prompt é deixado de fora). Eu também mudei o GRITO na ênfase da fase ousada, que é o que eu acho que você pretendia. Você pode reverter as alterações se eu deturpado as coisas
Anthon
Eu acho que essa solução tem lógica, mas você precisa gerenciar o tamanho ao executar o dd.
Piovisqui 26/05
3
Os detalhes estão errados, você precisaria usar um dispositivo de loop e talvez até unionfs, dependendo do aplicativo, mas esta é a única solução que evita a formatação e a restauração do backup, o que não é divertido quando se tem pressa com milhões de arquivos. Há circunstâncias em que isso pode salvar o dia!
medoc
6

Recentemente, tive esse problema ao usar o apt ou o aptitude upgrade.

df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  5.1G  2.3G  70% /

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 521497   2791  100% /

Comando emitido:

du /|sort -k1 -n

A maioria dos arquivos revelados estava em subpastas para várias versões do kernel dentro de:

/usr/src/linux-headers

Removidas as subpastas e o problema do inode foi corrigido.

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 104986 419302   21% /
kph0x1
fonte
"du / | sort -k1 -n" mostra inodes?
Órfãos
Não. Isso era para ordenar os diretórios, mostrando quais tinham mais arquivos, pastas que consumiam muitos inodes, mas menos uso de espaço real: a situação de 30% de espaço livre em disco e 100% de uso de inodes mostrados acima.
Kd0x1
Sinceramente, não entendo como "du" mostra quantos arquivos existem com qualquer sinalizador? Você poderia explicar mais detalhadamente?
Orphans
Não há sinalizadores para o ducomando. O uso é para a raiz do sistema de arquivos no exemplo acima, observando apenas o espaço. A saída é canalizada para classificar para mostrar quais diretórios continham mais arquivos. Não há uma contagem feita no exemplo acima para arquivos, a parte 'quantos arquivos' da sua pergunta. duPorém, os fontes de kernel foram os culpados mostrados na saída; por exemplo, muitos arquivos pequenos, subpastas de compilações anteriores, exatamente o que é ideal para remoção, a fim de liberar inodes. Ainda resta uma revisão manual e humana da duprodução, que /usr/src/linux-headersficou óbvia.
kph0x1
11
du mostra apenas bytes - não arquivos. E você está canalizando a saída apenas do comando du para a classificação. Então, como classifica -k1 -n classifica a saída da maneira que você propôs? A única coisa que vejo é que "du / | sort -k1 -n" classifica apenas todas as linhas com base no tamanho em bytes. Nada mais
Órfãos
2

experimente du -s --inodes * 2>/dev/null |sort -go CD no último diretório de saída e repita.

Divulgação total: nem todos os --inodessinalizadores de suporte do sistema operacional para o comando du (meu Mac OS não), mas muitos sistemas operacionais Linux o fazem.

Otto Leichliter
fonte