df sous linux ne montrant pas l’espace libre correct après la suppression du fichier

144

J'ai des serveurs de fichiers qui sont utilisés pour stocker des fichiers. Les fichiers peuvent y résider pendant une semaine ou un an. Malheureusement, lorsque je supprime des fichiers du serveur, la dfcommande ne reflète pas l'espace libéré. Donc, finalement, le serveur est plein ( dfaffiche 99%) et mon script n'envoie plus de fichiers là-bas, sauf qu'il peut y avoir quelques dizaines de Go d'espace libre dessus.

J'ai le noatimedrapeau sur les partitions montées si cela fait une différence.

Aminah Nuraini
la source
Cela se produit-il sur une seule partition ou sur toutes les partitions?
Khaled
Eh bien, cela se passe sur ma partition de données principale, qui est la seule qui m’intéresse, puisque je n’écris / supprime que des fichiers dessus.
Veuillez m'éclairer avec la solution ou un lien vers une solution.
Quel (s) système (s) de fichiers? DF fait une statistique du superbloc, il se peut que votre système de fichiers ne mette pas à jour l’inode sb. Avez-vous essayé de vider la cache?
haricots
Utiliser ext4. Comment videz-vous les caches?

Réponses:

237

La suppression du nom de fichier ne supprime pas réellement le fichier. Un autre processus maintient le fichier ouvert, ce qui empêche sa suppression. redémarrez ou tuez ce processus pour libérer le fichier.

Utilisation

lsof +L1

pour savoir quel processus utilise un fichier supprimé (non lié).

Ignacio Vazquez-Abrams
la source
2
Les fichiers qui ont été supprimés n'ont pas été consultés depuis un mois et le seul processus qui y accède est nginx, c'est donc douteux.
40
+1 De plus, "lsof + L1" vous indiquera quel programme maintient les fichiers ouverts.
pehrs
4
En tant que root, exécutez "fichier lsof -n | grep", vous seriez surpris de la durée de conservation des fichiers en raison de processus les maintenant ouverts pour une raison quelconque. Si tout le reste échoue, redémarrez, je me sens mal de le suggérer, mais il va certainement s'assurer que rien ne retient le fichier. Par exemple, lsof + L1 est probablement la meilleure solution.
ScottZ
3
Tu viens de me sauver! Supprimé un fichier journal 93G, ne récupérant pas l’espace et ne pouvant comprendre pourquoi. Merci.
Luke Cousins
1
Dans le même ordre d'idées et si cela peut aider les autres, j'ai effacé un fichier nginx access.log volumineux, mais je n'ai pu récupérer de l'espace qu'après avoir redémarré nginx: service nginx restart
Nick
28

Comme Ignacio le mentionne, la suppression du fichier ne libèrera pas d'espace tant que vous n'avez pas supprimé les processus dont le descripteur est ouvert.

Néanmoins, vous pouvez récupérer l'espace sans tuer les processus. Tout ce que vous avez à faire est de supprimer les descripteurs de fichier.

Première exécution de lsof | grep supprimé pour identifier le processus contenant le fichier

[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)

Puis exécutez:

cd /proc/PID/fd

ensuite

[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)

Le "1" sera le descripteur de fichier. Maintenant, tapez "> FD" pour récupérer cet espace

> 1

Vous devrez peut-être répéter l'opération s'il existe d'autres processus contenant le fichier.

Adrián Deccico
la source
1
qu'est-ce que le > FDfait?
Préd
il supprime le descripteur de fichier
Adrián Deccico
2
cette >commande a-t-elle un nom? Je devais passer de zsh à bash pour pouvoir l'utiliser. Est-il possible de l'exécuter sur zsh?
ariera
1
c'est une redirection de sortie et donc tronque le fichier. Le long de serait "echo -n> 1" ou "true> 1". Cela ne supprime pas vraiment le FD, il pointe simplement sur un fichier vide par la suite.
eckes
8

Une possibilité est que le ou les fichiers que vous avez supprimés aient davantage de références dans le système de fichiers. Si vous avez créé des liens durs, plusieurs noms de fichiers pointeront sur les mêmes données et les données (le contenu réel) ne seront pas marquées comme étant gratuites / utilisables tant que toutes les références ne seront pas supprimées. Avant de supprimer des fichiers, faites-les statuer (Entrée nommée Links) ou faites-leur ls -l (cela devrait être la deuxième colonne).

S'il s'avère que les fichiers sont référencés ailleurs, je suppose que vous devrez ls -i le (s) fichier (s) pour trouver le numéro d'inode, puis faire une recherche avec -inum <numéro_inode> pour trouver le d'autres références à ce fichier (vous voudrez probablement aussi utiliser -mount pour rester dans le même système de fichiers).

Kjetil Joergensen
la source
4

Le fichier est toujours verrouillé par le processus qui l'ouvre. Pour libérer de l'espace, procédez comme suit:

  1. Exécuter sudo lsof | grep deletedet voir quel processus contient le fichier. Exemple de résultat:

    $ 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. Tuez le processus en utilisant sudo kill -9 {PID}. Dans l'échantillon ci-dessus, le PID est 1623.

    $ sudo kill -9 1623
    
  3. Exécuter dfpour vérifier si l'espace est déjà libéré. S'il est toujours plein, vous devrez peut-être attendre quelques secondes et vérifier à nouveau.

Aminah Nuraini
la source
4

Si la partition a été configurée pour réserver une partie de l’espace disque uniquement à l’usage de la racine, dfn’incluez pas cet espace disponible.

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

Même après que l'espace aura été récupéré en supprimant des fichiers / répertoires, l'utilisateur non root ne pourra pas écrire sur une partition particulière.

Vous pouvez facilement vérifier si c'est votre cas en essayant de créer un fichier sur un périphérique en tant qu'utilisateur root et non root.

De plus, vous pouvez vérifier la configuration du système de fichiers en exécutant

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

et en calculant le% réel par vous-même.

Pour changer le disque% réservé à l'usage de la racine seulement, exécutez

tune2fs -m <percentage> <device>
luka5z
la source
1

Les autres réponses sont correctes: si vous supprimez un fichier et que l’espace n’est pas libéré, c’est généralement soit parce que le fichier est toujours ouvert, soit qu’il contient d’autres liens physiques.

Pour vous aider en cas de problème, utilisez un outil qui vous indique où l’espace disque est utilisé: vous pouvez utiliser dupour obtenir une vue d’ensemble de l’ utilisation de l’espace disque . Mieux encore, utilisez un outil graphique tel que xdiskusage (il y en a beaucoup comme celui-ci) pour traquer le coupable. xdiskusage et ses amis vous permettent d’explorer les plus gros porcs de l’espace pour savoir où va l’espace.

De cette façon, vous trouverez rapidement les fichiers qui occupent encore de la place grâce à un deuxième lien permanent. Il montrera également l’espace occupé par les fichiers supprimés mais ouverts (en tant que (permission refusée), je crois, car il ne peut pas lire le nom du fichier).

sleske
la source
1

Étant donné que je sais que beaucoup d'entre vous le font pour redhat in /varet gzipping les fichiers s'attendant à ce que le système de fichiers diminue, mais au lieu de cela, sa taille augmente, assurez-vous simplement de prendre en charge le redémarrage de syslog. et

lsof -v file

vous montrerait cela de toute façon.

utilisateur1802263
la source
1
Cela n'ajoute pas grand chose. la réponse acceptée couvrait la logique qui sous-tendait celle de 2001. Lorsque vous avez 50 représentants, utilisez des commentaires si vous souhaitez ajouter des qualificatifs aux réponses existantes.
Andrew B
0

Une autre option: le disque est peut-être saturé à cause d'un processus qui crée en permanence des données: journaux, cœurs, etc. Il est possible que l'espace soit réellement libéré mais qu'il soit immédiatement rempli. J'ai effectivement vu un tel cas. dfdans ce cas, ne donne simplement pas l'image du trou. Utilisez dupour en savoir plus.

Chen Levy
la source
0

J'utilise EXT2, FSCK m'a aidé dans cette situation. Essayez shudown -F maintenant, après quelques redémarrages et fscks, je vois un espace à moitié utilisé.

Marcellus
la source
1
Cher Marcellus, votre solution est comprise dans la réponse acceptée; et parfois vous ne voulez pas faire de redémarrage si vous n'êtes pas obligé de ...
Deer Hunter
-1

Pour vérifier quels fichiers supprimés ont occupé de la mémoire, entrez la commande

 $ sudo lsof | grep deleted

Il montrera les fichiers supprimés qui contiennent de la mémoire.

Puis tuez le processus avec pid ou name

$ sudo kill <pid>
$ df -h

vérifiez maintenant que vous aurez la même mémoire

Sinon tapez la commande ci-dessous pour voir quel fichier occupe de la mémoire

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

mentionner n'importe quelle taille, il montrera quels fichiers occupent au dessus de la taille seuil et efface le fichier que vous trouverez la mémoire conservée

Javeed Shakeel
la source
-4

terminal ouvert essayez cette commande df -Th utilisez ensuite cette commande sudo du -h --max-depth = 1 / dans cette commande, vous trouverez le détail de l'utilisation du disque, puis l'ouvrir en tant qu'utilisateur root, supprime le fichier (root-local-share-trash). et supprimez votre fichier

Rilson
la source