Solaris 10 ZFS - Résoudre les problèmes de quota dépassé (disc quota exceeded)

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@SRVUNXFR3> zfs list | grep 'Software'
NAME                         USED  AVAIL  REFER  MOUNTPOINT
rpool/SOFTWARE              12.0G      0  11.5G  /Software
sybase@SRVUNXFR3> 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@SRVUNXFR3> 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@SRVUNXFR3> 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@SRVUNXFR3>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@SRVUNXFR3> cd /Software/sybase/dba/scratch

sybase@SRVUNXFR3> 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@SRVUNXFR3> 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é sur ce fichier et l'espace est alors libéré.

sybase@SRVUNXFR3> rm sybase_boot.log

sybase@SRVUNXFR3> 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.