Gestion des quotas sous Linux (ext4, XFS)
Table des matières
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.
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.
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.).
On devra créer un système de fichiers avec l'option quota, par exemple :
Si le système de fichiers est déjà existant, on le modifiera avec tune2fs (le système de fichiers doit être démonté :
Pour activer les quotas, on utilisera la commande quotaon sur le point de montage :
Pour les activer au montage de la partition, on mettra les options usrquota et/ou grpquota selon le besoin dans le fichier /etc/fstab :
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 :
Ce qui renvoie :
Une fois le système de fichiers monté avec les options de quota, on devra initialiser les fichiers de quota :
-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.
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 :
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) :
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 :
On pourra vérifier les quotas paramétrés d'un utilisateur avec :
Ce qui renvoie :
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 :
Puis je tente de générer à nouveau 300Mo :
Le message d'erreur apparait :
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 :
Ce qui donne :
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 :
Un avertissement s'affiche :
Je peux continuer à écrire :
Passé le délai, si je n'ai pas libéré de la place, je ne peux plus écrire :
Le message m'envoie balader :
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 :
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.
Pour les systèmes de fichiers XFS, on a un utilitaire à notre disposition :
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 :
Ce qui renvoie :
Cette commande xfs_quota est utilisable en une seule ligne, avec l'option -c :
Pour définir des quotas, on utilisera la commande xfs_quota mais en mode expert (droits root uniquement) :
On pourra lister les quotas avec :
Ce qui donne :
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 :
On peut vérifier avec (-h pour avoir les valeurs lisibles de façon humaine) :
Ce qui renvoie :
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 :
Puis je tente de générer à nouveau 300Mo :
Le message d'erreur apparait :
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.
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
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
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"
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 [------]
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