Comme je vous l’ai expliqué dans mon précédent article, je suis entrain de faire l’installation d’une petite architecture à base de Linux-VServer pour le travail, en parallèle je fais la même chose à titre perso, c’est l’objet de cet article.
En quelques mots, vserver est un système de virtualisation en espace utilisateur, c’est à dire qui fonctionne directement sur le noyau de la machine hôte, ce qui assure d’excellentes performances. En contre partie, ce type de virtualisation ne permet de faire tourner que du Linux sur du Linux. On appelle aussi cela des conteneurs.
Voici comment installer Linux-VServer sur une Debian Squeeze 64bits, ça sera très rapide car il n’y a pas grand chose à dire pour l’installation à proprement parler, pour ce qui est de l’utilisation, c’est autre chose, mais pas nécessairement compliqué, c’est surtout une histoire de bon sens.
Au travail, pour installer un serveur, j’utilise des modèles, sinon je fais toujours l’installation en mode expert avec le minimum de paquets et en UTF-8 US (clavier fr).
Pour les serveurs destinés à la production, j’utilise toujours les paquets Debian de la branche main avec aptitude. Les branches contrib et non-free sont rarement nécessaires. Pour mes tests ou mes usages perso, je suis moins strict (dotdeb, backport, …).
Pour la suite, je fais tout avec un utilisateur qui a les droits root (c’est mal).
Si vous ne l’avez pas fait pendant l’installation, il faut maintenant remplacer le noyau par sa version patchée avec vserver, on en profite pour ajouter les outils de gestion :
aptitude install linux-image-vserver-amd64 util-vserver vserver-debiantools
En ce qui me concerne, je ne souhaite pas que mes vservers soient directement accessibles depuis le réseau, je préfère utiliser une interface « dummy » et faire du routage avec la machine hôte.
Mes vservers sont totalement isolés du monde extérieur, c’est Netfilter (avec du snat et du dnat) qui va décider de qui peut communiquer avec qui.
echo 'dummy' >> /etc/modules echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/ipv4_forward.conf echo '#interface dummy pour les vservers' >> /etc/network/interfaces echo 'auto dummy0' >> /etc/network/interfaces echo 'iface dummy0 inet static' >> /etc/network/interfaces echo 'address 10.1.1.1' >> /etc/network/interfaces echo 'netmask 255.255.255.0' >> /etc/network/interfaces
A ceci j’ajoute une règle de SNAT dans mon fichier /etc/iptables.up.rules (table nat) :
-A POSTROUTING -s 10.1.1.0/24 ! -d 10.1.1.0/24 -j SNAT --to-source LA_VRAI_IP_DU_SERVEUR
Notez que les sockets réseau sont partagés entre l’hôte et les vservers, il faut donc veiller à bien configurer chaque programme pour qu’il écoute sur la bonne adresse, dit autrement, il faut éviter de laisser les paramètres « listen » sur any (ou équivalent) à moins de savoir ce que l’on fait.
En gros, un
netstat -luntp | awk '{print $4}' | egrep '127.0.0.1|0.0.0.0'
ne devrait rien retourner.
Par exemple si vous laisser Apache faire, il utilisera le port 80 sur toutes les interfaces (celles de l’hôte comme celles des vservers).
Attention à la sécurité tout de même, pensez à jouer un peu avec iptables pour demander à netfilter de protéger tel ou tel socket des méchants du dehors.
On redémarre sur le nouveau noyau et c’est fini.
On vérifie qu’on est bien sur le bon noyau avec
uname -r
2.6.32-5-vserver-amd64
Pour ma part je ne change rien à la configuration de vserver, je préfère faire mes propres scripts de déploiement. J’initialise simplement le numéro de contexte des vservers à 100 afin de pouvoir m’en servir dans un script d’automatisation.
echo ‘100’ > /etc/vservers/.defaults/context.next
Créer un vserver de type Debian sur une Debian est très simple, notez simplement qu’un certain nombre de paramètres sont hérités de la machine hôte, entre autre le fichier resolv.conf, donc si vous avez « nameserver 127.0.0.1 » vous allez avoir un problème.
Vous pouvez créer des vservers depuis plusieurs distributions, vous trouverez plus d’informations ici.
Les commandes sont très simple, mais pour gagner en temps et éviter les oublis, je préfère faire des scripts.
Commençons par créer un script de création de modèle, modèle qui servira de base à nos futurs vservers.
#!/bin/bash if [[ ($1 == "") ]] then echo "Syntaxe : $0 nom_du_vserver" echo "Exemple : $0 template-squeeze" exit fi VSERVER_ROOT='/home/vservers' VSERVER_NET='10.1.1' VSERVERS_IFACE='dummy0' DEBIAN_MIRROIR='http://ftp.fr.debian.org/debian' DEBIAN_DIST='squeeze' CONTEXT_NEXT=`cat /etc/vservers/.defaults/context.next` newCONTEXT_NEXT=$(($CONTEXT_NEXT+1)) VSERVER_TEMPLATE_NAME="$1-$CONTEXT_NEXT" VSERVER_TEMPLATE_IP="$VSERVER_NET.$CONTEXT_NEXT" VSERVER_TEMPLATE_PATH="$VSERVER_ROOT/$VSERVER_TEMPLATE_NAME" vserver $VSERVER_TEMPLATE_NAME build --hostname $VSERVER_TEMPLATE_NAME --interface $VSERVERS_IFACE=eth0:$VSERVER_TEMPLATE_IP/24 --rootdir $VSERVER_ROOT -m debootstrap -- -d $DEBIAN_DIST -m $DEBIAN_MIRROIR echo $CONTEXT_NEXT > /etc/vservers/$newVSERVER_NAME/context echo $newCONTEXT_NEXT > /etc/vservers/.defaults/context.next cat /etc/apt/apt.conf > $VSERVER_TEMPLATE_PATH/etc/apt/apt.conf cat /etc/apt/sources.list > $VSERVER_TEMPLATE_PATH/etc/apt/sources.list vserver $VSERVER_TEMPLATE_NAME start vserver $VSERVER_TEMPLATE_NAME exec apt-get -y remove --purge isc-dhcp-client isc-dhcp-common vserver $VSERVER_TEMPLATE_NAME exec apt-get update vserver $VSERVER_TEMPLATE_NAME exec apt-get -y dist-upgrade vserver $VSERVER_TEMPLATE_NAME exec apt-get -y install locales echo 'en_US.UTF-8 UTF-8' >> $VSERVER_TEMPLATE_PATH/etc/locale.gen vserver $VSERVER_TEMPLATE_NAME exec /usr/sbin/locale-gen vserver $VSERVER_TEMPLATE_NAME exec apt-get -y autoremove vserver $VSERVER_TEMPLATE_NAME exec apt-get -y autoclean vserver $VSERVER_TEMPLATE_NAME exec apt-get -y clean vserver $VSERVER_TEMPLATE_NAME stop exit
Vous pouvez configurer votre modèle afin d’y inclure les logiciels qui vous servent systématiquement, adapter certaines configurations, … Le principe d’un modèle est que tout ce qui est fait n’est plus à refaire. Il ne faut donc pas hésiter à y passer du temps.
Maintenant qu’on a notre modèle, on va pouvoir créer des vservers bon à l’usage.
Je recommande de faire des scripts d’automatisation par type de vserver (web, mysql, xmpp, …), c’est plus facile à manipuler et ça permet de les réutiliser à la manière de classes dans un programme.
A titre d’exemple, voici la version super allégée de celui que j’utilise pour déployer un vserver avec Apache2 et PHP5 :
#!/bin/bash if [[ $1 == "" ]] then echo "Syntaxe : $0 nom_du_vserver" echo "nom_du_vserver doit être unique" echo "Exemple : $0 apache2-php5" exit fi #Pensez à adapter cette variable VSERVER_TEMPLATE_NAME='template-squeeze' HOST_FQDN=`hostname -f` VSERVER_ROOT='/home/vservers' VSERVER_NET='10.1.1' CONTEXT_NEXT=`cat /etc/vservers/.defaults/context.next` newCONTEXT_NEXT=$(($CONTEXT_NEXT+1)) newVSERVER_NAME="$1-$CONTEXT_NEXT" newVSERVER_PATH="$VSERVER_ROOT/$newVSERVER_NAME" newVSERVER_IP="$VSERVER_NET.$CONTEXT_NEXT" PKG_DEBIAN='apache2 libapache2-mod-php5' CMD_POST_INST='/etc/init.d/apache2 stop' # echo "Copie du template" dupvserver --from $VSERVER_TEMPLATE_NAME --to $newVSERVER_NAME --ip $newVSERVER_IP --vsroot $VSERVER_ROOT echo "Copie terminée, configuration du nouveau vserver" #######NAME echo "127.0.0.1 localhost" > $newVSERVER_PATH/etc/hosts echo "$newVSERVER_IP $newVSERVER_NAME" >> $newVSERVER_PATH/etc/hosts echo "$newVSERVER_NAME" > $newVSERVER_PATH/etc/hostname #######AUTOSTART echo "default" > /etc/vservers/$newVSERVER_NAME/apps/init/mark #Mise à jour des contextes echo $CONTEXT_NEXT > /etc/vservers/$newVSERVER_NAME/context echo $newCONTEXT_NEXT > /etc/vservers/.defaults/context.next # echo "Démarrage du vserser $newVSERVER_NAME" vserver $newVSERVER_NAME start vserver $newVSERVER_NAME exec apt-get update vserver $newVSERVER_NAME exec apt-get -y dist-upgrade vserver $newVSERVER_NAME exec apt-get -y install $PKG_DEBIAN vserver $newVSERVER_NAME exec $CMD_POST_INST echo "!! Pensez à configurer les paramètres d'écoute d'Apache !!" echo "Ici j'utilise toute une batterie de .patch pour modifier les fichiers de configuration d'apache et de php" exit
Pour manipuler vos vservers, vous avez 2 méthodes.
- depuis l’hôte en modifiant directement les fichiers (le / des vservers se trouve dans /home/vservers/NOM/) et en lançant des commandes avec vserver NOM exec commande, c’est ce que je fais dans mon script.
- dans le vserver en vous y connectant en ssh (si vous l’avez installé) ou en entrant dedans avec vserver NOM enter (vous arrivez directement en root à la racine)
A vous de jouer, pour ma part je suis entrain de cloisonner tous les sites et services que j’ai sur ma Dedibox perso dans des vservers, celui qui héberge ce site est le numéro 3.