Virtualisation d'un serveur physique Linux

Il existe plusieurs outils permettant de réaliser la migration d'une machine physique en machine virtuelle (P2V) : Vmware Converter, MondoRescue, Ultimate P2V... Ces solutions supportent généralement des OS Linux récents. Pour migrer une machine physique dont l'OS n'est pas tout jeune, ce qui est ma situation, il faudra mettre les mains dans le cambouis. Rassurez-vous, ce n'est pas si compliqué que ça.

Le principe général est de créer puis de restaurer une sauvegarde de la machine physique à migrer afin de créer un clone virtuel. Pour cela nous pouvons utiliser différents moyens :

  • la commande dd (data dump)
  • le programme rsync (remote synchronization)
  • un logiciel de sauvegarde : CloneZilla, Drive Image, TiNa (Atempo Time Navigator), CloneZilla...

J'ai réalisé des tests concluants avec dd. Cette commande permet de créer un clone parfait (image physique du ou des disques durs à sauvegarder) car permet de copier les données bloc par bloc. L'envers du décors est que pour réaliser l'image du ou des disques durs, il faut impérativement que les disques soient démontés : il faut par conséquent prévoir un temps de coupure de la production relativement long. Sur un autre aspect, il peut être difficile de modifier la table des partitions et/ou la taille des partitions.

Les tests avec rsync sont également concluants. rsync offre plus de souplesse que la commande dd et permet de minimiser le temps de coupure de la production. Cependant, disposant d'un serveur TiNa et de clients TiNa installés sur les machines physiques que je dois virtualiser, j'ai opté pour la solution du logiciel de sauvegarde.

Principe général

Le principe général est de créer une sauvegarde de la machine physique (PM) puis de restaurer cette sauvegarde sur une machine virtuelle (VM). Pour cela nous allons procéder en 2 phases :

Phase 1 : créer le clone virtuel

  1. Créer une VM minimaliste à partir des CD / DVD d'installation de la machine à virtualiser.
  2. Créer une sauvegarde totale de PM
  3. Restaurer la sauvegarde de PM
  4. Démarrer la VM

Phase 2 : mise en production

  1. Reprise des données
  2. Déconnecter PM du réseau
  3. Changer l'adresse IP de la VM
  4. Restaurer les crontabs sur la VM

 

Phase 1 : créer un clone virtuel

Etape 0 : identifier les éléments de configuration

L'objectif de cette étape est de préparer le terrain et d'identifier :

  • les principaux éléments de configuration afin de créer la VM de base
  • les services/démons lancés au boot du système
  • les tâches exécutées périodiquement (cron)

Si vous ne disposez pas des CD/DVD d'installation, ces informations pourront vous aider à identifier précisément la distribution installée. Internet regorge de ressources et vous pourrez certainement dénicher le précieux sésame...

1. Version du kernel et de l'OS

# cat /etc/cat issue
# uname -a
# cat /proc/version

 

2. Date d'installation du système

# ls -lct /etc | tail -1 | awk '{print $6, $7, $8}'
# df / | awk '{print $1}' | grep dev | xargs tune2fs -l | grep create
# rpm -qa --last

 

3. Liste des périphériques de stockage : nombre et taille des disques, nombre et taille des partitions.

# cat /etc/fstab
# df
# fdisk -l

 

4. Quantité de RAM

# cat /proc/meminfo

 

5. Type de système : 32 ou 64 bits

# file /sbin/init
# getconf LONG_BIT

 

6. Configuration carte(s) réseau(x)

# ifconfig
# cat /etc/resolv.conf
# cat /etc/sysconfig/network
# cat /etc/sysconfig/network-scripts/ifcfg-eth*

 

7. BootLoader (lilo, grub)

# dd if=/dev/sda bs=512 count=1 2>&1 | strings | grep -Ei 'grub|lilo'

 

8. Liste des process/daemons lancés au boot du système

# chkconfig --list
# for i in `find /etc/rc*.d -name S*`; do basename $i | sed -r 's/^S[0-9]+//'; done | sort | uniq

 

9. Tâches listées dans les crontab

# for user in $(cut -f1 -d: /etc/passwd); do echo -e "\n\n==> $user:" && crontab -u $user -l; done

 

Etape 1 : créer une VM minimaliste à partir des CD / DVD d'installation

Si vous ne disposez pas des CD / DVD d'installation, vous pouvez tenter l'expérience avec une distribution disposant d'un kernel identique.
Comme nous restaurerons sur cette machine virtuelle la sauvegarde du serveur physique, n'installer que le strict minimum.
Si vous souhaiter changer la table des partitions et/ou la taille des partitions c'est le moment.

Après avoir installé et configuré la VM, réaliser une copie de sauvegarde de :

/etc/fstab
/etc/lilo.conf
/etc/modules.conf
/etc/mtab
/etc/resolv.conf
/etc/sysconfig/network-scripts/
/etc/sysconfig/network

Eteindre la VM.

 

Etape 2 : créer une sauvegarde totale de la machine physique

J'ai utilisé le logiciel TiNa. D'autres outils peuvent être utilisés. Cette étape n'est pas utile si vous avez décidé d'utiliser rsync pour constituer votre clone virtuel.

 

Etape 3 : restaurer la sauvegarde de PM

Pour procéder à la restauration de la sauvegarde de la PM sur la VM, nous avons besoin d'une autre machine virtuelle.

Restauration à partir de TiNa

Sur une autre VM disposant d'un client TiNa (nous la nommerons VM2) :

  1. Connecter les disques de la VM créée à l'étape 1 sur VM2
  2. Rebooter VM2
  3. Créer un dossier /mnt/newsys/
  4. Monter les partitions des disques de la VM créée à l'étape 1 sur VM2, dans le dossier /mnt/newsys/
  5. Depuis TiNa, paramétrer la restauration de la sauvegarde totale de la PM vers VM2
    1. Exclure de la restauration :
      - /boot/
      - /etc/fstab
      - /etc/lilo.conf
      - /etc/modules.conf
      - /etc/mtab
      - /etc/resolv.conf
      - /etc/sysconfig/network-scripts/
      - /etc/sysconfig/network
    2. Changer le chemin de destination de la restauration pour /mnt/newsys/
    3. Vérifier que TiNa conserve les droits d'accès (propriétés et permissions) des fichiers et répertoires
    4. Lancer la restauration

 

A la fin de la restauration, il peut être intéressant de neutraliser les crontabs de la VM créée à l'étape 1. Les fichiers se trouvent généralement dans un des répertoires suivants :

/var/spool/cron/crontabs/
/var/spool/cron/tabs/
/var/cron/tabs/

Pour neutraliser les crontabs des utilisateurs, il suffit simplement de renommer les fichiers présents dans le répertoire contenant les tâches des utilisateurs. Par exemple :

# cd /mnt/newsys/var/spool/cron/crontabs/
# mv root root.old

 

Il ne reste plus qu'à :

  1. Démonter les partitions de la VM (partitions montées dans /mnt/newsys/)
  2. Eteindre VM2
  3. Déconnecter les disques correspondants à VM
  4. Redémarrer VM2

A ce stade, la VM créée à l'étape 1 devrait être fonctionnelle.

 

Restauration à partir de rsync

  1. Démarrer la VM avec un LiveCD
  2. Créer un dossier /mnt/newsys/
  3. Monter les partitions des disques de la VM dans le dossier /mnt/newsys/
  4. Créer un fichier exclude contenant les fichiers et dossiers à exclure :
    /boot/
    /etc/fstab
    /etc/lilo.conf
    /etc/modules.conf
    /etc/mtab
    /etc/resolv.conf
    /etc/sysconfig/network-scripts/
    /etc/sysconfig/network
  5. Lancer la copie de PM vers VM
    # rsync --progress --numeric-ids --exclude-from=/root/exclude -ave ssh user@serveurPhysique:/ /mnt/newsys/

 

A la fin de la copie, neutraliser (si besoin) les crontabs puis éteindre la VM.
A ce stade, la VM créée à l'étape 1 devrait être fonctionnelle.

 

Etape 4 : démarrer la VM

Démarrer la VM. Elle devrait démarrer et fonctionner normalement (en dehors des tâches listées dans les crontabs si vous les avez neutralisées).
Vérifier l’intégrité des différents processus et programmes.
En cas de kernel panic lors du boot de la VM, il faudra envisager de réinstaller le boot loader (lilo / grub) et/ou de recréer le fichier initrd.

Exemple : réinstallation de lilo (Mandrake Linux release 9.1)

  1. Démarrer la VM en mode rescue
  2. Créer le répertoire /mnt/sysimg/
  3. Monter les partitions dans /mnt/sysimg/
  4. Monter le répertoire proc :
    # mount -t proc /proc /mnt/sysimg/proc
  5. Monter le répertoire dev :
    # mount --bind /dev /mnt/sysimg/dev
  6. Changer le répertoire racine pour /mnt/sysimg/
    # chroot /mnt/sysimg/ /bin/bash
  7. Vérifier les fichiers :
    /etc/fstab
    /etc/lilo.conf
  8. Réinstaller lilo
    # lilo -v
  9. Quitter l’environnement
    # exit
  10. Démonter les partitions montées dans /mnt/sysimg/
  11. Redémarrer la machine

 

Exemple : recréer le fichier initrd (Mandrake Linux release 9.1)

  1. Démarrer la VM en mode rescue
  2. Créer le répertoire /mnt/sysimg/
  3. Monter les partitions dans /mnt/sysimg/
  4. Monter le répertoire proc :
    # mount -t proc /proc /mnt/sysimg/proc
  5. Monter le répertoire dev :
    # mount --bind /dev /mnt/sysimg/dev
  6. Changer le répertoire racine pour /mnt/sysimg/ :
    # chroot /mnt/sysimg/ /bin/bash
  7. Vérifier les fichiers :
    /etc/lilo.conf
    /etc/modules.conf
  8. Recréer le fichier initrd
    # cd /boot
    # cp initrd-2.4.21-0.13mdkenterprise.img initrd-2.4.21-0.13mdkenterprise.img.old
    # mkinitrd -v -f initrd-2.4.21-0.13mdkenterprise.img 2.4.21-0.13mdkenterprise
  9. Quitter l’environnement :
    # exit
  10. Démonter les partitions montées dans /mnt/sysimg/
  11. Redémarrer la machine

 

 

Phase 2 : mise en production de la VM

La mise en production de la VM nécessite la reprise des données entre la création de la VM et la date de mise en production. Une coupure de la production est nécessaire. Le temps de coupure sera conditionné par le temps nécessaire à la reprise des données.

Sur les deux machines (PM et VM) :

  • Arrêter les tâches automatisées (cron)
  • Arrêter les éventuelles interfaces
  • Arrêter Apache et les bases de données
  • Arrêter les partages de fichiers (samba, ftp)

Sur la VM, utiliser rsync pour effectuer la reprise des données :

# rsync --progress -auve ssh user@machinePhysique:/source/ /destination/

A la fin de la reprise des données :

  • rebooter la VM
  • contrôler l’intégrité des données reprises

Puis :

  • Déconnecter la PM du réseau
  • Changer l’adresse ip de la VM (lui attribuer l'adresse ip de la PM)
  • Relancer l’interface réseau de VM
  • Restaurer les crontabs sur la VM

 

 

 

 

 

 

Étiquettes