df in linux non mostra lo spazio libero corretto dopo la rimozione del file


144

Ho file server che vengono utilizzati per archiviare i file. I file potrebbero risiedere lì per una settimana o per un anno. Sfortunatamente, quando rimuovo i file dal server, il dfcomando non riflette lo spazio liberato. Quindi, alla fine, il server viene riempito ( dfmostra il 99%) e il mio script non invia più file lì, tranne che ci potrebbero essere alcune decine di GB di spazio libero lì.

Ho la noatimebandiera sulle partizioni montate se questo fa la differenza.


Sta succedendo su una singola partizione o su tutte le partizioni?
Khaled

Bene, sta accadendo sulla mia partizione di dati principale, che è l'unica a cui tengo, dal momento che scrivo / rimuovo solo i file.

Per favore, mi illumini con la soluzione o un link a una.

Quali filesystem? DF esegue una stat del superblocco, è possibile che il tuo filesystem non stia aggiornando l'inode sb. Hai provato a svuotare la cache?
fagioli

Utilizzando ext4. Come svuoti le cache?

Risposte:


237

L'eliminazione del nome file non elimina effettivamente il file. Alcuni altri processi tengono il file aperto, impedendo che venga eliminato; riavviare o terminare quel processo per rilasciare il file.

Uso

lsof +L1

per scoprire quale processo utilizza un file eliminato (non collegato).


2
I file che sono stati rimossi non sono stati raggiunti da oltre un mese e l'unico processo che li accede è nginx, quindi è dubbio.

40
+1. Inoltre, "lsof + L1" ti dirà quale programma tiene aperti i file.
pehrs

4
come root eseguito "lsof -n | file grep", rimarrai sorpreso da quanto tempo i file possono rimanere bloccati a causa dei processi che li tengono aperti per qualsiasi motivo. Se tutto il resto fallisce, riavvia, mi sento male a suggerirlo, ma sicuramente farà in modo che nulla stia trattenendo il file. Per pehrs, lsof + L1 è probabilmente il modo migliore di procedere.
ScottZ,

3
Mi hai appena salvato! Eliminato un file di registro 93G e non ha recuperato spazio e non è riuscito a capire perché. Grazie.
Luke Cousins,

1
Sulla stessa linea e nel caso in cui ciò aiuti gli altri, ho cancellato un grande file access.log di nginx ma sono stato in grado di recuperare lo spazio solo dopo aver riavviato nginx: servizio nginx restart
Nick,

28

come menziona Ignacio, l'eliminazione del file non libererà lo spazio fino a quando non si eliminano i processi con handle aperti rispetto a quel file.

Tuttavia, puoi recuperare lo spazio senza uccidere i processi. Tutto quello che devi fare è rimuovere i descrittori di file.

Per prima cosa esegui lsof | grep eliminato per identificare il processo che contiene il file

[hudson@opsynxvm0055 log]$ /usr/sbin/lsof |grep deleted
java       8859   hudson    1w      REG              253,0 3662503356    7578206 /crucible/data/current/var/log/fisheye.out (deleted)

Quindi eseguire:

cd /proc/PID/fd

poi

[hudson@opsynxvm0055 fd]$ ls -l |grep deleted
total 0
l-wx------ 1 hudson devel 64 Feb  7 11:48 1 -> /crucible/data/current/var/log/fisheye.out (deleted)

"1" sarà il descrittore di file. Ora digita "> FD" per recuperare quello spazio

> 1

Potrebbe essere necessario ripetere l'operazione se ci sono altri processi che contengono il file.


1
cosa fa > FD?
Pred

rimuove il descrittore di file
Adrián Deccico,

2
questo >comando ha un nome? ho dovuto passare da zsh a bash per poterlo usare. È possibile eseguirlo su zsh?
ariera,

1
è un reindirizzamento dell'output e quindi tronca il file. Il long from sarebbe "echo -n> 1" o "true> 1". Non rimuove realmente l'FD, ma fa semplicemente riferimento a un file vuoto in seguito.
Verifica

8

Una possibilità è che i file che hai eliminato abbiano più riferimenti nel filesystem. Se hai creato collegamenti fisici, diversi nomi di file rimandano agli stessi dati e i dati (i contenuti effettivi) non saranno contrassegnati come liberi / utilizzabili fino a quando non saranno stati rimossi tutti i riferimenti ad essi. Prima di eliminare i file, assegnali (voce con nome Link) o fai ls -l su di essi (dovrebbe essere la seconda colonna).

Se si scopre che i file sono referenziati altrove, suppongo che dovrete ls -i i file per trovare il numero di inode, quindi fare una ricerca con -inum <nome-numero> per trovare il altri riferimenti a quel file (probabilmente vorrai usare anche -mount per rimanere nello stesso filesystem).


4

Il file è ancora bloccato dal processo di apertura. Per liberare spazio, attenersi alla seguente procedura:

  1. Esegui sudo lsof | grep deletede vedi quale processo contiene il file. Risultato di esempio:

    $ sudo lsof | grep deleted
    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
    cron     1623 root    5u   REG   0,21        0 395919638 /tmp/tmpfPagTZ4 (deleted)
    
  2. Uccidi il processo usando sudo kill -9 {PID}. Nel precedente esempio, il PID è 1623.

    $ sudo kill -9 1623
    
  3. Esegui dfper verificare se lo spazio è già stato liberato. Se è ancora pieno, forse devi attendere qualche secondo e ricontrollare.


4

Se la partizione è stata configurata per riservare una determinata porzione di spazio su disco solo per l'utilizzo come root, dfnon includerà questo spazio come disponibile.

[root@server]# df -h
Filesystem            Size  Used Avail Use% Mounted on
...
/dev/optvol           625G  607G     0 100% /opt
...

Anche dopo che lo spazio verrà recuperato eliminando file / directory, l'utente non root non sarà in grado di scrivere su una particolare partizione.

Puoi facilmente verificare se è il tuo caso provando a creare un file su un dispositivo come utente root e non root.

Inoltre è possibile controllare la configurazione del filesystem eseguendo

tune2fs -l <device> | egrep "Block count|Reserved block count

e calcolare la% effettiva da soli.

Per modificare la% del disco riservata per l'utilizzo solo come root, eseguire

tune2fs -m <percentage> <device>

1

Le altre risposte sono corrette: se si elimina un file e lo spazio non viene liberato, di solito è perché il file è ancora tenuto aperto o ci sono altri collegamenti a esso.

Per aiutare nella risoluzione dei problemi, utilizzare uno strumento che indica dove viene speso lo spazio su disco: è possibile utilizzare duper ottenere una panoramica di dove sta andando lo spazio. Ancora meglio, usa uno strumento grafico come xdiskusage (ce ne sono molti come questo) per dare la caccia al colpevole. xdiskusage e i tuoi amici ti consentono di esplorare i più grandi maiali dello spazio per scoprire dove sta andando lo spazio.

In questo modo, troverai rapidamente file che occupano ancora spazio a causa di un secondo collegamento fisico. Mostrerà anche lo spazio occupato dai file eliminati, ma aperti (come (permesso negato), credo, poiché non è in grado di leggere il nome del file).


1

Dal momento che so /varche molti di voi lo stanno facendo per redhat in e gziping dei file che si aspettano che l'FS si riduca, ma invece cresce, assicurati solo di eseguire il riavvio di syslog. e

lsof -v file

te lo mostrerei comunque.


1
Questo non aggiunge molto; la risposta accettata copriva la logica dietro quella nel 2001. Quando hai 50 rappresentanti, usa i commenti se vuoi aggiungere qualificatori alle risposte esistenti.
Andrew B,

0

Un'altra opzione: il disco potrebbe essere pieno a causa di un processo che crea continuamente dati: registri, core e simili. È possibile che lo spazio venga effettivamente liberato ma venga immediatamente riempito. In realtà ho visto un caso del genere. dfin questo caso semplicemente non dà l'immagine del buco. Usa duper saperne di più.


0

Sto usando EXT2, FSCK mi ha aiutato in questa situazione. Prova shudown -F ora, dopo alcuni riavvii e fscks, vedo metà spazio utilizzato.


1
Caro Marcello, la tua soluzione è racchiusa nella risposta accettata; e a volte non vuoi fare un riavvio se non sei costretto a ...
Deer Hunter

-1

Per verificare quali file eliminati hanno occupato la memoria, immettere il comando

 $ sudo lsof | grep deleted

Mostrerà i file eliminati che contengono memoria.

Quindi uccidi il processo con pid o nome

$ sudo kill <pid>
$ df -h

controlla ora avrai la stessa memoria

In caso contrario, digitare il comando seguente per vedere quale file sta occupando memoria

# cd /
# du --threshold=(SIZE)

menzionando qualsiasi dimensione mostrerà quali file occupano al di sopra della dimensione di soglia ed eliminando il file troverai la memoria mantenuta


-4

apri il terminale prova questo comando df -Quindi usa questo comando sudo du -h --max-depth = 1 / in questo comando troverai i dettagli sull'uso del disco quindi apri come utente root elimina il file (root-local-share-trash) ed elimina il tuo file

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.