web-dev-qa-db-fra.com

df sous linux ne montrant pas l'espace libre correct après la suppression du 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 un an. Malheureusement, lorsque je supprime des fichiers du serveur, la commande df ne reflète pas l'espace libéré. Donc, finalement, le serveur est rempli (df affiche 99%), et mon script n'envoie plus de fichiers là-bas, sauf qu'il peut y avoir quelques dizaines de Go d'espace libre là-bas.

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

157
user11350

La suppression du nom de fichier ne supprime pas réellement le fichier. Un autre processus maintient le fichier ouvert, empêchant 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é).

249

comme le mentionne Ignacio, la suppression du fichier ne libérera pas de l'espace tant que vous n'aurez pas supprimé les processus qui ont des poignées ouvertes sur ce fichier.

Néanmoins, vous pouvez récupérer l'espace sans tuer les processus. Il vous suffit de supprimer les descripteurs de fichiers.

Exécutez d'abord 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)

Exécutez ensuite:

cd /proc/PID/fd

puis

[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 s'il existe d'autres processus contenant le fichier.

29
Adrián Deccico

Une possibilité est que le ou les fichiers que vous avez supprimés aient plus de références dans le système de fichiers. Si vous avez créé des liens physiques, 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, lisez-les (entrée nommée Liens) ou effectuez ls -l dessus (qui 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 <inode-number> 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).

8
Kjetil Joergensen

Si la partition a été configurée pour réserver une certaine partie de l'espace disque uniquement pour une utilisation root, 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 que l'espace sera récupéré en supprimant les 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 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 calculer vous-même le% réel.

Pour changer le disque% réservé à un usage root uniquement, exécutez

tune2fs -m <percentage> <device>
6
luka5z

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

  1. Courir Sudo lsof | grep deleted et voyez 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'exemple ci-dessus, le PID est 1623.

    $ Sudo kill -9 1623
    
  3. Exécutez df pour 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.

4
Aminah Nuraini

Puisque je sais qu'une tonne d'entre vous le font pour redhat dans /var et les fichiers gzipping s'attendant à ce que le FS se rétrécisse, mais à la place, il se développe, assurez-vous simplement de redémarrer Syslog.

lsof -v file

vous le montrerait de toute façon.

1
user1802263

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 parce que le fichier est toujours ouvert ou qu'il existe d'autres liens physiques.

Pour aider au dépannage, utilisez un outil qui vous indique où l'espace disque est dépensé: Vous pouvez utiliser du pour obtenir un aperçu de l'emplacement de l'espace. Encore mieux, utilisez un outil graphique comme xdiskusage (il y en a beaucoup comme ça) pour traquer le coupable. xdiskusage et ses amis vous permettent de percer les plus gros porcs spatiaux pour trouver où va l'espace.

De cette façon, vous trouverez rapidement des fichiers qui occupent toujours de l'espace en raison d'un deuxième lien dur. Il montrera également l'espace occupé par les fichiers supprimés mais ouverts (comme (autorisation refusée), je crois, car il ne peut pas lire le nom du fichier).

1
sleske

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

0
Marcellus

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

0
Chen Levy