Niente più spazio su disco: come posso trovare ciò che sta occupando lo spazio?

Ho incontrato un problema su uno dei miei server in esecuzione 16.04: non è rimasto spazio su disco.

Non ho idea di cosa sta occupando lo spazio. Esiste un comando per elencare le dimensioni attuali della directory, così posso attraversare e finire nella directory occupando tutto lo spazio?

Come sempre in Linux, c’è più di un modo per portare a termine il lavoro. Tuttavia, se hai bisogno di farlo da CLI, questo è il mio metodo preferito:

Comincio eseguendo questo come root o con sudo:

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

Il grep è di limitare le righe di ritorno a quelle che ritornano con valori nell’intervallo di Megabyte o Gigabyte. Se i tuoi dischi sono abbastanza grandi, puoi aggiungere |T anche per includere gli importi di Terabyte. Potresti ricevere degli errori su /proc , /sys e / o /dev poiché non sono file reali su disco. Tuttavia, dovrebbe comunque fornire un output valido per il resto delle directory in root. Dopo aver trovato quelli più grandi, puoi eseguire il comando all’interno di quella directory per restringere il colpevole. Quindi, ad esempio, se /var è il più grande, puoi farlo in questo modo:

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

Questo dovrebbe portarti al problema dei bambini!

Considerazioni aggiuntive

Mentre il comando sopra farà sicuramente il trucco, ho avuto delle critiche costruttive nei commenti sottostanti che hanno evidenziato alcune cose che potresti anche includere.

  1. Il grep ho fornito potrebbe far sì che venga restituito il valore “K” occasionale se il nome della directory o del file ha la maiuscola G o M. Se non vuoi assolutamente che nessuna delle directory di valore K mostrino che vorresti il tuo gioco regex per essere più creativo e complesso. eg grep -E "^[0-9\.]*[MG]"
  2. Se si conosce quale unità è il problema e su di essa sono montate altre unità che non si vuole perdere tempo, inclusa la ricerca, è ansible aggiungere il flag -x al comando du . Descrizione della pagina man di quella bandiera:

      -x, --one-file-system skip directories on different file systems 
  3. È ansible ordinare l’output del comando du modo che il valore più alto sia in basso. Basta aggiungere questo alla fine del comando: | sort -h | sort -h

Puoi usare ncdu per questo. Funziona molto bene.

 sudo apt install ncdu 

inserisci la descrizione dell'immagine qui

Io uso questo comando

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

Occasionalmente, ho bisogno di eseguirlo dalla directory / , poiché ho posizionato qualcosa in una posizione strana.

Ci sono già molte buone risposte sui modi per trovare le directory che occupano la maggior parte dello spazio. Se hai motivo di credere che pochi file di grandi dimensioni siano il problema principale, piuttosto che molti piccoli, potresti usare qualcosa come find / -size +10M .

Non conosco Ubuntu e non posso controllare la mia risposta ma postare qui la mia risposta in base alla mia esperienza come admin unix molto tempo fa.

  1. Scopri quale filesystem esaurisce lo spazio

     df -h 

    elencherà tutto il filesystem, le loro dimensioni e il loro spazio libero. Si perde tempo solo se si studiano i filesystem che hanno abbastanza spazio. Supponiamo che il filesystem completo sia / myfilesystem. controlla l’output di df se ci sono filesystem montati su sottodirectory di / myfilesystems. Se è così, i seguenti speps devono essere adattati a questa situazione.

  2. Scopri quanto spazio viene utilizzato dai file di questo filesystem

     du -sh /myfilesystem 

    L’opzione -x può essere utilizzata per garantire che vengano presi in considerazione solo i file che sono membri di questo filesystem. Alcune varianti Unix (es. Solaris) non conoscono l’opzione -x per du. Quindi devi usare alcuni stratagemmi per trovare il du del tuo filesystem.

  3. Ora verifica se il du dei file visibili è approssimativamente la dimensione dello spazio utilizzato visualizzato da df. In tal caso, è ansible iniziare a trovare i file / directory di grandi dimensioni del filesystem / myfilesystem da ripulire.

  4. per trovare le sottodirectory più grandi di una directory /…/dir utilizzare

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

    l’opzione -k forza du per emettere la sie in kilobyte senza alcuna unità. Questo potrebbe essere l’impostazione predefinita su alcuni sistemi. Quindi puoi omettere questa opzione. I file / sottodirectory più grandi verranno visualizzati nella parte inferiore dell’output.

  5. Se hai trovato una directory / file di grandi dimensioni che non ti serve più puoi rimuoverla in modo appropriato. Non preoccuparti delle piccole directory in cima all’output. Non risolverà il tuo problema se li elimini. Se non si dispone ancora di spazio sufficiente, è ansible ripetere il passaggio 4 nelle sottodirectory larges che vengono visualizzate nella parte inferiore dell’elenco.

Ma cosa è successo se l’output du non è approssimativamente lo spazio disponibile visualizzato da df?

Se l’output du è più grande, hai perso una sottodirectory in cui è montato un altro filesystem. Se l’output du è molto più piccolo, i file som non vengono mostrati in nessuna directory da ispezionare. Ci possono essere diverse ragioni per i suoi fenomeni.

  1. alcuni processi stanno utilizzando un file che è già stato eliminato. Pertanto questi file sono stati rimossi dalla directory e du non possono vederli. Ma per il filesystem i loro blocchi sono ancora in uso fino a quando i processi non chiudono i file. Puoi provare a scoprire i processi rilevanti (ad es. Con lsof) e obbligarli a chiudere questi file (ad esempio arrestando l’applicazione o uccidendo i processi). O semplicemente riavvia il tuo computer.

  2. ci sono file nelle directory che non sono più visibili perché su una delle loro directory madri viene montato un altro filesystem. Quindi se hai un file / myfilesysem / subdir / bigfile e ora monti un altro filesystem su / myfilesystem / subdir allora non puoi più vedere questo file e

     du -shx /myfilesystem 

    riporterà un valore che non contiene le dimensioni di / myfilesystem / subdir / bigfile. L’unico modo per scoprire se tali file esistono è smontare / myfilesystem / subir e verificare con

     ls -la /myfilesystem/subdir 

    se contiene file.

  3. Potrebbero esserci tipi speciali di filesystem che usano / riservano spazio su un disco che non è visibile al comando ls. Hai bisogno di strumenti speciali per visualizzare questo.

Oltre a questo modo sistematico usando il comando du ce ne sono altri che puoi usare. Quindi puoi usare il comando find per trovare file più grandi di un valore che tu fornisci, puoi cercare file più grandi di qualche valore che tu fornisci o che sono stati appena creati o hanno un nome speciale (ad es. * .Log, core, * trc). Ma devi sempre fare un df come descritto in 1 in modo da lavorare sul filesystem giusto

Se sei interessato anche a non usare un comando, ecco un’app: Filelight

Ti consente di visualizzare rapidamente ciò che sta usando lo spazio su disco in qualsiasi cartella.

inserisci la descrizione dell'immagine qui

Prova sudo apt-get autoremove per rimuovere i file inutilizzati se non lo hai fatto

Io uso spesso questo

 du -sh /*/ 

Quindi, se trovo alcune cartelle grandi, passerò ad esso e fare ulteriori indagini

 cd big_dir du -sh */ 

Se necessario, puoi anche ordinarlo automaticamente con

 du -s /*/ | sort -n 

Non è davvero una risposta – ma un addendum.

Sei a corto di spazio e non puoi installare ncdu dalla risposta di @erman.

Alcuni suggerimenti

  • sudo apt clean all per eliminare i pacchetti che hai già scaricato. SICURO
  • sudo rm -f /var/log/*gz cancella i file di log più vecchi di una settimana o due – non cancella i registri più recenti / correnti. PIÙ SICURO
  • sudo lsof | grep deleted sudo lsof | grep deleted elenca tutti i file aperti, ma filtra in basso a quelli che sono stati cancellati dal disco. FACILMENTE SICURO
  • sudo rm /tmp/* cancella alcuni file temporanei – se qualcosa li sta usando potresti stravolgere un processo. NON DAVVERO QUEL SICURO

Questo `lofof uno può restituire righe come questa:

 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) 

Non posso fare molto per la linea init, ma la seconda riga suggerisce che salt-minion ha un file aperto che è stato cancellato, e i blocchi del disco saranno restituiti una volta che tutti gli handle di file sono stati chiusi da un riavvio del servizio.

Altri sospetti comuni qui includono syslog / rsyslog / syslog-ng, squid, apache o qualsiasi processo eseguito dal server che è “pesante”.

Trovo particolarmente prezioso l’output di strumenti come Filelight, ma, come nel tuo caso, sui server normalmente non è installata alcuna GUI, ma il comando du è sempre disponibile.

Quello che faccio normalmente è:

  • scrivi l’output du in un file ( du / > du_output.txt );
  • copia il file sul mio computer;
  • usare DuFS per “montare” l’output du in una directory temporanea; DuFS utilizza FUSE per creare un filesystem virtuale (= nessun file viene effettivamente creato, è tutto falso) in base all’output du ;
  • eseguire Filelight o un altro strumento GUI in questa directory temporanea.

Dichiarazione di non responsabilità: ho scritto dufs – esattamente perché spesso devo scoprire quale spazio del disco di Hogs su macchine headless.

Simile a @TopHat, ma filtra alcuni file se hanno M, G o T nel nome. Non credo che mancherà la dimensione nella prima colonna, ma non corrisponderà al nome del file se non si nominano i file in modo creativo.

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

Le opzioni della riga di comando sono spiegate qui poiché non sapevo cosa facesse la c o la a.