Niente più spazio su disco: come posso trovare ciò che occupa spazio?


81

Ho riscontrato un problema su uno dei miei server con 16.04: non è rimasto spazio su disco.

Non ho idea di cosa stia occupando lo spazio. Esiste un comando per elencare le dimensioni correnti della directory, in modo che io possa attraversare e finire nella directory occupando tutto lo spazio?


1
Controlla l'analizzatore di utilizzo del disco
Pranal Narayan

@PranalNarayan Nessuna interfaccia grafica sul mio server, temo :(
Karl Morrison,

1
Maledizione, ora sono andato a cercare, ho trovato questo bugs.launchpad.net/ubuntu/+source/baobab/+bug/942255 e vorrei che fosse una cosa.
Sam,

1
wrt "no GUI, is a server": potresti installare l'app GUI (supponendo che tu ne sia felice e che le librerie di supporto siano su un server) e che lo usi sia sullo schermo locale tramite X11-tunnelled-through-SSH con qualcosa come export DISPLAY=:0.0; ssh -Y <user>@<server> filelight(sostituire filelightcon lo strumento preferito). Ovviamente senza assolutamente spazio, se non hai già installato lo strumento dovrai comunque usare qualcos'altro!
David Spillett,

4
@DavidSpillett Come detto, non c'è spazio sul server . Quindi non posso installare nulla.
Karl Morrison,

Risposte:


93

Come sempre in Linux, c'è più di un modo per portare a termine il lavoro. Tuttavia, se è necessario farlo dalla 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 è limitare le linee di ritorno a quelle che ritornano con valori nell'intervallo Megabyte o Gigabyte. Se i dischi sono abbastanza grandi, è possibile aggiungere |Tanche per includere gli importi Terabyte. È possibile che vengano visualizzati degli errori su /proc, /syse / o /devpoiché non sono file reali sul disco. Tuttavia, dovrebbe comunque fornire un output valido per il resto delle directory in root. Dopo aver trovato i più grandi, puoi eseguire il comando all'interno di quella directory per restringere la strada verso il colpevole. Quindi, per esempio, se /varfosse il più grande potresti farlo in questo modo:

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

Ciò dovrebbe portarti al problema dei bambini!

Considerazioni aggiuntive

Mentre il comando sopra farà sicuramente il trucco, ho avuto alcune critiche costruttive nei commenti qui sotto che hanno sottolineato alcune cose che potresti anche includere.

  1. Il valore grepfornito potrebbe comportare la restituzione del valore "K" occasionale se il nome della directory o del file ha una G o M. maiuscola. Se non si desidera assolutamente che venga visualizzata nessuna delle directory valutate in K, si desidera il tuo gioco regex deve essere più creativo e complesso. per esempiogrep -E "^[0-9\.]*[MG]"
  2. Se sai quale unità è il problema e ha altre unità montate su di essa che non vuoi perdere tempo, incluso nella tua ricerca, puoi aggiungere il -xflag al tuo ducomando. Descrizione della pagina man di quella bandiera:

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


Questo è esattamente quello che faccio.
Razze di leggerezza in orbita

5
Il tuo grep restituisce tutte le cartelle con le lettere M o G anche nei loro nomi, una regex creativa dovrebbe colpire i numeri con un punto opzionale + M | G, forse"^[0-9]*[.]*[0-9]*[MG]"
Xen2050,

4
Se sai che è il problema è un'unità, puoi utilizzare l' -xopzione per durimanere su quella unità (fornita sulla riga di comando). È inoltre possibile eseguire il pipe through sort -hper ordinare correttamente i valori leggibili dall'uomo in megabyte / gigabyte. Di solito lasciavo fuori l' --max-depthopzione e cercavo l'intero disco in questo modo, ordinando in modo appropriato per ottenere le cose più grandi in fondo.
Muzer,

1
@alexis La mia esperienza è che a volte finisco con altre immondizie montate sotto il mountpoint a cui sono interessato (specialmente se lo è /), e l'utilizzo -xmi dà la garanzia che non avrò conteggiato male le cose. Se sei /pieno e ne hai uno montato separatamente /homeo altro, usare -xè praticamente una necessità per sbarazzarti delle cose irrilevanti. Quindi trovo che sia più semplice usarlo sempre, per ogni evenienza.
Muzer,

1
Se hai il tipo non hai bisogno del grep.
OrangeDog

77

Puoi usarlo ncduper questo. Funziona molto bene

sudo apt install ncdu

inserisci qui la descrizione dell'immagine


34
Sto prendendo a calci me stesso mentre uso normalmente questo programma, tuttavia dato che non c'è più spazio non posso installarlo ahah
Karl Morrison,

@KarlMorrison vedo diverse possibili soluzioni, basta montarlo su sshfs su un altro computer ed eseguire ncdu lì (supponendo che tu abbia già un server ssh su di esso ..) - o se non hai un server ssh su di esso, puoi farlo al contrario, installa ncdu su un altro server e monta quello con sshfs ed esegui ncdu dal mount (supponendo che tu abbia già sshfs sul server) - o se non ne hai nemmeno uno, ... se ncdu è un singolo script, può solo curl http://path/to/ncdu | sh, e verrà eseguito in una cache IO stdin in memoria, ma ciò richiederà un po 'di fortuna. probabilmente c'è anche un modo per creare un ram-disk
hanshenrik

@KarlMorrison oppure puoi avviare un'immagine live di Linux e installarla lì.

una volta installato digitare sudo ncdu /dalla riga di comando. sudoperché se non metti sudo, non riporterà le dimensioni per le cartelle di proprietà di root, e /perché se non digiti, riporterà solo in modo ricusivo dalla cartella in cui ti trovi
Max Carroll

19

Io uso questo comando

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

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


Ti dà un +1 perché funzioni! Tuttavia, la soluzione TopHats in realtà legge il mio disco più velocemente!
Karl Morrison,

Trovo spesso più utile farlo senza lo -d 1switch (e di solito con lessinvece di head -20), in modo da ottenere un elenco completo ricorsivamente elencato di tutti i file e le directory ordinati in base allo spazio che consumano. In questo modo, se vedo una directory occupare molto spazio, posso semplicemente scorrere verso il basso per vedere se la maggior parte dello spazio è effettivamente occupata da un determinato file o sottodirectory in esso. È un buon modo per trovare alcuni file e directory non necessari da eliminare per liberare spazio: scorri verso il basso fino a vedere qualcosa che sei sicuro di non voler conservare, eliminalo e ripeti.
Ilmari Karonen,

@KarlMorrison non lo legge più velocemente, è solo che sortattende che l'output sia completato prima di iniziare l'output.
muru,

@muru Ah va bene. Tuttavia, ottengo le informazioni più rapidamente in modo da poter iniziare a attraversare più rapidamente se è un termine migliore!
Karl Morrison,

13

Esistono già molte buone risposte su come trovare le directory occupando gran parte dello spazio. Se hai motivo di credere che pochi file di grandi dimensioni siano il problema principale, piuttosto che molti file di piccole dimensioni, potresti usare qualcosa di simile find / -size +10M.


11

Non conosco Ubuntu e non riesco a controllare la mia risposta, ma pubblica qui la mia risposta in base alla mia esperienza come amministratore unix molto tempo fa.

  1. Scopri quale file system esaurisce lo spazio

    df -h
    

    elencherà tutto il filesystem, le loro dimensioni e il loro spazio libero. Si perde tempo solo se si studiano filesystem con spazio sufficiente. Supponiamo che il filesystem completo sia / myfilesystem. controlla l'output df se ci sono filesystem montati su sottodirectory di / myfilesystems. In tal caso, i seguenti spep 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 usata per garantire che vengano presi in considerazione solo i file che sono membri di questo filesystem. Alcune varianti di Unix (ad esempio Solaris) non conoscono l'opzione -x per du. Quindi devi usare alcune soluzioni alternative per trovare il du del tuo filesystem.

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

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

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

    l'opzione -k forza du a produrre l'output in kilobyte senza alcuna unità. Questo potrebbe essere il valore predefinito su alcuni sistemi. Quindi puoi omettere questa opzione. I file / sottodirectory più grandi verranno visualizzati nella parte inferiore dell'output.

  5. Se hai trovato un file / directory di grandi dimensioni che non ti serve più, puoi rimuoverlo in modo appropriato. Non preoccuparti delle piccole directory nella parte superiore dell'output. Non risolverà il tuo problema se li elimini. Se non hai ancora abbastanza spazio di quanto puoi ripetere il passaggio 4 nelle grandi sottodirectory visualizzate in fondo all'elenco.

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

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

  1. alcuni processi utilizzano un file già eliminato. Pertanto questi file sono stati rimossi dalla directory e du non li vede. 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 pertinenti (ad esempio con lsof) e forzarli a chiudere questi file (ad esempio arrestando l'applicazione o uccidendo i processi). Oppure riavvii semplicemente il tuo computer.

  2. ci sono file nelle directory che non sono più visibili perché su una delle loro directory principali è montato un altro filesystem. Quindi se hai un file / myfilesysem / subdir / bigfile e ora monti un altro filesystem su / myfilesystem / subdir, 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 visualizzarlo.

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


Su un server occupato non è sempre possibile smontare le cose. Ma puoi associare mount della directory superiore a una posizione temporanea e non includerà gli altri mount e consentirà l'accesso ai file nascosti.
Zan Lynx,

Prima di Systemd ho avuto spesso fallimenti di montaggio con conseguente riempimento di / mount con cestino. Scrivere un backup su / mnt / backup senza l'unità USB collegata, ad esempio. Ora mi assicuro che quelle unità di lavoro abbiano requisiti di montaggio.
Zan Lynx,

@ZanLynx Grazie, non ho mai sentito parlare di attacchi di legatura prima d'ora
miracle173

@ZanLynx: non solo su server occupati. Immagina di avere /tmpun file system separato (ad es. Un tmpfs) e qualcosa che ha creato i file /tmpprima che diventasse un mount point per un diverso file system. Ora questi file si trovano nel file system di root, ombreggiato da un punto di montaggio e non è possibile accedervi senza riavviare la modalità di ripristino (che non elabora /etc/fstab) o, come suggerisci, un bind-mount.
David Foerster,

9

Nel caso in cui ti interessi anche non utilizzare un comando, ecco un'app: Filelight

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

inserisci qui la descrizione dell'immagine


È un server in cui SSH, nessuna GUI.
Karl Morrison,

@KarlMorrison Penso che ci siano modi per eseguire i programmi della GUI su ssh, ma questa è un'idea per dopo, quando hai spazio per installare i pacchetti
Xen2050,

@David Oh sì, sto cercando di uscirne. Era necessario su un'altra piattaforma che ho usato. Riparerò quel commento.

@Karl sì, è facile se X è già installato sul client: ssh -X <your host>e quindi esegui il tuo programma dalla riga di comando

@MarkYisri il punto è che devi installare il programma e le sue dipendenze. E il caso di Filelight richiede almeno KDElibs e Qt, che non sono molto piccoli. Vedi ad esempio questa pagina per il pacchetto Ubuntu a filelight , nota quante dipendenze ha.
Ruslan,

5

Prova sudo apt-get autoremovea rimuovere i file non utilizzati se non l'hai ancora fatto


1
Lo avevo già fatto prima :( Ma una buona idea per gli altri!
Karl Morrison,

3

Lo uso spesso

du -sh /*/

Quindi, se trovo delle cartelle di grandi dimensioni, passerò ad essa e farò ulteriori indagini

cd big_dir
du -sh */

Se necessario, puoi anche ordinarlo automaticamente con

du -s /*/ | sort -n

2

Non proprio una risposta, ma un addendum.

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

Alcuni suggerimenti

  • sudo apt clean allper eliminare i pacchetti che hai già scaricato. SICURO
  • sudo rm -f /var/log/*gzelimina i file di registro più vecchi di una settimana o due - non eliminerà i registri più recenti / attuali. PIÙ SICURO
  • sudo lsof | grep deletedelenca tutti i file aperti, ma filtra fino a quelli che sono stati cancellati dal disco. MOLTO SICURO
  • sudo rm /tmp/*elimina alcuni file temporanei: se qualcosa li utilizza, potresti sconvolgere un processo. NON DAVVERO COSÌ SICURO

Che `` uno di questi può restituire linee 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 può fare molto per la riga init, ma la seconda riga suggerisce che salt-minion ha un file aperto che è stato eliminato e che i blocchi del disco verranno restituiti una volta che tutti gli handle di file vengono chiusi da un riavvio del servizio.

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


2

Trovo particolarmente utile l'output di strumenti come Filelight, ma, come nel tuo caso, sui server normalmente non è installata alcuna GUI, ma il ducomando è sempre disponibile.

Quello che faccio normalmente è:

  • scrivere l' duoutput in un file ( du / > du_output.txt);
  • copia il file sul mio computer;
  • usare DuFSper "montare" l' duoutput in una directory temporanea; DuFSusa FUSE per creare un filesystem virtuale (= nessun file è effettivamente creato, è tutto falso) in base duall'output;
  • eseguire Filelight o un altro strumento GUI su questa directory temporanea.

Disclaimer: ho scritto dufs, proprio perché spesso devo scoprire quale spazio su disco suini su macchine senza testa.


Potresti semplicemente ordinare -n du_output.txt
Zan Lynx

Trovo la visualizzazione grafica dello spazio usato molto più intuitiva.
Matteo Italia,

-1

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 file a meno che non si nominino 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 facessero i c o a.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.