Não há mais espaço em disco: como posso encontrar o que está ocupando o espaço?

55

Eu me deparei com um problema em um dos meus servidores executando o 16.04: não há mais espaço em disco.

Eu não tenho ideia do que está ocupando o espaço. Existe um comando para listar os tamanhos de diretório atuais, para que eu possa atravessar e acabar no diretório ocupando todo o espaço?

    
por Karl Morrison 04.05.2017 / 17:21

11 respostas

61

Como sempre no Linux, há mais de uma maneira de fazer o trabalho. No entanto, se você precisar fazer isso da CLI, este é o meu método preferido:

Eu começo executando isto como root ou com sudo:

du -cha --max-depth=1 / | grep -E "M|G"

O grep é limitar as linhas de retorno àquelas que retornam com valores no intervalo Megabyte ou Gigabyte. Se os discos forem grandes o suficiente, você poderá adicionar |T para incluir os valores de Terabyte. Você pode obter alguns erros em /proc , /sys e / ou /dev , pois eles não são arquivos reais no disco. No entanto, ele ainda deve fornecer saída válida para o restante dos diretórios na raiz. Depois de encontrar os maiores, você pode executar o comando dentro desse diretório, a fim de reduzir o caminho do culpado. Por exemplo, se /var fosse o maior que você poderia fazer assim:

du -cha --max-depth=1 /var | grep -E "M|G"

Isso deve levar você ao problema das crianças!

Considerações adicionais

Embora o comando acima certamente faça o truque, eu tive algumas críticas construtivas nos comentários abaixo que apontaram algumas coisas que você também poderia incluir.

  1. O grep I fornecido pode resultar no retorno do valor "K" ocasional se o nome do diretório ou arquivo tiver um G maiúsculo ou M. Se você não quiser que nenhum dos diretórios com valor K apareça você gostaria de aumentar o seu jogo de regex para ser mais criativo e complexo. por exemplo. %código%
  2. Se você souber qual unidade é o problema e tiver outras unidades montadas sobre ela que não deseja perder tempo, inclusive na sua pesquisa, adicione o sinalizador grep -E "^[0-9\.]*[MG]" ao comando -x . Descrição da página manual desse sinalizador:

      -x, --one-file-system
          skip directories on different file systems
    
  3. Você pode classificar a saída do comando du para que o valor mais alto esteja na parte inferior. Basta anexar isso ao final do comando: du

por TopHat 04.05.2017 / 17:36
55

Você pode usar ncdu para isso. Isso funciona muito bem.

sudo apt install ncdu

    
por Duncan 04.05.2017 / 17:28
16

Eu uso este comando

sudo du -aBM -d 1 . | sort -nr | head -20

Ocasionalmente, preciso executá-lo no diretório / , pois coloquei algo em um local estranho.

    
por Charles Green 04.05.2017 / 17:25
11

Já existem muitas boas respostas sobre maneiras de encontrar diretórios ocupando a maior parte do espaço. Se você tem motivos para acreditar que poucos arquivos grandes são o principal problema, em vez de muitos pequenos, você pode usar algo como find / -size +10M .

    
por Luca Citi 04.05.2017 / 22:21
9

Eu não sei o Ubuntu e não posso checar minha resposta, mas postar aqui a minha resposta com base na minha experiência como administrador unix há muito tempo.

  1. Descubra qual sistema de arquivos está sem espaço

    df -h
    

    listará todo o sistema de arquivos, seu tamanho e seu espaço livre. Você só perde tempo se investigar sistemas de arquivos que tenham espaço suficiente. Suponha que o sistema de arquivos completo seja / myfilesystem. verifique a saída do df se houver sistemas de arquivos montados em subdiretórios de / myfilesystems. Se assim for, os seguintes speps devem ser adaptados para esta situação.

  2. Descubra quanto espaço é usado pelos arquivos deste sistema de arquivos

    du -sh /myfilesystem
    

    A opção -x pode ser usada para garantir que apenas os arquivos que são membros desse sistema de arquivos sejam levados em conta. Algumas variantes Unix (por exemplo, Solaris) não conhecem a opção -x para du. Então você tem que usar algumas soluções para encontrar o du de seu sistema de arquivos.

  3. Agora verifique se o du dos arquivos visíveis é aproximadamente o tamanho do espaço usado exibido por df. Se assim for, você pode começar a encontrar os arquivos / diretórios grandes do sistema de arquivos / myfilesystem para limpar.

  4. para encontrar os maiores subdiretórios de um diretório /.../dir use

    du -sk /.../dir/*|sort -n
    

    a opção -k força du para produzir o sie em kilobyte sem qualquer unidade. Este pode ser o padrão em alguns sistemas. Então você pode omitir essa opção. Os maiores arquivos / subdiretórios serão mostrados na parte inferior da saída.

  5. Se você encontrou um arquivo / diretório grande que não precisa mais, pode removê-lo de maneira apropriada. Não se preocupe com os diretórios pequenos no topo da saída. Isso não resolverá seu problema se você os excluir. Se ainda não tiver espaço suficiente, repita a etapa 4 nos subdiretórios larges, exibidos na parte inferior da lista.

Mas o que aconteceu se a saída du não for aproximadamente o espaço disponível exibido por df?

Se a saída du for maior, você perdeu um subdiretório no qual outro sistema de arquivos está montado. Se a saída du for muito menor, então os arquivos som não serão mostrados em nenhum diretório que inspecione. Pode haver diferentes razões para seus fenômenos.

  1. alguns processos estão usando um arquivo que já foi excluído. Portanto, esses arquivos foram removidos do diretório e não podem ser vistos. Mas para o sistema de arquivos, seus blocos ainda estão em uso até que os processos fechem os arquivos. Você pode tentar descobrir os processos relevantes (por exemplo, com lsof) e forçá-los a fechar esses arquivos (por exemplo, parando o aplicativo ou matando os processos). Ou simplesmente reinicie sua máquina.

  2. existem arquivos em diretórios que não são mais visíveis porque em um de seus diretórios pai outro sistema de arquivos é montado. Então, se você tem um arquivo / myfilesysem / subdir / bigfile e agora monta outro sistema de arquivos em / myfilesystem / subdir, então você não pode mais ver este arquivo e

    du -shx /myfilesystem 
    

    irá reportar um valor que não contenha o tamanho de / myfilesystem / subdir / bigfile. A única maneira de descobrir se tais arquivos existem é desmontar / myfilesystem / subir e verificar com

    ls -la /myfilesystem/subdir 
    

    se contiver arquivos.

  3. Pode haver tipos especiais de sistemas de arquivos que usam / reservam espaço em um disco que não é visível para o comando ls. Você precisa de ferramentas especiais para exibir isso.

Além dessa maneira sistemática de usar o comando du, há outros que você pode usar. Assim, você pode usar o comando find para encontrar arquivos maiores que algum valor que você fornecer, você pode procurar arquivos maiores que algum valor que você fornecer ou que foram criados recentemente ou que tenham um nome especial (por exemplo, * .log, core, * .trc). Mas você sempre deve fazer um df como descrito em 1 para trabalhar no sistema de arquivos correto

    
por miracle173 05.05.2017 / 09:12
7

Caso você também esteja interessado em não usar um comando, aqui está um app: Filelight

Ele permite que você visualize rapidamente o que está usando o espaço em disco em qualquer pasta.

    
por Gabriel 05.05.2017 / 23:32
4

Tente sudo apt-get autoremove para remover os arquivos não utilizados, se você não tiver feito

    
por Donald Shahini 05.05.2017 / 14:36
3

Eu geralmente uso esse

du -sh /*/

Então, se eu encontrar algumas pastas grandes, irei alternar para ela e fazer uma investigação adicional

cd big_dir
du -sh */

Se necessário, você também pode classificá-lo automaticamente com

du -s /*/ | sort -n
    
por phuclv 05.05.2017 / 05:05
2

Não é realmente uma resposta - mas um adendo.

Você está com muito espaço e não pode instalar o ncdu da resposta do @erman.

Algumas sugestões

  • sudo apt clean all para excluir pacotes que você já baixou. SEGURO
  • sudo rm -f /var/log/*gz remove arquivos de log com mais de uma semana ou duas - não excluirá registros mais recentes / atuais. MAIS SEGURO
  • sudo lsof | grep deleted lista todos os arquivos abertos, mas filtra os que foram excluídos do disco. FAIRLY SAFE
  • sudo rm /tmp/* exclui alguns arquivos temporários - se algo os estiver usando, você poderá perturbar um processo. NÃO É REALMENTE SEGURO

Isso 'lsof um pode retornar linhas como esta:

server456 ~ $ lsof | grep deleted
init          1          root    9r      REG              253,0  10406312       3104 /var/lib/sss/mc/initgro                        ups (deleted)
salt-mini  4532          root    0r      REG              253,0        17     393614 /tmp/sh-thd-1492991421                         (deleted)

Não é possível fazer muito pela linha init, mas a segunda linha sugere que salt-minion tenha um arquivo aberto que foi excluído e os blocos de disco serão retornados assim que todas as alças de arquivo forem fechadas por uma reinicialização de serviço.

Outros suspeitos comuns aqui incluem syslog / rsyslog / syslog-ng, squid, apache ou qualquer processo executado por seu servidor que seja "pesado".

    
por Criggie 05.05.2017 / 07:11
2

Acho particularmente valiosa a saída de ferramentas como o Filelight, mas, como no seu caso, em servidores normalmente não há GUI instalada, mas o comando du está sempre disponível.

O que eu normalmente faço é:

  • escreva a saída du em um arquivo ( du / > du_output.txt );
  • copie o arquivo na minha máquina;
  • use DuFS para "montar" a saída du em um diretório temporário; DuFS usa o FUSE para criar um sistema de arquivos virtual (= nenhum arquivo é realmente criado, é tudo falso) de acordo com o du output;
  • execute o Filelight ou outra ferramenta da GUI neste diretório temporário.

Disclaimer: Eu escrevi dufs - exatamente porque muitas vezes tenho que descobrir o que hogs espaço em disco em máquinas sem cabeça.

    
por Matteo Italia 06.05.2017 / 18:57
-1

Semelhante a @TopHat, mas filtra alguns arquivos se eles tiverem M, G ou T no nome. Eu não acredito que vai perder o tamanho na primeira coluna, mas não irá corresponder ao nome do arquivo, a menos que você nomeie os arquivos de forma criativa.

du -chad 1 . | grep -E '[0-9]M[[:blank:]]|[0-9]G[[:blank:]]|[0-9]T[[:blank:]]'

Opções de linha de comando explicadas aqui desde que eu não sabia o que o c ou a fez.

    
por user685769 05.05.2017 / 03:16