Généralités système Linux

Gestion des quotas sous Linux (ext4, XFS)

Table des matières

Introduction



Sous LInux, il est possible de mettre en place des quotas. C'est un mécanisme qui permet de limiter l'utilisation des ressources système, notamment l'espace disque, pour des utilisateurs ou des groupes.
On pourra les mettre en place dans des environnements multi-utilisateurs, où on voudra par exemple que les ressources soient utilisées de manière équitable et efficace.

Au cours de cet article, je vais exécuter les commandes dans un contexte anglais pour éviter les traductions étranges.

A propos des quotas



Avant toute chose, quelques définitions pour ceux qui ne sont pas familiers avec ce concept, peu souvent vu sous Linux.

Un quota est une limite imposée sur la quantité de ressources qu'un utilisateur ou un groupe peut consommer, et ainsi, on pourra contrôler l'utilisation de l'espace disque. Les quotas peuvent être appliqués à des fichiers systèmes, des répertoires ou des systèmes de fichiers entiers.

Il existe principalement deux options de quotas sous Linux :
- le quota utilisateur qui limite l'espace disque utilisé par un utilisateur spécifique
- le quota groupe qui limite l'espace disque utilisé par un groupe d'utilisateurs.

Dans ces deux options de quotas, on pourra définir deux types de limites :
soft limit : c'est une limite d'avertissement. On pourra dépasser cette limite pendant une période paramétrée (grace period). Si on dépasse ce quota, on reçoit un avertissement, mais on peut continuer à écrire des données jusqu'à la hard limit ou que la période de grâce expire. (Permet une flexibilité de façon temporaire)
hard limit : c'est une limite stricte. Une fois qu'on atteint cette limite, on ne peut plus écrire de données sur le système de fichiers.

Aussi, on parela d'inode. Il sert à stocker des informations sur un fichier ou un répertoire. Chaque fichier ou répertoire sur un système de fichiers a un inode associé, qui contient des métadonnées. Chaque inode est identifié par un numéro unique dans le système de fichiers. Ce numéro est utilisé par le système pour accéder aux métadonnées du fichier. En gros, comprenez, dans le cas des quotas : 1inode = 1 fichier ou 1 dossier.

Dans mon expérience, on utilise les quotas par utilisateur, et avec une limite hard dans la plupart des cas. L'article sera orienté sur cette thématique principalement.

Prérequis



Avant de configurer les quotas, on devra respecter quelques conditions :
- Avoir des droits super-utilisateurs
- Avoir un système de fichiers sur lequel on peut appliquer les quotas (xfs, ext4, etc.).

Les quotas avec un système de fichiers ext4



Prérequis ext4



On devra créer un système de fichiers avec l'option quota, par exemple :
Code BASH :
mkfs.ext4 -O quota /dev/sdb1


Si le système de fichiers est déjà existant, on le modifiera avec tune2fs (le système de fichiers doit être démonté :
Code BASH :
tune2fs -O quota /dev/sdb1


Pour activer les quotas, on utilisera la commande quotaon sur le point de montage :
Code BASH :
quotaon /mnt/data


Pour les activer au montage de la partition, on mettra les options usrquota et/ou grpquota selon le besoin dans le fichier /etc/fstab :
Code BASH :
/dev/sdb1       /mnt/data       ext4    defaults,usrquota      0 0


Il est nécessaire de connaitre la taille en octets d'un bloc (pour définir les limites plus tard). On pourra obtenir l'info avec :
Code BASH :
tune2fs -l /dev/sdb1 | grep -i "block size"


Ce qui renvoie :
Code :
Block size:               4096


Initialiser les quotas ext4



Une fois le système de fichiers monté avec les options de quota, on devra initialiser les fichiers de quota :

Code BASH :
quotacheck -cug /mnt/data

-c : Crée les fichiers de quota s'ils n'existent pas.
-u : Vérifie les quotas d'utilisateur.
-g : Vérifie les quotas de groupe.

Les fichiers de aquota.user et aquota.group sont créés. Ils sont accessible en lecture/écriture par root uniquement.

Configurer les quotas ext4



Pour définir des quotas pour un utilisateur ou un groupe, on utilisera la commande edquota.
Si je veux définir les quotas pour l'utilisateur adrien :
Code BASH :
edquota adrien


Si on veut fixer les quotas à un groupe :
Code BASH :
edquota -g users


Cela ouvrira l'étiteur de texte par défaut, et on pourra spécifier les limites de blocs et d'inodes.

Par défaut, on a ceci qui se propose (sur une RHEL9) :
Code :
Disk quotas for user adrien (uid 1000):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sdb1                        20          0          0          2        0        0


La première colonne est le nom du système de fichiers pour lequel un quota est activé.
La deuxième colonne indique le nombre de blocs que l'utilisateur utilise actuellement.
Les deux colonnes suivantes servent à définir des limites de blocs soft et hard pour l'utilisateur sur le système de fichiers.
La colonne inodes indique le nombre d'inodes que l'utilisateur utilise actuellement.
Les deux dernières colonnes sont utilisées pour définir les limites d'inodes soft et hard pour l'utilisateur sur le système de fichiers.

Voici un exemple de configuration :

Si on souhaite définir un quota de 1Go, sachant que la taille du bloc par défaut en ext4 est de 4096 octets :
1Go correspond à 1024*1024*1024 octets = 1 073 741 824 octets
1 bloc étant 4096 octets 1073741824/4096 = 262 144 blocs

Ce qui donne :
Code :
Disk quotas for user adrien (uid 1000):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sdb1                        20          0     262144          2        0        0



On pourra vérifier les quotas paramétrés d'un utilisateur avec :
Code BASH :
repquota /dev/sdb1


Ce qui renvoie :
Code :
*** Report for user quotas on device /dev/sdb1
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
adrien    --      20       0  262144              2     0     0       


Démo : tester les quotas stricts ext4



Dans cet article, on va faire une démo de dépassement du quota en générant des fichiers.
Précédemment, j'ai définit 1Go de quota pour l'utilisateur adrien dans le pour le système de fichiers /mnt/data.

Je génère un fichier de 800Mo :
Code BASH :
yes coucou | head -c 800M > coucou.txt


Puis je tente de générer à nouveau 300Mo :
Code BASH :
yes depassement | head -c 300M > depassement.txt


Le message d'erreur apparait :
Code TEXT :
sdb1: write failed, user block limit reached.
head: erreur d'écriture dans 'standard output': Débordement du quota d'espace disque


Définir une période de grâce pour des limites soft ext4



Comme vu au début de l'article, on peut définir des quotas "soft". Un avertissement des produit en cas de dépassement de la valeur, et il est possible de dépasser le quota jusqu'à la limite hard ou pendant une période donnée. Cette période de grâce est par défaut à 7 jours.

On va pouvoir définir cette période avec la commande :
Code BASH :
edquota -t


Ce qui donne :
Code :
Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
  Filesystem             Block grace period     Inode grace period
  /dev/sdb1                     7days                  7days


La commande edquota définit les quotas pour un utilisateur ou groupe particulier, mais le paramétrage se fait par système de fichiers. la période de grâce quant à elle, est globale.

Démo des quotas soft ext4



Après avoir défini une période de grâce courte, et une limite soft de 1Go comme vu précédement, je tente d'écrire à nouveau du contenu :
Code BASH :
yes coucou | head -c 1200M > coucou.txt


Un avertissement s'affiche :
Code :
sdb1: warning, user block quota exceeded.


Je peux continuer à écrire :
Code BASH :
yes depassement | head -c 300M > depassement.txt


Passé le délai, si je n'ai pas libéré de la place, je ne peux plus écrire :
Code BASH :
yes depassement2 | head -c 300M > depassement2.txt


Le message m'envoie balader :
Code :
sdb1: write failed, user block quota exceeded too long.
head: error writing 'standard output': Disk quota exceeded


Les quotas avec un système de fichiers xfs



Prérequis xfs



Il n'y a pas de prérequis pour utiliser les quotas avec xfs.

Pour les activer au montage de la partition, on mettra les options quota et/ou gquota selon le besoin dans le fichier /etc/fstab :
Code BASH :
/dev/sdb2       /mnt/xfs        xfs     defaults,uquota 0 0


Il n'est pas nécessaire d'initialiser les quotas avec XFS comme on le faisait avec ext4.

XFS utilisera des valeurs en Octets au lieu d'un nombre de blocs.


Rapports de quotas avec xfs_quota



Pour les systèmes de fichiers XFS, on a un utilitaire à notre disposition :
Code BASH :
xfs_quota


A cet instant, on rentre dans une sorte de shell spécifique, où on pourra taper des commandes.
Pour voir l'état des quotas pour un utilisateur :
Code BASH :
xfs_quota> quota adrien


Ce qui renvoie :
Code BASH :
Disk quotas for User adrien (1000)
Filesystem              Blocks      Quota      Limit  Warn/Time      Mounted on
/dev/sdb1              1126424     262144          0   00  [0 days] /mnt/data


Cette commande xfs_quota est utilisable en une seule ligne, avec l'option -c :
Code BASH :
xfs_quota -c "quota adrien"


Les utilisateurs non privilégiés peuvent exécuter cette commande pour visualiser leur quota.

Configurer les quotas xfs



Pour définir des quotas, on utilisera la commande xfs_quota mais en mode expert (droits root uniquement) :
Code BASH :
xfs_quota -x /dev/sdb2


On pourra lister les quotas avec :
Code BASH :
xfs_quota> report


Ce qui donne :
Code :
User quota on /mnt/xfs (/dev/sdb2)
                               Blocks                     
User ID          Used       Soft       Hard    Warn/Grace     
---------- -------------------------------------------------- 
root                0          0          0     00 [--------]



La première colonne est le nom de l'utilisateur pour lequel un quota est activé.
La deuxième colonne indique la taille que l'utilisateur utilise actuellement.
Les deux colonnes suivantesindiquent les limites (en octet) soft et hard pour l'utilisateur sur le système de fichiers.

Voici un exemple de configuration :

Si on souhaite définir un quota de 1Go, on utilisera la commande :
Code BASH :
xfs_quota> limit bhard=1G adrien


On peut vérifier avec (-h pour avoir les valeurs lisibles de façon humaine) :
Code BASH :
xfs_quota> report -h


Ce qui renvoie :
Code :
User quota on /mnt/xfs (/dev/sdb2)
                        Blocks              
User ID      Used   Soft   Hard Warn/Grace   
---------- --------------------------------- 
root            0      0      0  00 [------]
adrien          0      0     1G  00 [------]


Si on ne veut pas rentrer dans le mini-shell xfs_quota, on pourra utiliser l'option -c à xfs_quota :
Code BASH :
xfs_quota -x -c "limit bhard=1G adrien" /mnt/xfs

Code BASH :
xfs_quota -x -c "report -h" /mnt/xfs


Démo : tester les quotas stricts xfs



Dans cet article, on va faire une démo de dépassement du quota en générant des fichiers.
Précédemment, j'ai définit 1Go de quota pour l'utilisateur adrien dans le pour le système de fichiers /mnt/xfs.

Je génère un fichier de 800Mo :
Code BASH :
yes coucou | head -c 800M > coucou.txt


Puis je tente de générer à nouveau 300Mo :
Code BASH :
yes depassement | head -c 300M > depassement.txt


Le message d'erreur apparait :
Code TEXT :
head: erreur d'écriture dans 'standard output': Débordement du quota d'espace disque

Cette page a été vue 3659 fois