La cuisine de Gandi

Accueil > Hébergement > Comment créer une image pour ses serveurs ?

Comment créer une image pour ses serveurs ?

Le processus est assez simple et peut être réalisé par tout le monde. Il suffit juste d'être rigoureux dans son déroulement.

Créer un disque de données

Vous devez créer un disque de données à partir de l'interface de création de disque de votre compte hébergement. Dans le cas d'une copie de disque existant, le disque de données doit avoir une taille suffisante.

Attachez simplement votre nouveau disque au serveur cible : le serveur contenant le disque virtuel à copier ou le serveur pour faire l'installation de base.

Créer l'image système

En faisant une copie des données d'un disque virtuel

Attention : il vous faudra suffisamment de place sur le disque destination.

Copiez les données de votre disque source vers le disque de destination avec la commande tar :

tar cC /srv/disk1 . | tar xC /srv/disk2

si /srv/disk1 est le répertoire dans lequel est monté le disque source et /srv/disk2 le répertoire du disque de destination. La copie par tar ne copiant que les données et non les blocs vides, l'opération est rapide.

Attention : si vous voulez copier le disque système du système local, il faudra ajouter des exclusions :

tar --exclude=/proc --exclude=/sys --exclude=/srv/disk2 c / | tar xC /srv/disk2

En installant un système de base

Préambule

Votre nouveau disque attaché à un serveur est prêt à être utilisé. Vous pouvez partitionner votre disque image pour éventuellement intégrer une partition de swap dans l'image, mais nous vous conseillons de ne pas créer de partition et de créer le système de fichiers directement dans le disque.

Cela représente l'avantage d'être plus souple si vous comptez redimensionner le disque par la suite (plus de calcul de table de partition à faire), d'être mieux aligné avec le stockage des blocs sur nos filers physiques et de pouvoir décider ou non d'utiliser une partition de fichier d'échange (swap).

Dans un futur proche, toutes les images d'OS fournies par Gandi n'auront plus de partition et l'hébergement Gandi fournira un espace de swap supplémentaire automatiquement.

Cependant, les serveurs virtuels verront toujours le premier disque comme "xvda1", et le disque de swap comme "xvda2".

Que vous choisissiez de partitionner ou non, l'hébergement Gandi saura démarrer les disques systèmes ayant votre image comme source en détectant le début du disque et en adaptant les options de démarrage du kernel. Gandi fournit un serveur contenant une copie des distributions proposées en images de système. Vous pourrez utiliser ce serveur pour accélérer l'installation : mirrors.gandi.net

Préparation

Dans un premier temps, vérifier que le disque virtuel n'est pas déja monté (dans /proc/mounts par exemple). Le démontez si il l'est. Partitionner eventuellement le disque virtuel puis formatez le tout.

Nous vous recommandons de formatter le disque directement et d'utiliser un système de fichiers ext4. Dans le cas où votre disque serait xvdc : mkfs.ext4 -j -m0 /dev/xvdc puis montez le disque dans un répertoire de votre système : mount -o rw /dev/xvdc /var/tmp.

Installation par debootstrap pour les distributions en package .deb

L'installation d'un système de base peut se faire par debootstrap qui installe dans un répertoire. Une fois l'installation finie et quelques modifications effectuées, le disque contiendra un système GNU/Linux bootable et fonctionnel. Le système contiendra un minimum d'application et il vous faudra adapter le système à vos besoins en installant les applications souhaitées avec apt-get et configurer notamment les locales.

Nous vous recommandons d'installer un système en architecture amd64/x86_64 qui sera plus rapide sur l'hébergement Gandi. Au moment du choix du kernel, il faudra choisir le kernel x86_64 qui convient (2.6.32-3831 par exemple).

Exemple d'installation pour une Ubuntu Maverick 10.10 sur le disque monté précédemment :

debootstrap --arch=amd64 --verbose --components=main,universe,multiverse \
--include=openssh-server,openssh-client maverick /var/tmp \
http://mirrors.gandi.net/ubuntu/

Dans le cas où debootstrap vous indique qu'aucun fichier de config pour maverick est accessible, il suffira de faire un lien dans /usr/share/debootstrap/scripts de lucid vers maverick. L'étape suivante est de modifier le fichier contenant les sources vers les médias des packages. Editez le fichier /etc/apt/sources.list dans le répertoire en ajoutant les médias de la distribution et le média contenant les paquets faits par Gandi.

Exemple :

# cat /var/tmp/etc/apt/sources.list
deb http://mirrors.gandi.net/ubuntu maverick main universe multiverse
deb http://mirrors.gandi.net/ubuntu maverick-security main universe multiverse
deb http://mirrors.gandi.net/ubuntu maverick-updates main universe multiverse
deb http://mirrors.gandi.net/gandi/ubuntu maverick main

Copiez ensuite les fichiers /etc/hosts, /etc/resolv.conf et /etc/fstab du système du serveur vers le répertoire contenant le système nouvellement installé (/var/tmp dans notre exemple). Modifiez les valeurs des fichiers en effaçant le hostname de la machine courante dans /etc/hosts et en adaptant le fichier /etc/fstab à votre disque image.

Une fois la commande debootstrap et la configuration terminées, vous pourrez accéder au système fraichement installé en chroot-ant le répertoire.

Par exemple : chroot /var/tmp

Vous pourrez ainsi rafraichir les médias de package par : apt-get update et installer les applications nécessaires pour votre utilisation. Attention cependant, l'installation de certains packages dans un chroot demande quelques corrections. Il faudra notamment monter /proc et /dev/pts normalement disponible dans votre /etc/fstab : mount -a puis rejouer la configuration des packages par : dpkg --configure -a. Certains paquets cherchent à démarrer automatiquement les démons et serveurs installés.

Afin de finir l'installation de ces paquets, il faudra modifier les fichiers de postinst installé dans /var/lib/dpkg/info/ en commentant les appels à invoke-rc.d ou start comme dans le cas de procps : #start procps dans procps.postinst ou rsyslog : #invoke-rc.d dans rsyslog.postinst.

Pour les distributions Ubuntu récentes, il faudra ajouter une entrée pour /dev dans le fichier /etc/fstab : dev /dev tmpfs rw 0 0 afin de démarrer correctement.

Nous vous recommandons d'installer les packages gandi-hosting-agent et gandi-hosting-vm disponibles dans le média Gandi. Pour ce faire, ajoutez la clef de mainteneur Gandi par :

apt-key adv --keyserver keyserver.ubuntu.com --recv-keys D8EAC2F4DAFE3FA5

puis :

apt-get install gandi-hosting-agent gandi-hosting-vm

Les packages installeront les dépendances nécessaires. Pour un description des fonctionnalités de ces packages, veuillez lire l'article précédent sur la Cuisine de Gandi.

Si le système sur votre serveur virtuel utilise une version 2.6 de python, il faudra installer le package gandi-hosting-agent-py2.6 à la place de gandi-hosting-agent.

Installation de base pour les distributions en package .rpm

L'installation d'une distribution à base de package en .rpm utilise la même méthode que l'installation d'une distribution à base de package .deb mais en utilisant rinse ou une application spécifique de la distribution que vous avez choisie.

Par exemple en utilisant le même répertoire :

rinse --arch=amd64 --directory=/var/tmp --distribution=centos-5

Suivant votre système de gestion des packages, il faudra ensuite ajouter les médias de paquets dans la configuration afin d'installer les applications nécessaires.

Autres moyens d'installation de système de base

D'autres distributions (souvent plus spécifiques) proposent d'autres méthodes d'installation du système de base. Parfois une image est disponible, il suffira alors de la monter en loop puis de copier les fichiers dans l'image

En reprenant l'exemple ci-dessus :

mkdir /srv/a
mount -o loop,ro /mon/répertoire/image /srv/a
cp -raf /srv/a/ /var/tmp/

Une méthode plus radicale

On peut aussi copier tout le disque; s'assurer que le disque virtuel de destination qui vient d'être attaché au serveur ne soit pas monté puis vérifiez dans /proc/mounts que le label du disque n'est pas présent.

Attention : cette méthode marche pour un disque de destination de même taille que le disque source.

Pour créer l'image de votre système et la copier sur votre nouveau disque de données, vous devez utiliser la commande dd. La syntaxe de la commande demande un peu d'attention.

voici un exemple explicité après :

dd if=/dev/xvda of=/dev/xvdc conv=sync

Le paramètre if= correspond au disque source; of= indique le disque de destination dont les données existantes seront complètement effacées. Pour distinguer vos disques, nous vous conseillons d'utiliser préalablement df.

Notez cependant que le chemin à utiliser pour le paramètre if sera toujours /dev/xvda directement, sans quoi votre image ne sera pas bootable. Il est nécessaire de reconfigurer le réseau de votre machine en DHCP avant de procéder à la création de l'image. La copie par dd prend beaucoup de ressources et du temps, puisqu'elle copie octet par octet le disque source sur le disque destination sans distinction entre bloc de donnée et bloc vide. . Le kernel Linux pour l'hébergement Gandi démarre par défaut sur la première partition (root=/dev/xvda1 sur la ligne de commande pour le démarrage). Si vous copiez un disque système existant, la table de partition sera correcte. Sinon, veuillez vous assurer que la première partition du disque contient les fichiers du système et l'attribut bootable. Vous pouvez aussi ajouter une deuxième partition contenant un espace de swap.

Impératif pour le démarrage

Dans le cas d'une copie de disque virtuel existant, le disque source ayant déjà booté, il suffit de vérifier la configuration réseau en DHCP pour que l'image produise des serveurs correctement bootable. Dans le cas d'image créée par installation d'un système de base, certains points sont à modifier/vérifier :

  • Tous les services ou modules en relation avec les éléments physiques de serveurs sont à désactiver (par exemple, le service lié à l'horloge physique d'un serveur - hwclock).
  • Certains services au démarrage comme ureadahead, console-setup, ondemand, plymouth doivent être désactivés. Déplacez les fichiers d'appel par init de ces services. Dans une image Ubuntu, les fichiers se trouvent dans /etc/init.
  • Ajoutez les packages gandi-hosting-agent et gandi-hosting-vm : l'agent permet de finir l'installation de votre serveur. Les scripts contenus dans le package gandi-hosting-vm permettent de gérer automatiquement les ressources dynamiques de votre serveur. Pour un système avec une version 2.6 de python, il faudra installer gandi-hosting-agent-py2.6 à la place.
  • Supprimez les fichiers relatifs aux clefs ssh générées à l'installation du package de sshd pour éviter d'avoir les mêmes clefs de machines sur tous les serveurs ayant votre image comme source.
  • Vérifiez que xinetd/inetd soit bien démarré au boot sinon, activez-le. L'agent de Gandi est lancé par xinetd/inetd et permettra la fin de la configuration de votre serveur. Le package gandi-hosting-agent installe le fichier de configuration dans /etc/gandi/agent.yml.
  • Vérifiez les permissions de la racine de votre répertoire d'installation (/var/tmp dans l'exemple) et les répertoires lib/, root/ et tmp/ dans ce répertoire d'installation. En cas de doute, appliquer les mêmes permissions que les répertoires dans le système de votre serveur courant.
chmod 0755 /var/tmp/lib
chmod 1777 /var/tmp/tmp
chmod 0750 /var/tmp/root
chmod 0755 /var/tmp/
  • Créez les fichiers de base dans le répertoire /dev de votre installation pour les premières étapes du démarrage.

    Par exemple,

[ -e "$chroot"/dev/xvc0 ] || mknod "$chroot"/dev/xvc0 c 204 191
[ -e "$chroot"/dev/console ] || mknod "$chroot"/dev/console c 5 1
[ -e "$chroot"/dev/null ] || mknod "$chroot"/dev/null c 1 3
[ -e "$chroot"/dev/ptmx ] || mknod "$chroot"/dev/ptmx c 5 2
[ -e "$chroot"/dev/zero ] || mknod "$chroot"/dev/zero c 1 5
  • Ajouter les modules pour le kernel choisi dans le répertoire /lib/modules du

    répertoire contenant l'installation. Les modules sont disponibles sur mirrors.gandi.net/kernel/. Voir l'article sur le wiki.

A la fin de la configuration, quittez le chroot si vous êtes à l'intérieur par exit puis démonter les éléments concernant votre image dans /proc/mounts. Tuez les processus et démons qui ont pu être lancés pendant l'installation de package dans le chroot/répertoire contenant l'installation. Par exemple : grep /var/tmp /proc/mounts puis démonter umount /var/tmp/proc et les autres. Finir par umout /var/tmp qui devrait se dérouler sans erreur.

Détacher le disque

Retournez maintenant dans votre interface de gestion de disque, sur votre compte hébergement, puis détachez le disque sur lequel vous avez copié le disque ou préparé l'installation.

Rendre le disque bootable en associant un noyau

Dans l'interface d'administration, vous avez maintenant la possibilité de définir un noyau (kernel) pour un disque, sélectionnez alors le disque de données et associez-lui un noyau adapté à l'image que vous venez de créer. Prenons un disque de type "données" que l'on souhaite transformer en disque système/image :

s_disk1_fr.png

Utilisez alors le lien pour changer les informations du disque, vous trouverez en bas de page une option pour changer le type de disque :

s2disk_fr.png

Vous avez alors accès aux options avancées comme sur un disque système :

s3disk_fr.png

En associant un noyau, le disque devient utilisable comme image perso et sera dans la liste d'images comme les images Gandi AI ou Expert lorsque vous créez un serveur sur l'interface d'administration.

Créer un serveur à partir de cette image

Lors de la création d'un serveur par votre interface sur le site, vous trouverez votre nouvelle image perso dans la liste des images disponibles. La création du serveur utilisera donc cette image comme source pour le disque système. Le serveur démarrera normalement sur un disque copie de votre image. Vous aurez donc la possibilité de créer plusieurs serveurs "identiques" à partir de cette image perso.

Dépanner le serveur pendant le démarrage

L'hébergement Gandi vous donne la possibilité d'accéder au démarrage de votre serveur en passant par la console d'urgence qui permet par une simple connexion ssh d'avoir la sortie de la console par défaut de votre serveur.

Si vous configurez un getty sur la console par défaut (tty1, xvc0, hvc0 suivant la version de votre kernel), vous obtiendrez un shell de secours en cas d'erreur de boot ou un prompt en cas de boot correct.

Cette console d'urgence vous permet de voir les messages de démarrage et notamment les erreurs et ainsi de debugguer votre image.

Corriger l'image

Dans un second temps, si vous vous apercevez d'erreurs ou d'oublis dans votre image perso, il suffira d'attacher de nouveau votre disque/image sur un de vos serveurs virtuels (éventuellement un serveur dont la création du disque système a utilisé cette même image comme source). Une rapide correction sur l'image puis vous pourrez détacher le disque/image.

L'image sera alors de nouveau disponible pour créer des serveurs sans l'erreur.