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

81

Eu encontrei um problema em um dos meus servidores executando o 16.04: não há espaço em disco.

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 percorrer e acabar no diretório ocupando todo o espaço?

Karl Morrison
fonte
1
Verifique o analisador de uso do disco
Pranal Narayan
@PranalNarayan Sem GUI como é no meu servidor eu tenho medo :(
Karl Morrison
1
Maldito seja, agora que fui procurar, encontrei este bugs.launchpad.net/ubuntu/+source/baobab/+bug/942255 e gostaria que fosse uma coisa.
Sam
1
wrt "no GUI, is a server": você pode instalar o aplicativo GUI (assumindo que está satisfeito com ele e as bibliotecas de suporte em um servidor) e usá-lo na tela local via X11-tunnelled-through-SSH com algo como export DISPLAY=:0.0; ssh -Y <user>@<server> filelight(substitua filelightpor sua ferramenta preferida). Obviamente, com absolutamente nenhum espaço restante, se você ainda não tiver a ferramenta instalada, precisará usar outra coisa!
David Spillett
4
@DavidSpillett Conforme declarado, não há espaço no servidor . Portanto, não consigo instalar nada.
Karl Morrison

Respostas:

93

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

Começo executando isso 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 de Megabyte ou Gigabyte. Se seus discos forem grandes o suficiente, você poderá adicionar |Ttambém para incluir quantidades de Terabyte. Você pode obter alguns erros no /proc, /syse / ou /devuma vez que 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ê poderá executar o comando dentro desse diretório para restringir o caminho do culpado. Por exemplo, se /varfoi o maior, você poderia fazer o seguinte:

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

Isso deve levá-lo às crianças problemáticas!

Considerações adicionais

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

  1. O que grepeu forneça pode resultar no retorno ocasional do valor "K" se o nome do diretório ou arquivo tiver G ou M. maiúsculo. Se você absolutamente não deseja que nenhum dos diretórios com valor K apareça, seu jogo regex para ser mais criativo e complexo. por exemplogrep -E "^[0-9\.]*[MG]"
  2. Se você souber qual unidade é o problema e ela possui outras unidades montadas que você não deseja perder tempo, inclusive em sua pesquisa, você pode adicionar o -xsinalizador ao seu ducomando. Descrição da página de manual desse sinalizador:

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

Cartola
fonte
É exatamente o que eu faço.
Lightness Races in Orbit
5
Seu grep retorna todas as pastas com as letras M ou G em seus nomes também, um regex criativo deve bater os números com um ponto opcional + M | G, talvez"^[0-9]*[.]*[0-9]*[MG]"
Xen2050
4
Se você sabe que o problema é uma unidade, você pode usar a -xopção para dupermanecer nessa unidade (fornecida na linha de comando). Você também pode canalizar sort -hpara classificar corretamente os valores legíveis por humanos de megabytes / gigabytes. Normalmente, eu deixava de fora a --max-depthopção e apenas pesquisava a unidade inteira dessa maneira, classificando-a adequadamente para obter as maiores coisas na parte inferior.
Muzer 5/05
1
@alexis Minha experiência é que, às vezes, acabo com outro lixo montado abaixo do ponto de montagem no qual estou interessado (especialmente se for esse o caso /), e o uso -xme dá uma garantia de que não estarei contando coisas erradas. Se você /estiver cheio e você tiver uma montagem separada /homeou o que for, usar -xé praticamente uma necessidade para se livrar das coisas irrelevantes. Então, acho que é mais fácil usá-lo o tempo todo, apenas por precaução.
Muzer
1
Se você tem o tipo, não precisa do grep.
1811 OrangeDog
77

Você pode usar ncdupara isso. Funciona muito bem.

sudo apt install ncdu

insira a descrição da imagem aqui

Duncan
fonte
34
Eu estou chutando a mim mesmo como eu realmente normalmente usar este programa, no entanto, pois não há deixou Eu não posso instalá-lo haha espaço
Karl Morrison
@KarlMorrison eu vejo várias soluções possíveis, basta montá-lo sobre sshfs em outro computador e executar o ncdu lá (supondo que você já tenha um servidor ssh nele ..) - ou se você não tiver um servidor ssh, poderá fazê-lo ao contrário, instale o ncdu em outro servidor e monte-o com sshfs e execute o ncdu a partir da montagem (supondo que você já tenha sshfs no servidor) - ou se você não tiver, ... se ncdu for um único script, você pode apenas curl http://path/to/ncdu | sh, e ele será executado em um cache stdin IO na memória, mas isso exigirá um pouco de sorte. provavelmente há uma maneira de fazer uma ram-disco também
hanshenrik
@KarlMorrison ou você pode inicializar uma imagem ao vivo do Linux e instalá-la lá.
uma vez instalado, digite a sudo ncdu /partir da linha de comando. sudoporque se você não colocar o sudo, ele não informará tamanhos para as pastas pertencentes à raiz, e /porque se você não digitar, o relatório será recusado apenas da pasta em que você está
Max Carroll
19

Eu uso esse comando

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

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

Charles Green
fonte
Dando um +1 para que ele funcione! No entanto, a solução TopHats realmente leu meu disco mais rápido!
Karl Morrison
Costumo achar mais útil fazer isso sem a -d 1opção (e geralmente com em lessvez de head -20), para obter uma lista completa recursivamente enumerada de todos os arquivos e diretórios classificados pelo espaço que consomem. Dessa forma, se eu vir um diretório ocupando muito espaço, posso simplesmente rolar para baixo para ver se a maior parte do espaço é realmente ocupada por algum arquivo ou subdiretório específico. É uma boa maneira de encontrar alguns arquivos e diretórios desnecessários a serem excluídos para liberar espaço: basta rolar para baixo até ver algo que você tem certeza de que não quer guardar, exclua-o e repita.
Ilmari Karonen
@KarlMorrison não lê mais rápido, é só que sortaguarda a conclusão da saída antes de iniciar a saída.
muru 29/05
@muru Ah tudo bem. Porém, eu recebo informações mais rapidamente para poder começar a percorrer mais rapidamente, se esse for um termo melhor!
Karl Morrison
13

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

Luca Citi
fonte
11

Não sei o Ubuntu e não consigo verificar minha resposta, mas poste aqui minha resposta com base na minha experiência como administrador do unix há muito tempo.

  1. Descubra qual sistema de arquivos fica 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 com espaço suficiente. Suponha que o sistema de arquivos completo seja / myfilesystem. verifique a saída df se houver sistemas de arquivos montados em subdiretórios de / myfilesystems. Nesse caso, os seguintes discursos devem ser adaptados a essa 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 deste sistema de arquivos sejam levados em consideração. Algumas variantes do Unix (por exemplo, Solaris) não conhecem a opção -x para du. Então você tem que usar algumas soluções alternativas para encontrar o du do seu sistema de arquivos.

  3. Agora verifique se o du dos arquivos visíveis tem aproximadamente o tamanho do espaço usado exibido por df. Nesse caso, você pode começar a encontrar os grandes arquivos / diretórios 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 o du a gerar a saída em kilobyte sem nenhuma unidade. Este pode ser o padrão em alguns sistemas. Então você pode omitir esta 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 da maneira apropriada. Não se preocupe com os pequenos diretórios na parte superior da saída. Não resolverá o seu problema se você excluí-los. Se você ainda não tiver espaço suficiente, poderá repetir a etapa 4 nos subdiretórios grandes que são 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 dupla for muito menor, alguns arquivos não serão mostrados em nenhum diretório inspecionado. 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 você não pode vê-los. Mas, para o sistema de arquivos, seus blocos ainda estão em uso até que o processo feche 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 eliminando os processos). Ou você simplesmente reinicia 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. Portanto, se você tiver um arquivo / myfilesysem / subdir / bigfile e agora montar outro sistema de arquivos em / myfilesystem / subdir, não poderá mais ver esse arquivo e

    du -shx /myfilesystem 
    

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

    ls -la /myfilesystem/subdir 
    

    se ele 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, usando o comando du, existem outras que você pode usar. Assim, você pode usar o comando find para encontrar arquivos maiores que algum valor que você fornece, você pode procurar arquivos maiores que algum valor que você fornece ou que foram criados recentemente ou que possuem 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

miracle173
fonte
Em um servidor ocupado, nem sempre é possível desmontar as coisas. Mas você pode vincular a montagem do diretório superior a um local temporário e ele não incluirá as outras montagens e permitirá o acesso aos arquivos ocultos.
Zan Lynx
Antes do systemd, eu geralmente tinha falhas de montagem, resultando no preenchimento do / mount com lixo. Gravando um backup em / mnt / backup sem a unidade USB conectada, por exemplo. Agora, garanto que essas unidades de trabalho tenham requisitos de montagem.
Zan Lynx
@ZanLynx Obrigado, eu nunca ouvi falar de montagens bind antes
miracle173
@ZanLynx: Não apenas em servidores ocupados. Imagine que você possui /tmpum sistema de arquivos separado (por exemplo, um tmpfs) e algo criou arquivos /tmpantes de se tornar um ponto de montagem para um sistema de arquivos diferente. Agora, esses arquivos estão no sistema de arquivos raiz, sombreados por um ponto de montagem e você não pode acessá-los sem uma reinicialização no modo de recuperação (que não processa /etc/fstab) ou, como você sugere, uma montagem de ligação.
David Foerster
9

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

Permite visualizar rapidamente o que está usando espaço em disco em qualquer pasta.

insira a descrição da imagem aqui

Gabriel
fonte
É um servidor no qual eu SSH, sem GUI.
Karl Morrison
@KarlMorrison Eu acho que há maneiras de executar programas gráficos mais de ssh, mas isso é uma idéia para mais tarde, quando você tem espaço para instalar pacotes
Xen2050
@ David Oh sim, eu estou tentando sair disso. Costumava ser necessário em outra plataforma que eu usava. Eu vou consertar esse comentário.
@Karl sim, é fácil se o X já estiver instalado no cliente: ssh -X <your host>e execute o programa na linha de comando
@ MarkYisri o ponto é que você precisa instalar o programa e suas dependências. E o caso do Filelight requer pelo menos KDElibs e Qt, que não são realmente pequenos. Veja, por exemplo, esta página para o pacote Ubuntu à luz de arquivo , observe quantas dependências ele possui.
Ruslan
5

Tente sudo apt-get autoremoveremover os arquivos não utilizados, se você não tiver feito isso

Donald Shahini
fonte
1
Já fiz isso antes :( Mas boa idéia para os outros!
Karl Morrison
3

Eu costumo usar esse

du -sh /*/

Então, se eu encontrar algumas pastas grandes, mudarei para ela e investigarei mais

cd big_dir
du -sh */

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

du -s /*/ | sort -n
phuclv
fonte
2

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

Você está sem espaço e não pode instalar o ncdu a partir da resposta do @erman.

Algumas sugestões

  • sudo apt clean allpara excluir pacotes que você já baixou. SEGURO
  • sudo rm -f /var/log/*gzlimpar arquivos de log com mais de uma semana ou duas - não excluirá os logs mais recentes / atuais. MAIS SEGURO
  • sudo lsof | grep deletedliste todos os arquivos abertos, mas filtre os que foram excluídos do disco. MUITO SEGURO
  • sudo rm /tmp/*exclua alguns arquivos temporários - se algo os estiver usando, você poderá perturbar um processo. NÃO É REALMENTE SEGURO

Esse `lsof 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 o salt-minion tem um arquivo aberto que foi excluído e os blocos de disco serão retornados quando todos os identificadores de arquivo forem fechados por uma reinicialização do serviço.

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

Criggie
fonte
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 ducomando está sempre disponível.

O que eu normalmente faço é:

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

Isenção de responsabilidade: eu escrevi dufs- exatamente porque muitas vezes tenho que descobrir o que ocupa espaço em disco em máquinas sem cabeça.

Matteo Italia
fonte
Você poderia apenas uma espécie -n du_output.txt
Zan Lynx
Acho a exibição gráfica do espaço usado muito mais intuitiva.
Matteo Italia
-1

Semelhante ao @TopHat, mas filtra alguns arquivos se eles tiverem M, G ou T no nome. Não acredito que ele perca tamanho na primeira coluna, mas não corresponderá ao nome do arquivo, a menos que você nomeie os arquivos de maneira 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, pois eu não sabia o que o c ou a fizeram.

user685769
fonte