Création d'un template Ubuntu 8.04 LTS pour OpenVZ

réf : http://wiki.openvz.org/Ubuntu_Hardy_template_creation

procédure testée et validée sur IBM XSeries 3550, intel bi-Xeon QuadCore i386 sous Ubuntu 8.04 LTS.

Le but est de construire un template qui servira à générer des VPS sur un modèle personnalisé aux besoins de notre informatique locale.
La procédure comprend trois grandes étapes :

- génération d'un système de base avec debootstrap
- déplacement de ce système sous openvz, ouverture de celui-ci comme un container que nous allons personnaliser
- fabrication à partir du container finalisé d'un template sous la forme d'un tarball

1. Sur l'hôte

Génération d'un système minimal

Pour commencer, nous avons besoin de debootstrap :

:: sudo apt-get install debootstrap


On effectue toute la procédure suivante sous un compte administrateur

:: sudo bash


On crée un répertoire dans lequel on procède via debootstrap à une installation d'un système minimal :
:: mkdir hardy-chroot
:: debootstrap --arch i386 hardy hardy-chroot
On remplace i386 par amd64 ou ia64 selon l'architecture des processeurs de notre machine

Création et configuration du container

On va maintenant utiliser cette installation comme un container VPS classique : on la déplace dans l'espace d'openvz, on lui applique une
configuration basique, une adresse IP, un nom de template, une valeur de DNS et on la démarre.

:: mv hardy-chroot /vz/private/777
:: vzctl set 777 --applyconfig vps.basic --save
:: echo "OSTEMPLATE=ubuntu-8.04" >> /etc/vz/conf/777.conf
:: vzctl set 777 --ipadd 10.10.10.77 --save
:: vzctl set 777 --nameserver 195.200.151.50 --save
:: vzctl start 777


Puis on tente d'entrer dedans afin de le configurer à nos besoins

:: vzctl enter 777


Si à ce niveau, vous obtenez ce genre d'erreur :

enter into VE 1001 failed

Unable to open pty: No such file or directory
ce n'est pas anormal sous ubuntu. En effet, les devices /dev/tty et /dev/pty sont absents.
La solution consiste en la désactivation de udev :

:: vzctl exec 777 update-rc.d -f udev remove
:: vzctl restart 777
:: vzctl enter 777


2. Dans le container

A partir de ce point, nous sommes root dans le container : 
s'en assurer ou se connecter via ssh (dans la mesure où on a installé sshd) pour ne pas se mélanger !



On commence par supprimer les paquets inutiles sur un serveur :

:: dpkg -P ubuntu-minimal wpasupplicant wireless-tools \
udev pcmciautils initramfs-tools console-setup \
xkb-data usbutils mii-diag ethtool \
module-init-tools console-tools \
console-terminus busybox-initramfs libvolume-id0 \
ntpdate eject pciutils tasksel tasksel-data \
laptop-detect


On supprime udev :

:: rm -fr /lib/udev


On stoppe et on supprime getty :

:: initctl stop tty{1,2,3,4,5,6}
:: rm /etc/event.d/tty*


On change les droits pour /root et  on désactive la connexion sous root :
:: chmod 700 /root
:: usermod -L root


On crée un lien symbolique, un modprobe factice, pour les adresses IPv6 :

:: ln -s /bin/true /sbin/modprobe


Enfin, on met à jour les paquets :

:: apt-get update && apt-get upgrade


A partir de là, chacun peut customimser son template pour servir de base aux installations de serveurs virtuels dans son infrastructure :

:: apt-get install ssh quota sudo telnet netcat locales vim nano wget rsync build-essential  (etc)


On peut aussi penser à faire de la configuration d'environnement : variable http_proxy, /etc/apt/sources.list,
/etc/apt/apt.conf, /etc/resolv.conf, etc


Pour les containers qui vont contenir une installation de ssh, on va supprimer les clés générées et forcer la génération de nouvelles clés
au premier boot du VPS. Pour ceci, on passe le petit script suivant :

:: rm -f /etc/ssh/ssh_host_*
:: cat << EOF > /etc/rc2.d/S15ssh_gen_host_keys
#!/bin/sh
ssh-keygen -f /etc/ssh/ssh_host_rsa_key -t rsa -N ''
ssh-keygen -f /etc/ssh/ssh_host_dsa_key -t dsa -N ''
rm -f \$0
EOF
:: chmod a+x /etc/rc2.d/S15ssh_gen_host_keys


Pour améliorer la performance, on peut forcer, si ce n'est pas déjà fait, de ne pas tout logger sur les I/O dans syslog :

:: sed -i -e 's@\([[:space:]]\)\(/var/log/\)@\1-\2@' /etc/syslog.conf


Pour que df et autres commandes fonctionnent correctement, on fait pointer mtab sur /proc/mounts et on désactive le script de montage :

:: rm -f /etc/mtab
:: ln -s /proc/mounts /etc/mtab
:: update-rc.d -f mtab.sh remove


S'il n'y a pas de nécessité d'utiliser iptables, on supprime les logs de klogd :

:: update-rc.d -f klogd remove


On initialise les fichiers hosts et hostname :

:: echo "localhost" > /etc/hostname
:: echo "127.0.0.1 localhost.localdomain localhost" > /etc/hosts


On ajoute les ptys dans /dev pour être sûr de pouvoir toujours faire des vzctl enter :

:: cd /dev && /sbin/MAKEDEV ptyp
le warning "/sbin/MAKEDEV: warning: can't read /proc/devices" peut être ignoré en toute sécurité


On procède au grand nettoyage : paquets, fichiers de log

:: apt-get clean
:: cd /var/log
:: > messages; > auth.log; > kern.log; > bootstrap.log
:: > dpkg.log; > syslog; > daemon.log; > apt/term.log
:: rm -f *.0 *.1


Et on sort :

:: exit

3. Dans l'hôte à nouveau

A partir de ce point, nous sommes à nouveau root dans l'hôte : 
Comme le container n'a plus besoin d'adresse IP donnée, on la supprime et on stoppe ce dernier :
:: vzctl set 777 --ipdel all --save
:: vzctl stop 777

Création du template

On va maintenant réellement créer le tarball du template ainsi configuré :

:: cd /vz/private/777
:: tar czf /vz/template/cache/ubuntu-8.04-i386-minimal.tar.gz .
        Attention à ne pas oublier l'espace et le point à la fin de la ligne ci-dessus !
        Là encore, on change i386 en amd64 ou ia64 selon l'architecture de son processeur, si nécessaire.
On vérifie la création du tarball. On doit avoir généré un fichier de plusieurs dizaines de Mo (une quarantaine pour un template plutôt minimal) :
:: ls -lh /vz/template/cache/ubuntu-8*


Le template est prêt ! Il n'y a plus qu'à le tester :
:: vzctl create 123456 --ostemplate ubuntu-8.04-i386-minimal
:: vzctl start 123456
:: vzctl exec 123456 ps axf (pour vérifier que les processus tournent bien)


Après le test, on purge :

:: vzctl stop 123456
:: vzctl destroy 123456
:: rm -f /etc/vz/conf/123456.conf.destroyed


On peut enfin supprimer le container qui a servi de base à la création du template tarballé :

:: vzctl destroy 777
:: rm -f /etc/vz/conf/777.conf.destroyed


Comments