La prise en charge des quotas est une fonctionnalité souvent demandée dans lxc. Le quota de système de fichiers Linux est requis lorsque vous souhaitez donner à plusieurs utilisateurs l'accès à un conteneur et que vous souhaitez contrôler qu'un utilisateur n'utilise pas tout l'espace disque. Un quota est également requis pour les serveurs d'hébergement Web, par ex. avec ISPConfig 3, pour la même raison :un site Web ne pourra pas remplir tout le disque. Ce guide vous montre comment utiliser lxc avec quota de disque dur en utilisant qemu nbd avec un fichier image qcow sur Debian 8 .
Prérequis
Pour utiliser lxc, vous avez besoin des utilitaires qemu et du package lxc lui-même. Installez-les en appelant :
apt-get install lxc qemu-utils
Le programme d'installation vous demandera de choisir le répertoire dans lequel les images de la machine virtuelle lxc seront installées ultérieurement. Ce répertoire doit se trouver sur une partition avec beaucoup d'espace libre. Si vous disposez de suffisamment d'espace dans /var, acceptez la valeur par défaut /var/lib/lxc, sinon, choisissez un répertoire libre sur votre plus grande partition. Lorsque vous utilisez un chemin autre que celui par défaut, assurez-vous de modifier le chemin dans toutes les commandes et fichiers de configuration ci-dessous.
Préparation
Vérifiez si le module de boucle du noyau est chargé avec :
lsmod | grep '^loop'
Si vous n'obtenez aucun résultat, vous pouvez activer le module en exécutant :
modprobe loop
Créer la machine virtuelle
Nous pouvons maintenant commencer à créer la VM. Dans ce didacticiel, j'utiliserai Debian Jessie à la fois dans l'hôte et dans le conteneur, mais vous pouvez bien sûr utiliser d'autres modèles lxc, par exemple. g. Debian wheezy ou ubuntu.
lxc-create -B loop -t debian -n mydebianvm --fssize=20G -- -r jessie
Le -t l'argument sélectionne le modèle principal, -r décide quelle version utiliser. Pour définir la taille du disque dur de la machine virtuelle, vous pouvez modifier le --fssize argument. Supposons que vous vouliez créer un disque de 50 gigaoctets, vous changeriez l'argument en --fssize=50G .
L'argument -n définit le nom de la vm. J'ai utilisé mydebianvm dans ce tutoriel. Veuillez modifier le nom dans toutes les commandes suivantes en fonction de ce que vous avez choisi.
Comme nous ne voulons pas utiliser un fichier image brut, nous devons convertir l'image disque en qemu qcow2 format. Ceci est fait par la commande suivante
qemu-img convert -O qcow2 /var/lib/lxc/mydebianvm/rootdev /var/lib/lxc/mydebianvm/rootdev.qcow2
Pour faciliter la gestion des sauvegardes, plus tard, nous créons un ensemble de fichiers image, c'est-à-dire. e. un deuxième fichier qui enregistre toutes les modifications apportées à l'appareil.
qemu-img create -f qcow2 -b /var/lib/lxc/mydebianvm/rootdev.qcow2 /var/lib/lxc/mydebianvm/rootdev-live.qcow2
Vous pouvez maintenant supprimer le fichier image brut d'origine avec :
rm /var/lib/lxc/mydebianvm/rootdev
Configurer le pont réseau
Installez les utilitaires bridge :
apt-get install bridge-utils
Ouvrez le fichier de configuration du réseau Debian /etc/network/interfaces dans un éditeur
vim /etc/network/interfaces
et ajoutez les lignes suivantes :
auto br0
iface br0 inet static
address 192.168.1.254
netmask 255.255.255.0
bridge_ports eth0
bridge_stp off
bridge_fd 2
bridge_maxwait 20
Remplacez l'adresse et le masque de réseau par les valeurs de votre réseau local.
Activez ensuite le pont réseau avec la commande :
ifup br0
Configurer la VM
Sauvegardez l'ancien fichier de configuration :
mv /var/lib/lxc/mydebianvm/config /var/lib/lxc/mydebianvm/config_bak
Et créez la configuration du conteneur :
vim /var/lib/lxc/mydebianvm/config
Et ajoutez le contenu suivant dans le fichier :
lxc.rootfs = /var/lib/lxc/mydebianvm/rootfs
lxc.rootfs.options = usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0
lxc.hook.pre-start = /var/lib/lxc/prestart-nbd.sh
lxc.hook.post-stop = /var/lib/lxc/poststop-nbd.sh
# Common configuration
lxc.include = /usr/share/lxc/config/debian.common.conf
# only if bridge is set up (or use other method)
lxc.network.type = veth
lxc.network.name = veth0
lxc.network.flags = up
lxc.network.link = br0
lxc.network.ipv4 = 192.168.1.101/24
lxc.network.ipv4.gateway = 0.0.0.0
# Container specific configuration
lxc.mount = /var/lib/lxc/mydebianvm/fstab
lxc.utsname = debian8
lxc.arch = amd64
lxc.autodev = 1
lxc.kmsg = 0
Remplacez l'adresse IP 192.168.1.101 par une adresse IP libre de votre réseau.
Ajoutez le script de prédémarrage /var/lib/lxc/prestart-nbd.sh
vim /var/lib/lxc/prestart-nbd.sh
avec le contenu suivant :
#!/bin/bash
CHK=$(lsmod | grep '^nbd');
if [[ "$CHK" == "" ]] ; then
modprobe nbd nbds_max=64 max_part=8
fi
DEV=""
for D in /dev/nbd* ; do
F=$(basename $D)
if [[ $(lsblk | grep "^${F} ") == "" ]] ; then
DEV="$D"
break;
fi
done
echo "Next free NBD is $DEV";
CHK=$(lsof /var/lib/lxc/${LXC_NAME}/rootdev-live.qcow2 | grep 'qemu-nbd' | awk '{ print $2 }');
if [[ "$CHK" == "" ]] ; then
if [[ "$DEV" == "" ]] ; then
print "No free nbd device found";
exit 1;
fi
echo "Connecting $DEV to /var/lib/lxc/${LXC_NAME}/rootdev-live.qcow2"
qemu-nbd -c ${DEV} -n --aio=native /var/lib/lxc/${LXC_NAME}/rootdev-live.qcow2
else
NBD=$(lsof -p ${CHK} | grep '/dev/nbd' | awk '{ print $9 }');
if [[ "$NBD" != "" ]] ; then
echo "/var/lib/lxc/${LXC_NAME}/rootdev-live.qcow2 is already connected to $NBD"
DEV="$NBD";
else
echo "/var/lib/lxc/${LXC_NAME}/rootdev-live.qcow2 is used by suspicious PID";
exit 1;
fi
fi
CHK=$(mount | grep " /var/lib/lxc/${LXC_NAME}/rootfs ")
if [[ "$CHK" == "" ]] ; then
echo "/var/lib/lxc/${LXC_NAME}/rootfs not mounted";
echo "Mounting ${DEV} to /var/lib/lxc/${LXC_NAME}/rootfs"
mount ${DEV} /var/lib/lxc/${LXC_NAME}/rootfs
fi
echo "${DEV} ${DEV:1} none bind,create=file,optional 0 0" > /var/lib/lxc/${LXC_NAME}/fstab
et rendez-le exécutable :
chmod +x /var/lib/lxc/prestart-nbd.sh
Ajoutez le script poststop /var/lib/lxc/poststop-nbd.sh
vim /var/lib/lxc/poststop-nbd.sh
avec le contenu suivant :
#!/bin/bash
CHK=$(mount | grep " /var/lib/lxc/${LXC_NAME}/rootfs " | awk '{ print $1 }')
if [[ "$CHK" != "" ]] ; then
echo "Unmounting ${CHK} from /var/lib/lxc/${LXC_NAME}/rootfs"
echo "Disconnecting ${CHK}"
umount /var/lib/lxc/${LXC_NAME}/rootfs && qemu-nbd -d ${CHK}
fi
et rendez-le exécutable :
chmod +x /var/lib/lxc/poststop-nbd.sh
Démarrer la VM et configurer le quota
Nous pouvons maintenant démarrer le conteneur en arrière-plan en tapant :
lxc-start -n mydebianvm -d
Installez les packages nécessaires pour le quota. Nous n'avons pas besoin d'entrer dans le conteneur pour cela. En utilisant lxc-attach, nous pouvons exécuter des commandes depuis l'extérieur du conteneur.
lxc-attach -n mydebianvm -- apt-get -y update
lxc-attach -n mydebianvm -- apt-get -y install quota
Il n'est pas possible d'activer le quota via lxc-attach. Nous créons donc un script bash, qui est exécuté au prochain démarrage du conteneur
vim /var/lib/lxc/mydebianvm/rootfs/opt/actquota.sh
avec le contenu suivant :
#!/bin/bash
mount -o remount,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0 /
touch /aquota.user /aquota.group
chmod 0600 /aquota.*
quotacheck -cmug /
quotaon -avug
echo '#!/bin/sh -e
exit 0' > /etc/rc.local
rm -f /opt/actquota.sh
Le script se supprimera et videra ensuite le /etc/rc.local du conteneur.
Assurez-vous maintenant que le script bash est exécutable et appelé au démarrage :
Rendez-le exécutable :
chmod 700 /var/lib/lxc/mydebianvm/rootfs/opt/actquota.sh
Ajoutez l'appel au fichier rc.local de la machine virtuelle :
echo '#!/bin/bash
if [[ -e "/opt/actquota.sh" ]] ; then
/opt/actquota.sh
fi' > /var/lib/lxc/mydebianvm/rootfs/etc/rc.local
Une fois tous les prérequis configurés, vous pouvez maintenant redémarrer le conteneur. Si vous avez suivi les étapes correctement, cela activera le quota.
lxc-stop -r -n mydebianvm
Vérifier les résultats
Vous devriez maintenant vérifier si le quota fonctionne. Passez au conteneur.
lxc-attach -n mydebianvm
À l'intérieur du type de conteneur :
repquota -avug
Vous devriez maintenant voir le quota utilisé d'utilisateurs et de groupes.
Destruction de la machine virtuelle
C'est très important pour utiliser les commandes dans le bon ordre. Avant de pouvoir déconnecter l'appareil nbd, vous devez arrêter le conteneur s'il est en cours d'exécution :
lxc-stop -n mydebianvm
Ensuite, vous devez démonter le root fs.
umount /var/lib/lxc/mydebianvm/rootfs
La dernière étape consiste à déconnecter le nbd. Assurez-vous de sélectionner le bon numéro d'appareil.
JAMAIS déconnectez le nbd avant de démonter le rootfs. Cela entraînera de nombreux problèmes et nécessitera un redémarrage forcé complet de votre hôte.
qemu-nbd -d /dev/nbd0
Sauvegarder la VM
Parce que nous avons créé deux fichiers lors de la création du fichier image pour le conteneur, nous pouvons facilement sauvegarder sans arrêter la vm. Nous devons d'abord valider les modifications apportées entre-temps au fichier de base.
qemu-img commit /var/lib/lxc/mydebianvm/rootdev-live.qcow2
Le /var/lib/lxc/mydebianvm/rootdev.qcow2 contient maintenant l'état actuel du disque dur de la machine virtuelle, vous pouvez donc sauvegarder ce fichier.