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.
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é).
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.
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).
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>
Le fichier est toujours verrouillé par le processus qui l'ouvre. Pour libérer de l'espace, procédez comme suit:
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)
Tuez le processus en utilisant Sudo kill -9 {PID}
. Dans l'exemple ci-dessus, le PID est 1623.
$ Sudo kill -9 1623
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.
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.
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).
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é.
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.