253 votes

df sous linux n'indique pas l'espace libre correct après la suppression d'un fichier

J'ai des serveurs de fichiers qui sont utilisés pour stocker des fichiers. Les fichiers peuvent y résider pendant une semaine, ou pendant un an. Malheureusement, quand je retire des fichiers du serveur, df ne reflète pas l'espace libéré. Donc finalement, le serveur se remplit ( df montre 99%), et mon script n'y envoie plus de fichiers, sauf qu'il pourrait y avoir quelques dizaines de Go d'espace libre.

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

0 votes

Cela se produit-il sur une seule partition ou sur toutes les partitions ?

0 votes

Eh bien, cela se passe sur ma partition de données principale, qui est la seule dont je me soucie, puisque je ne fais qu'écrire/supprimer des fichiers sur celle-ci.

0 votes

Veuillez m'éclairer en me donnant la solution, ou un lien vers celle-ci.

406voto

David Points 344

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 arrêtez ce processus pour libérer le fichier.

Utilisez

lsof +L1

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

3 votes

Les fichiers supprimés n'ont pas été consultés depuis plus d'un mois, et le seul processus qui y accède est nginx, donc c'est douteux.

54 votes

+1. De même, "lsof +L1" vous indiquera quel programme maintient les fichiers ouverts.

5 votes

En tant que root, lancez "lsof -n | grep file", vous serez surpris de voir combien de temps les fichiers peuvent rester en place à cause des processus qui les maintiennent ouverts pour une raison quelconque. Si tout le reste échoue, redémarrez, je me sens mal de le suggérer mais cela permettra de s'assurer que rien ne s'accroche au fichier. Par pehrs, lsof +L1 est probablement la meilleure façon d'aller.

54voto

Adrián Deccico Points 543

Comme le mentionne Ignacio, la suppression du fichier ne libérera pas l'espace tant que vous n'aurez pas supprimé les processus qui ont des handles ouverts sur ce fichier.

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 fichiers.

Exécutez d'abord lsof | grep deleted pour identifier le processus détenant 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)

Alors exécutez :

cd /proc/PID/fd

entonces

[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. Tapez maintenant "> FD" pour récupérer cet espace.

> 1

Vous devrez peut-être répéter l'opération si d'autres processus détiennent le fichier.

2 votes

Que fait le > FD faire ?

0 votes

Il supprime le descripteur de fichier

2 votes

Fait ceci > a un nom ? J'ai dû passer de zsh à bash pour pouvoir l'utiliser. Est-il possible de l'exécuter sur zsh ?

19voto

luka5z Points 231

Si la partition a été configurée pour réserver une certaine partie de l'espace disque à l'usage exclusif de la racine, df n'inclura pas cet espace comme disponible.

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

Même après avoir récupéré de l'espace en supprimant des fichiers/répertoires, l'utilisateur non root ne pourra pas écrire sur cette partition.

Vous pouvez facilement vérifier si c'est votre cas en essayant de créer un fichier sur un appareil 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 de calculer le pourcentage réel par vous-même.

Pour modifier le pourcentage de disque réservé à l'usage exclusif de l'utilisateur root, exécutez

tune2fs -m <percentage> <device>

0 votes

On ne devrait pas dire "merci" dans les commentaires. Ici, je le fais quand même.

15voto

Aminah Nuraini Points 999

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

  1. Exécuter sudo lsof | grep deleted et voir quel processus détient 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. Arrêtez le processus en utilisant sudo kill -9 {PID} . Dans l'exemple ci-dessus, le PID est 1623.

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

12voto

dF. Points 29787

Une possibilité est que le ou les fichiers que vous avez supprimés ont plus de références dans le système de fichiers. Si vous avez créé des liens durs, plusieurs noms de fichiers pointeront vers les mêmes données, et les données (le contenu réel) ne seront pas marquées comme libres/utilisables tant que toutes les références à celles-ci n'auront pas été supprimées. Avant de supprimer des fichiers, il faut soit les statuer (entrée nommée Liens), soit faire ls -l sur eux (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, et ensuite faire une recherche avec -inum <numéro d'inode> pour trouver les autres références à ce fichier (vous voudrez probablement aussi utiliser -mount pour rester dans le même système de fichiers).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X