Traduction(s) : aucune


disk-quota.png

Cet article tente de présenter les différentes manières de gérer les quotas sous Debian. Notez que la notion de quota peut s'appliquer à un grand nombre de ressources locales, pas uniquement au système de fichier et pas uniquement la taille d'un répertoire. Le but de cet article n'est pas de dire quelle est la meilleure méthode, mais de présenter ce qui existe. Le lecteur sera seul juge pour savoir ce qui correspond le mieux à son besoin.

Système de fichier

Limiter la taille d'un répertoire

Présentation générale

Les outils de gestion de quota sont fonctions du système d'exploitation, du système de fichier et éventuellement du serveur de partage de fichiers utilisé.

L'objectif de cette partie est d'étudier les différents choix possibles dans le contexte Debian.

Références:

Cadre:

Objectif: Étudier les solutions bas-niveau permettant de limiter l'espace disque alloué à certaines branches d'une arborescence de répertoire.

Présentation des méthodes existantes : Sous Linux, il existe trois méthodes :

A priori, seul le système de fichier XFS supporte project quota.

Question(s):

  • Pourquoi n'utilise-t-on pas XFS plutôt que Ext3 par défaut sous Debian ? 1 2

  • Ext4 supporte-il le project quota ?

user quota et group quota

Présentation

Les droits UNIX standards n'autorisent l'affectation que d'un groupe par répertoire. Dans le cas d'une arborescence de dossiers, deux possibilités seront disponibles : avec ou sans ACL.

Il faut savoir que les quotas utilisent exclusivement les droits UNIX standards et pas les ACL :

Remarque(s):

  • A noter cependant que si les droits d'accès suivent scrupuleusement les mêmes affectations que les quotas alors, dans ce cas très particulier, on n'aura pas besoin d'utiliser les ACL et les quotas seront directement affectés aux groupes désignant les droits d'accès.

  • Attention, l'utilisateur "root" n'est pas toujours affecté par les quotas. Il n'est pas recommandé de tester le bon fonctionnement d'un quota avec ce compte utilisateur.
  • Enfin, il est important de comprendre que le quota sera réellement porté par le groupe et pas un répertoire. Si vous affectez ce groupe à trois répertoires, les trois consommeront le même quota.

Dans la suite de cette présentation, les droits d'accès aux répertoires seront supportés par des groupes affectés au niveau ACL. la gestion des quotas sera supportée par des groupes affectés au niveau des droits UNIX standard.

Si vous comprenez cet exemple, vous serez à même de l'appliquer pour toute autre situation.

Mise en place système

Sous l'utilisateur root

 grep -i CONFIG_QUOTA= /boot/config-*
   /boot/config-2.6.26-2-486:CONFIG_QUOTA=y
   /boot/config-2.6.26-2-686:CONFIG_QUOTA=y

 aptitude update
 aptitude install quota quotatool acl

 dd if=/dev/zero of=/root/file.ext3 bs=1M count=100
 mkfs.ext3 /root/file.ext3

Question(s):

  • En plus de Ext3, quels sont les autres formats de système de fichiers supportés par cette méthode ?

 mkdir /media/mount.ext3
 mount -o loop,usrquota,grpquota,acl /root/file.ext3 /media/mount.ext3

 quotacheck -c /media/mount.ext3

 /etc/init.d/quota start
   Checking quotas...done.
   Turning on quotas...done.

 quotaon -ugvap
   group quota on /media/mount.ext3 (/dev/loop0) is on
   user quota on /media/mount.ext3 (/dev/loop0) is on

 repquota -ust /media/mount.ext3
   *** Rapport pour les quotas user sur le périphérique /dev/loop0
   Période de sursis bloc : 7days ; période de sursis inode : 7days
                           Limites bloc               Limites fichier
   Utilisateur     utilisé souple stricte sursis utilisé souple stricte sursis
   ----------------------------------------------------------------------
   root      --    5663       0       0              4     0     0

 repquota -gst /media/mount.ext3
   *** Rapport pour les quotas group sur le périphérique /dev/loop0
   Période de sursis bloc : 7days ; période de sursis inode : 7days
                           Limites bloc               Limites fichier
   Groupe        utilisé souple stricte sursis utilisé souple stricte sursis
   ----------------------------------------------------------------------
   root      --    5663       0       0              4     0     0

Configuration des quotas

  mkdir /media/mount.ext3/dir20

 addgroup quota-dir20

  chown -R :quota-dir20 /media/mount.ext3/dir20
  chmod -R g+s /media/mount.ext3/dir20

  ls -l /media/mount.ext3 | grep dir20
   drwxr-sr-x 2 root quota-dir20  1024 aoû 13 09:32 dir20

 touch /media/mount.ext3/dir20/file1
 mkdir /media/mount.ext3/dir20/subdir
 touch /media/mount.ext3/dir20/subdir/file2
 ls -lgR /media/mount.ext3/
   /media/mount.ext3/:
   total 26
   -rw------- 1 root         7168 aoû 13 09:37 aquota.group
   -rw------- 1 root         6144 aoû 13 09:26 aquota.user
   drwxr-sr-x 3 quota-dir20  1024 aoû 13 09:39 dir20
   drwx------ 2 root        12288 aoû 13 09:22 lost+found
   
   /media/mount.ext3/dir20:
   total 1
   -rw-r--r-- 1 quota-dir20    0 aoû 13 09:39 file1
   drwxr-sr-x 2 quota-dir20 1024 aoû 13 09:39 subdir
   
   /media/mount.ext3/dir20/subdir:
   total 0
   -rw-r--r-- 1 quota-dir20 0 aoû 13 09:39 file2

 quotatool -g quota-dir20 -b -l 20MB /media/mount.ext3

Remarque(s):

  • C'est aussi faisable avec edquota

 repquota -gst /media/mount.ext3
   *** Rapport pour les quotas group sur le périphérique /dev/loop0
   Période de sursis bloc : 7days ; période de sursis inode : 7days
                           Limites bloc               Limites fichier
   Groupe        utilisé souple stricte sursis utilisé souple stricte sursis
   ----------------------------------------------------------------------
   root      --    5663       0       0              4     0     0
   quota-dir --       2       0   20480              4     0     0

Test de saturation

 useradd usertest

 groupadd access-subdir-rw

 setfacl -R -m g:access-subdir-rw:rwx /media/mount.ext3/dir20/subdir

 setfacl -R -m d:g:access-subdir-rw:rwx /media/mount.ext3/dir20/subdir

 getfacl -R /media/mount.ext3/dir20/subdir
   getfacl: Removing leading '/' from absolute path names
   # file: media/mount.ext3/dir20/subdir
   # owner: root
   # group: quota-dir20
   user::rwx
   group::r-x
   group:access-subdir-rw:rwx
   mask::rwx
   other::r-x
   default:user::rwx
   default:group::r-x
   default:group:access-subdir-rw:rwx
   default:mask::rwx
   default:other::r-x
   
   # file: media/mount.ext3/dir20/subdir/file2
   # owner: root
   # group: quota-dir20
   user::rw-
   group::r--
   group:access-subdir-rw:rwx
   mask::rwx
   other::r--

 usermod -a -G access-subdir-rw usertest

 id usertest
   uid=1001(usertest) gid=1004(usertest) groupes=1004(usertest),1005(access-subdir-rw)

 su - usertest

 touch /media/mount.ext3/dir20/file3
   touch: ne peut faire un touch sur `/media/mount.ext3/dir20/file3': Permission non accordée

 touch /media/mount.ext3/dir20/subdir/file3

 getfacl /media/mount.ext3/dir20/subdir/file3
   getfacl: Removing leading '/' from absolute path names
   # file: media/mount.ext3/dir20/subdir/file3
   # owner: usertest
   # group: quota-dir20
   user::rw-
   group::r-x                      #effective:r--
   group:access-subdir-rw:rwx      #effective:rw-
   mask::rw-
   other::r--

 dd if=/dev/zero of=/media/mount.ext3/dir20/subdir/10Mo.file1 bs=1M count=10
   10+0 enregistrements lus
   10+0 enregistrements écrits
   10485760 bytes (10 MB) copied, 0,103248 s, 102 MB/s

 exit
 repquota -gst /media/mount.ext3
   *** Rapport pour les quotas group sur le périphérique /dev/loop0
   Période de sursis bloc : 7days ; période de sursis inode : 7days
                           Limites bloc               Limites fichier
   Groupe        utilisé souple stricte sursis utilisé souple stricte sursis
   ----------------------------------------------------------------------
   root      --    5663       0       0              4     0     0
   quota-dir --   10287       0   20480              6     0     0

 su - usertest

 dd if=/dev/zero of=/media/mount.ext3/dir20/subdir/10Mo.file2 bs=1M count=10
   dd: écriture de `/media/mount.ext3/dir20/subdir/10Mo.file2': Débordement du quota d'espace disque
   10+0 enregistrements lus
   9+0 enregistrements écrits
   10391552 bytes (10 MB) copied, 0,100972 s, 103 MB/s

Remarque(s) :

  • On voit que le programme dd n'a pu écrire que 9 enregistrements de 1Mo, le dixième ayant occasionné le débordement de quota.

 cp /media/test/dir20/subdir/10Mo.file1 /media/mount.ext3/dir20/subdir/10Mo.file3
   cp: ne peut créer le fichier régulier `/media/mount.ext3/dir20/subdir/10Mo.file3': Débordement du quota d'espace disque

Dépannage

Trouver ici les messages d'erreur rencontrés lors de cette expérimentation.

quotaon: Impossible de trouver le fichier de quotas

Symptôme:

 quotaon -ugva
   quotaon: Impossible de trouver le fichier de quotas sur /media/test [/dev/loop0] pour activer/désactiver les quotas.
   quotaon: Impossible de trouver le fichier de quotas sur /media/test [/dev/loop0] pour activer/désactiver les quotas.

Résolution:

 quotacheck -c /media/mount.ext3

project quota

Réf:

Présentation

La méthode project quota est à ma connaissance supportée que par le système de fichier XFS. L'intérêt est qu'il n'est plus obligatoire de passer par les ACL dans le cas où la délimitation des quotas ne suit pas scrupuleusement celles des droits d'accès. En effet, les droits d'accès pourront continuer d'être affectés directement au niveau des droits UNIX standards. Les quotas seront quant à eux gérés dans un fichier de configuration dédié.

A noter que XFS supporte nativement la gestion des quotas et des ACL :

  • Il n'y a donc pas à les spécifier lors du montage du système de fichier.
  • Il n'y a aucune étape d'initialisation à faire comme avec les Ext3.
  • Il n'y a pas de groupe fictif à créer pour chaque quota et polluant la liste des groupes du système

  • Les informations des quotas étant enregistrés dans des fichiers dédiés et non dans /etc/group, il est plus facile de gérer des sécurisations haute disponibilté comme Hearbeat/DRDB et la sauvegarde de cette configuration.
  • Même l'utilisateur root est concerné par ce type quota.
  • Le noyau Linux est compilé par défaut pour gérer 25 ACL maximum par répertoire (cf. linux-source-2.6.26_2.6.26-26lenny2_all\data\linux-source-2.6.26\linux-source-2.6.26\fs\xfs\xfs_acl.h, #define XFS_ACL_MAX_ENTRIES 25)

Dans le cas suivant, les droits d'accès aux répertoires seront supportés par des groupes affectés au niveau ACL. Mais comme indiqué précédemment, la gestion des droits d'accès exclusivement via les droits UNIX standards est tout à fait possible si elle vous convient. Vous n'êtes pas obligés d'utiliser les ACL.

Mise en place système

Sous l'utilisateur root:

 grep -i CONFIG_XFS_QUOTA= /boot/config-*
 /boot/config-2.6.26-2-486:CONFIG_XFS_QUOTA=y
 /boot/config-2.6.26-2-686:CONFIG_XFS_QUOTA=y

 aptitude update
 aptitude install xfsprogs xfsdump

Question(s):

  • Je ne suis pas certain qu'xfsdump soit utile dans le cadre de cet exemple. A revérifier à l'occasion, mais il reste un outil bas niveau très recommandé lors de l'utilisation de système de fichier au format XFS.

 dd if=/dev/zero of=/root/file.xfs bs=1M count=100
 mkfs.xfs /root/file.xfs

 mkdir /media/mount.xfs
 mount -o loop,prjquota /root/file.xfs /media/mount.xfs

Configuration des quotas

 mkdir /media/mount.xfs/dir20

 echo 1:/media/mount.xfs/dir20 >> /etc/projects

 echo prjdir20:1 >> /etc/projid

Question(s):

  • Les noms et l'emplacement de ces deux fichiers de configuration sont-ils personnalisable ? En alternative, utiliser des liens symboliques pour stocker physiquement ces fichiers à un autre endroit de votre choix.

  xfs_quota -x -c 'project -s prjdir20' /media/mount.xfs
   Setting up project prjdir20 (path /media/mount.xfs/dir20)...
   Processed 1 /etc/projects paths for project prjdir20

Remarque(s):

  • La ligne de commande peut sembler un peu barbare, mais en fait, xfs_quota utilise sa propre interface de ligne de commande. J'ai choisi ici d'utiliser l'option -c pour lui passer directement les commandes à exécuter pour une question de présentation dans cet article. Vous pouvez également lancer xfs_quota /media/mount.xfs, puis une fois à l'invite de commande "xfs_quota>", saisissez la commande project -s prjdir20

  • xfs_quota pour plus d'info.

 xfs_quota -x -c 'limit -p bhard=20m prjdir20' /media/mount.xfs

 xfs_quota -x -c report /media/mount.xfs
   Project quota on /media/mount.xfs (/dev/loop1)
                                  Blocks
   Project ID       Used       Soft       Hard    Warn/Grace
   ---------- --------------------------------------------------
   prjdir20            0          0      20480     00 [--------]

 mkdir /media/mount.xfs/dir20/subdir

Test de saturation

  dd if=/dev/zero of=/media/mount.xfs/dir20/subdir/5Mo.file bs=1M count=5
   5+0 enregistrements lus
   5+0 enregistrements écrits
   5242880 bytes (5,2 MB) copied, 0,0131463 s, 399 MB/s

 xfs_quota -x -c report /media/mount.xfs
   Project quota on /media/mount.xfs (/dev/loop1)
                                  Blocks
   Project ID       Used       Soft       Hard    Warn/Grace
   ---------- --------------------------------------------------
   prjdir20         '''5120'''          0      20480     00 [--------]

 dd if=/dev/zero of=/media/mount.xfs/dir20/subdir/20Mo.file bs=1M count=20
   dd: écriture de `/media/mount.xfs/dir20/subdir/20Mo.file': Aucun espace disponible sur le périphérique
   15+0 enregistrements lus
   14+0 enregistrements écrits
   15724544 bytes (16 MB) copied, 1,53576 s, 10,2 MB/s

 rm /media/mount.xfs/dir20/subdir/20Mo.file

 useradd usertest

 groupadd access-subdir-rw

 setfacl -R -m g:access-subdir-rw:rwx /media/mount.xfs/dir20/subdir

  setfacl -R -m d:g:access-subdir-rw:rwx /media/mount.xfs/dir20/subdir

 getfacl -R /media/mount.xfs/dir20/subdir
   getfacl: Removing leading '/' from absolute path names
   # file: media/mount.xfs/dir20/subdir
   # owner: root
   # group: root
   user::rwx
   group::r-x
   group:access-subdir-rw:rwx
   mask::rwx
   other::r-x
   default:user::rwx
   default:group::r-x
   default:group:access-subdir-rw:rwx
   default:mask::rwx
   default:other::r-x
   
   # file: media/mount.xfs/dir20/subdir/5Mo.file
   # owner: root
   # group: root
   user::rw-
   group::r--
   group:access-subdir-rw:rwx
   mask::rwx
   other::r--

 usermod -a -G access-subdir-rw usertest

 id usertest
   uid=1001(usertest) gid=1004(usertest) groupes=1004(usertest),1005(access-subdir-rw)

 su - usertest

 touch /media/mount.xfs/dir20/file3
   touch: ne peut faire un touch sur `/media/mount.xfs/dir20/file3': Permission non accordée

 touch /media/mount.xfs/dir20/subdir/file3

 getfacl /media/mount.xfs/dir20/subdir/file3
   getfacl: Removing leading '/' from absolute path names
   # file: media/mount.xfs/dir20/subdir/file3
   # owner: usertest
   # group: usertest
   user::rw-
   group::r-x                      #effective:r--
   group:access-subdir-rw:rwx      #effective:rw-
   mask::rw-
   other::r--

 dd if=/dev/zero of=/media/mount.xfs/dir20/subdir/10Mo.file1 bs=1M count=10
   10+0 enregistrements lus
   10+0 enregistrements écrits
   10485760 bytes (10 MB) copied, 0,0249121 s, 421 MB/s

 exit
 xfs_quota -x -c report /media/mount.xfs
   Project quota on /media/mount.xfs (/dev/loop1)
                                  Blocks
   Project ID       Used       Soft       Hard    Warn/Grace
   ---------- --------------------------------------------------
   prjdir20        15364          0      20480     00 [--------]

 su - usertest

 dd if=/dev/zero of=/media/mount.xfs/dir20/subdir/10Mo.file2 bs=1M count=10
   dd: écriture de `/media/mount.xfs/dir20/subdir/10Mo.file2': Aucun espace disponible sur le périphérique
   5+0 enregistrements lus
   4+0 enregistrements écrits
   5234688 bytes (5,2 MB) copied, 1,51469 s, 3,5 MB/s

 cp /media/mount.xfs/dir20/subdir/10Mo.file1 /media/mount.xfs/dir20/subdir/10Mo.file3
   cp: ne peut créer le fichier régulier `/media/mount.xfs/dir20/subdir/10Mo.file3': Débordement du quota d'espace disque

Quotas imbriqués

 echo 2:/media/mount.xfs/dir20/subdir >> /etc/projects

 echo prjsubdir:2 >> /etc/projid

 xfs_quota -x -c 'project -s prjsubdir' /media/mount.xfs
   Setting up project prjsubdir (path /media/mount.xfs/dir20/subdir)...
   Processed 1 /etc/projects paths for project prjsubdir

 xfs_quota -x -c 'limit -p bhard=10m prjsubdir' /media/mount.xfs

 xfs_quota -x -c report /media/mount.xfs
   Project quota on /media/mount.xfs (/dev/loop1)
                                  Blocks
   Project ID       Used       Soft       Hard    Warn/Grace
   ---------- --------------------------------------------------
   prjdir20            0          0      20480     00 [--------]
   prjsubdir       20476          0      10240     00 [--none--]

 rm /media/mount.xfs/dir20/subdir/*

 xfs_quota -x -c report /media/mount.xfs
   Project quota on /media/mount.xfs (/dev/loop1)
                                  Blocks
   Project ID       Used       Soft       Hard    Warn/Grace
   ---------- --------------------------------------------------
   prjdir20            0          0      20480     00 [--------]
   prjsubdir           4          0      10240     00 [--------]

 dd if=/dev/zero of=/media/mount.xfs/dir20/5Mo.file bs=1M count=5
   5+0 enregistrements lus
   5+0 enregistrements écrits
   5242880 bytes (5,2 MB) copied, 0,0131275 s, 399 MB/s

 xfs_quota -x -c report /media/mount.xfs
   Project quota on /media/mount.xfs (/dev/loop1)
                                  Blocks
   Project ID       Used       Soft       Hard    Warn/Grace
   ---------- --------------------------------------------------
   prjdir20         5120          0      20480     00 [--------]
   prjsubdir           4          0      10240     00 [--------]

 dd if=/dev/zero of=/media/mount.xfs/dir20/subdir/5Mo.file bs=1M count=5
   5+0 enregistrements lus
   5+0 enregistrements écrits
   5242880 bytes (5,2 MB) copied, 0,0133598 s, 392 MB/s

 xfs_quota -x -c report /media/mount.xfs
   Project quota on /media/mount.xfs (/dev/loop1)
                                  Blocks
   Project ID       Used       Soft       Hard    Warn/Grace
   ---------- --------------------------------------------------
   prjdir20         5120          0      20480     00 [--------]
   prjsubdir        5124          0      10240     00 [--------]

Remarque(s):

  • Attention à bien comprendre cette gestion où les quotas imbriqués se décomptent les uns des autres. Prennez bonne note de l'effet de bord suivant :
  • Soit un système de fichier de 35Go /fs
  • J'ai un répertoire /fs/a sur lequel j'affecte un project quota de 30 Go
  • J'utilise deux sous-répertoires /fs/a/b1 et /fs/a/b2 contenant un volume de données respectif de 15 Go et 10 Go
  • A ce stade, mon quota est à 25Go sur 30Go d'utilisation et mon système de fichier n'est pas saturé.
  • Si je crée un fichier de 15 Go dans /fs/a/b2, je me heurte au project quota défini sur /fs/a et je ne sature pas mon système de fichier /fs
  • Maintenant je souhaite définir un nouveau project quota sur /fs/a/b1 de 20Go ù Si je créé un fichier de 15 Go dans /fs/a/b2, je ne me heurte pas au project quota défini sur /fs/a car il ne prend plus en compte les données dans /fs/a/b1. Par contre je viens de saturer mon système de fichier.... J'aurais dû exclure manuellement le quota de /fs/a/b1 en redéfinissant le quota de /fs/a à (30 - 20 = 10Go) En tant que procédure de contrôle, vérifiez que la somme des quota ne dépasse pas la taille du système de fichier !

ToDo