Linux-VServer et Quotas

Un article de Bulles.

Sommaire

Problématique

La question des quotas revient fréquemment, et j'ai eu du mal à trouver la marche à suivre pour ma configuration (Noyeau 2.6.14, Linux-VServer 2.01)

Ces notes traitent des quotas à l'intérieur d'un serveur virtuel.

Comme le Linux-VServer n'accède pas directement au disque, il n'est pas possible d'utiliser directement les quotas au sein d'un serveur virtuel.

Pour pouvoir utiliser les quotas, il faudra passer par le pilote Virtual Root de Linux-VServer, associé à un device disque.

Pour ne pas allouer toute une partition au serveur virtuel, on utilisera tout naturellement le Logical Volume Manager.

Pré-requis

Le noyeau doit supporter:

  • Le support du LVM (on suppose ici qu'il est déjà configuré)
  • Le support des quotas (inclu dans le noyeau ou en module -- quota_v2)
  • Le proxy-device Virtual Root de Linux-VServer (inclu dans le noyeau ou en module -- vroot)

Si on a opté pour les modules, s'assurer qu'ils sont bien chargés.

Mise en place

Création d'un Serveur Virtuel

Nous allons partir d'un serveur existant. Le serveur est créé comme décrit dans le Linux-VServer HowTo:

<host>: # PKG_EXCLUDE="dhcp-client,fdutils,iptables,libpcap0.7,makedev,pciutils,ppp,pppconfig,pppoe,pppoeconf" 
<host>: # vserver <vserver> build --hostname <vserver-fqdn> --interface <vserver-interface> \
  --context <vserver-context> -m debootstrap -- -d sarge -- --exclude=${PKG_EXCLUDE}
<host>: # vserver start
....
<host>: # vserver stop

Création du volume logique

Tout ceci sur la machine hôte!

On utilise le LVM pour crééer une partition logique et on initialise le file system:

<host>: # lvcreate -L 18G -n <vserver> vg0
<host>: # mke2fs -j /dev/vg0/<vserver>

Il faut ajouter une ligne dans le /etc/fstab:

# <file system>    <mount point>             <type> <options>                  <dump>  <pass>
/dev/vg0/<vserver> /home/vservers/<vserver>  ext3   defaults,usrquota,grpquota 0       2

Il est impératif de monter le filesystem avec usrquota,grpquota, même si on ne les utilise pas sur le système hôte.

Il reste à copier le serveur virtuel sur la filesystem créé (assurez vous que le serveur est bien arreté)

<host>: # mv /home/vservers/<vserver> /home/vservers/<vserver>.orig
<host>: # mkdir /home/vservers/<vserver>
<host>: # mount /home/vservers/<vserver>
<host>: # cp -a /home/vservers/<vserver>.orig/. /home/vservers/<vserver>

Configuration du serveur virtuel

Il faut associer la partition a un device Virtual Root à l'aide de la commande vrsetup.

Si les devices n'existent pas, on peux aisément les créer à la main:

<host>: # mkdir /dev/vroot
<host>: # for i in 0 1 2 3 4 5 6 7 ; do mknod /dev/vroot/$i b 4 $i; done

Attention: après un passage à udev, j'ai remarqué que les devices automatiquement créés sont /dev/vrootn! Adaptez donc le script en conséquence.

On va mettre l'association dans les scriptlets du versver. On crée le ficher /etc/vservers/<vserver>/scripts/prepre-start.d/vroot.sh:

#!/bin/sh
case $1 in
prepre-start)
   rm -f /home/vservers/<vserver>/dev/hdv1
   vrsetup /dev/vroot/0 /dev/vg0/<vserver>
   cp -fa /dev/vroot/0 /home/vservers/<vserver>/dev/hdv1
   ;;
postpost-stop)
   vrsetup -d /dev/vroot/0
   ;;
*)
   ;;
esac

On établit un lien symbolique pour l'arrêt:

<host>: # ln -s ../prepre-start.d/vroot.sh /etc/vservers/<vserver>/scripts/postpost-stop.d

On édite /etc/vservers/<vserver>/apps/init/mtab pour signaler que les quotas sont d<vserver>onibles:

/dev/hdv1 / ufs rw,usrquota,grpquota 0 0

Et enfin, on ajoute la capability quota_ctl au capabilities du contexte:

<host>:  # echo quota_ctl /etc/vservers/<vserver>/ccapabilities

Activation des quotas

On peux maintenant démarrer le serveur virtuel et installer les paquets nécessaires:

<host>: # vserver <vserver> start
<host>: # vserver <vserver> enter
<vserver>: # apt-get install quota quotatool
<vserver>: # quotacheck -maugv
<vserver>: # quotaon -auvg

Et voilà!

Script de démarrage

Les quotas sont démarrés normalemnt dans le run-level S, dont les scripts ne sont pas pris en compte ici. Il faut donc modifier le setup par défaut:

<vserver>: # update-rc.d -f quota remove
<vserver>: # update-rc.d quota start 05 3 . stop 85 0 6 .

Liens