Introduction
Très soudainement, une zone de stockage zfs est saturée à 100% sous Solaris 10. Cette saturation peut avoir diverses origines : un fichier coredump
très volumineux généré, un fichier de log qui croît de façon exponentielle…
sybase@SRVUNXFR> zfs list | grep 'Software'
NAME USED AVAIL REFER MOUNTPOINT rpool/SOFTWARE 12.0G 0 11.5G /Software
sybase@SRVUNXFR> df -k /Software
Filesystem 1024-blocks Used Available Capacity Mounted on rpool/SOFTWARE 12582912 12055500 0 100% /Software
En utilisant la commande rm
, la suppression des fichiers volumineux est refusée avec le message "Disc quota exceeded
" :
sybase@SRVUNXFR> rm sybase_exploit.log
rm: cannot remove file sybase_exploit.log: Disc quota exceeded
La commande mv
est également sans effet avec le même message :
sybase@SRVUNXFR> mv sybase_exploit.log /ADB
mv: cannot unlink sybase_exploit.log: Disc quota exceeded
La résolution de ce problème est décrite dans cet article sans devoir redimensionner les zones ZFS et les quotas.
Résolution et contournement du problème
Les fichiers de plus de 1 Gb dans /Software sont recherchés avec la commande find
:
sybase@SRVUNXFR> find /Software -size +1000000 -print
./sybase/dba/scratch/sybase_boot.log ./sybase/dba/SMA_U1_ASE/log/SMA_U1_ASE_110710_2.log ./sybase/dba/SMA_U1_ASE/log/SMA_U1_ASE_110710_1.log
Le fichier sybase_boot.log est le plus volumineux (2,2 Gb)
sybase@SRVUNXFR> cd /Software/sybase/dba/scratch sybase@SRVUNXFR> ls -lha sybase_boot.log
-rw-r--r-- 1 sybase dba 2.2G Jul 9 22:13 sybase_boot.log
La commande rm
est sans effet avec le message "Disc quota exceeded
".
Pour réinitialiser à zéro le fichier, copier /dev/null
dans ce fichier :
sybase@SRVUNXFR> cp /dev/null sybase_boot.log
-rw-r--r-- 1 sybase dba 0 Jul 10 01:20 sybase_boot.log
Lorsque le fichier est mis à zero, la commande rm
peut être utilisée sur ce fichier et l’espace est alors libéré.
sybase@SRVUNXFR> rm sybase_boot.log sybase@SRVUNXFR> df -k /Software
Filesystem 1024-blocks Used Available Capacity Mounted on rpool/SOFTWARE 12582912 10274183 1784943 86% /Software
Lorsqu’assez d’espace est récupéré grâce à cette méthode, l’utilisation de la commande rm
redevient opérationnelle.
Cette procédure n’est valable que si des process n’accèdent pas
au fichier (fopen
). Pour vérifier les process qui pointent sur le fichier,
utiliser la commande fuser
et supprimer ces process avant d’appliquer la
méthode cp /dev/null <fichier>
.
Pour retrouver les process qui accèdent à un fichier : Solaris - Retrouver rapidement les process attachés à un fichier avec fuser et ps
Explication du problème : ZFS Copy on Write FileSystem
La technologie ZFS est un système de fichier "Copy on Write
", aussi la suppression d’un fichier a besoin d’espace sur le même disque avant la suppression effective : l’espace requis lors de la suppression correspond à l’écriture des méta données concernées avant de désallouer le fichier.