Modifications entre les versions 1 et 21 (s'étendant sur 20 versions)
Version 1 à la date du 2015-03-12 22:24:50
Taille: 2333
Éditeur: MoussaNombre
Commentaire: Mise à jour
Version 21 à la date du 2015-12-23 07:59:10
Taille: 6196
Éditeur: TruongTungLam
Commentaire:
Texte supprimé. Texte ajouté.
Ligne 1: Ligne 1:
<<TableOfContents()>>
Ligne 3: Ligne 5:
== Documentation ==
 * http://sysadmin.smile.fr/post/2013/02/20/Migrate-your-OpenVZ-containers-to-KVM
 * https://www.webhostpython.com/billing/knowledgebase.php?action=displayarticle&id=32
 * http://www.pither.com/simon/blog/2011/09/20/convert-an-openvz-vm-to-kvm (celle mise en œuvre ici)
== Préparation de l'image de disque ==
Ligne 8: Ligne 7:
== Premier essai ==
* création de la nouvelle image de VM {{{
root@super-auforg:/var/lib/libvirt/images# qemu-img create -f qcow2 frontal.img 3G
Formatting 'frontal.img', fmt=qcow2 size=3221225472 encryption=off cluster_size=65536  root@super-auforg:/var/lib/libvirt/images#
 * création de la nouvelle image de VM (NB : `kvm-img` est obsolète) : {{{
# qemu-img create -f qcow2 /var/lib/libvirt/images/exemple.img 3G
Formatting 'exemple.img', fmt=qcow2 size=3221225472 encryption=off cluster_size=65536
Ligne 14: Ligne 11:
'''NB''' : kvm-img est obsolète {{{
root@super-auforg:/var/lib/libvirt/images# kvm-img create -f qcow2 frontal.img 3G
W: /usr/bin/kvm-img: this binary is deprecated, use qemu-img instead
 * monter l'image (il faut le module `ndb`) : {{{
# modprobe nbd max_part=8
# qemu-nbd -c /dev/nbd1 /var/lib/libvirt/images/exemple.img
}}}
 * partitionner le disque (swap et racine) et formater : {{{
# echo -e '2048,,8E,*' | sfdisk -q -f -uS /dev/nbd1 # partition unique de type LVM
# pvcreate /dev/nbd1p1
# vgcreate exemple /dev/nbd1p1
# lvcreate -L 1G -n swap exemple
# lvcreate -l 100%FREE -n root exemple
# mkswap -f /dev/exemple/swap
# mkfs -t ext4 /dev/exemple/root
Ligne 19: Ligne 25:
 * monter l'image {{{
root@super-auforg:/var/lib/libvirt/images# qemu-nbd -c /dev/nbd1 frontal.img
Failed to open /dev/nbd1: No such file or directoryroot@super-auforg:/var/lib/libvirt/images#
== Préparation réseau spécifique à KVM ==

 * ajouter une ligne `allow vmbr0` pour chaque bridge qui sera utilisé par les VM dans `/etc/qemu/bridge.conf` (créer ce fichier au besoin)
 . {i} cela sert à autoriser les connexions aux bridges par `qemu-brige-helper`, qui ne vient qu'avec qemu 2.1 (donc soit Jessie, soit Wheezy + backports)

== Copie des données du CT vers le disque image ==

 * monter la racine et y copier les données de notre CT : {{{
# mount /dev/exemple/root /mnt/
# rsync -avPHS --numeric-ids --exclude lost+found vz-www:/vz/root/109/ /mnt/
Ligne 23: Ligne 36:
Il faut le module ndb {{{
root@super-auforg:/var/lib/libvirt/images# modprobe nbd max_part=8
root@super-auforg:/var/lib/libvirt/images# qemu-nbd -c /dev/nbd1 frontal.img
root@super-auforg:/var/lib/libvirt/images#
 . (!) pour un test on peut utiliser `debootstrap jessie /mnt/`

== Adaptation de la config de la VM ==

 * `chroot` dans le dossier copié : {{{
# chroot /mnt
# su -
Ligne 28: Ligne 44:
 * partitionner le disque {{{
root@super-auforg:/var/lib/libvirt/images# cfdisk /dev/nbd1
root@super-auforg:/var/lib/libvirt/images# mkfs.ext4 /dev/nbd1p2
 * adapter/vérifier la config qui change d'une VM à l'autre : `/etc/hosts`, `/etc/resolv.conf`, `/etc/network/interfaces`, …
 * supprimer les éventuelles associations de noms d'interfaces réseau : {{{
# rm -f /etc/udev/rules.d/70-persistent-net.rules
Ligne 32: Ligne 48:
un swap et une racine.
 * monter la racine et y copier les données de notre CT {{{
root@super-auforg:/var/lib/libvirt/images# mount /dev/nbd1p2 /mnt/
root@super-auforg:/var/lib/libvirt/images# rsync -avPHS --numeric-ids vz-www:/var/lib/vz/root/109/ /mnt/
 * configurer `/etc/fstab` : {{{
/dev/exemple/root / ext4 errors=remount-ro 0 1
/dev/exemple/swap none swap sw 0 0
Ligne 37: Ligne 52:
 * chroot dans le dossier copie `chroot /mnt /bin/bash`
 * adapter/vérifier la config : hosts, interfaces, resolv.conf
 * activer les tty : ajouter dans `/etc/inittab` {{{
 * installer LVM, la gestion ACPI et la gestion des claviers exotiques (= non-US) : {{{
mount -t proc proc /proc
apt-get install lvm2 acpi-support-base console-data
service acpid stop
umount /proc
}}}
 * activer les tty (2 pour VNC, 1 pour virsh console) :
  * depuis `systemd` (Debian ≥ Jessie), en lançant cette commande : {{{
systemctl enable console-getty.service getty@tty2.service getty@ttyS0.service
}}}
  * avant `systemd` (Debian < Jessie), en ajoutant dans `/etc/inittab` : {{{
Ligne 42: Ligne 65:
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6
# pour utiliser virsh console
T0:23:respawn:/sbin/getty -L ttyS0 115200 vt102
Ligne 47: Ligne 68:
 * configurer `/etc/fstab` {{{
# /
/dev/vda2 / ext4 errors=remount-ro 0 1
# swap
/dev/vda1 none swap sw 0 0
 * s'assurer un accès root d'une façon ou d'une autre (assigner un mdp à root ou créer un compte sudo et le tester) afin de pouvoir utiliser `virsh console` ensuite

 * terminer : {{{
exit # sortir du su -
exit # sortir du chroot
umount /mnt # démonter la racine
vgchange -a n exemple # désactiver le VG exemple
qemu-nbd -d /dev/nbd1 # déconnecter le disque virtuel
Ligne 53: Ligne 77:
 * quitter le chroot, démonter le /mnt et détruire le ndb `qemu-nbd -d /dev/nbd1`
 * Start the VM using KVM command .....

== Finalisation de la conversion (sans virt-manager) ==

 * lancement de la VM (sur l'hôte) : {{{
# kvm -m 512 -curses \
  -kernel /boot/vmlinuz-$(uname -r) -initrd /boot/initrd.img-$(uname -r) \
  -append "root=/dev/exemple/root nomodeset" \
  -drive file=/var/lib/libvirt/images/exemple.img,if=virtio \
  -net nic,model=virtio -net bridge,br=vmbr0
}}}
  * `vmbr0` est le bridge sur lequel se connecter dans l'hôte
  * `-curses` démarre Qemu en mode « console semi-graphique »
  * `nomodeset` interdit la console en mode graphique
 . {i} la console est affichée directement à l'écran
 . {i} la séquence ESC+2 permet de basculer vers le contrôle de Qemu (entrer par ex. `system_porwerdown` pour un arrêt propre par ACPI)
 . {i} la séquence ESC+3 permet de basculer vers la console via le port série
 . {i} la séquence ESC+1 permet de revenir vers la console Linux



## * connexion à la VM (depuis l'hôte) : {{{
## # virsh console exemple
## }}}
  * installer le noyau et ce qu'il faut pour démarrer : {{{
# apt-get install --no-install-recommends linux-image-amd64 grub-pc
}}}
  . {i} cocher `/dev/vda` pour l'endroit où installer `grub-pc`
  * forcer une réinstallation de `udev` (pour les cas où il était déjà là) : {{{
# apt-get install --reinstall udev
}}}

  * TruongTungLam: je dois créer le fichier grub.cfg: {{{
# grub-mkconfig > /boot/grub/grub.cfg
}}}

  * éteindre la VM : {{{
# poweroff
}}}

 * création définitive de la VM : {{{
# virt-install --name=exemple --import --disk path=/var/lib/libvirt/images/exemple.img,format=qcow2,bus=virtio --vcpus=1 --ram=512 --hvm --network bridge:vmbr0,model=virtio --vnc
}}}

== Finalisation de la conversion (via virt-manager) ==

 * sur le serveur hôte : copier le noyau et le initrd système : {{{
# cp -a /boot/{vmlinuz,initrd.img}-$(uname -r) /var/lib/libvirt/images/
}}}

 * via virt-manager (sous Ubuntu) :
  * créer une nouvelle VM en utilisant l'image créée plus haut
  * réseau : associer la VM au bon bridge
  * une fois la VM créée, dans les "options de boot", dérouler l'option "démarrage direct sur le noyau" et renseigner les champs noyau, initrd (parcourir et sélectionner les fichiers précédemment copiés) et arguments du noyau (préciser le disque root) :
   {{attachment:Sélection_015.png}}
 * démarrer la VM, s'y connecter (via ssh ou sur la console virt-manager) et installer le noyau, grub2, etc. : {{{
# apt-get install linux-image-amd64 grub-pc
# apt-get install --reinstall udev
}}}
lire [[http://blog.smile.fr/Cloud/Migrate-your-openvz-containers-to-kvm-openstack|"Fourth step: start the Virtual Machine"]] pour les explications.
 * arrêter la VM, supprimer les options de "démarrage direct sur le noyau" (noyau, initrd et disque root)
 * démarrer la VM sur son propre noyau (démarrage normal)


== Documentation ==
 * https://www.webhostpython.com/billing/knowledgebase.php?action=displayarticle&id=32
 * http://www.pither.com/simon/blog/2011/09/20/convert-an-openvz-vm-to-kvm
 * http://blog.smile.fr/Cloud/Migrate-your-openvz-containers-to-kvm-openstack

KVMLibvirt/OpenvzToKVM

Préparation de l'image de disque

  • création de la nouvelle image de VM (NB : kvm-img est obsolète) :

    # qemu-img create -f qcow2 /var/lib/libvirt/images/exemple.img 3G
    Formatting 'exemple.img', fmt=qcow2 size=3221225472 encryption=off cluster_size=65536
  • monter l'image (il faut le module ndb) :

    # modprobe nbd max_part=8
    # qemu-nbd -c /dev/nbd1 /var/lib/libvirt/images/exemple.img
  • partitionner le disque (swap et racine) et formater :

    # echo -e '2048,,8E,*' | sfdisk -q -f -uS /dev/nbd1 # partition unique de type LVM
    # pvcreate /dev/nbd1p1
    # vgcreate exemple /dev/nbd1p1
    # lvcreate -L 1G -n swap exemple
    # lvcreate -l 100%FREE -n root exemple
    # mkswap -f /dev/exemple/swap
    # mkfs -t ext4 /dev/exemple/root

Préparation réseau spécifique à KVM

  • ajouter une ligne allow vmbr0 pour chaque bridge qui sera utilisé par les VM dans /etc/qemu/bridge.conf (créer ce fichier au besoin)

  • {i} cela sert à autoriser les connexions aux bridges par qemu-brige-helper, qui ne vient qu'avec qemu 2.1 (donc soit Jessie, soit Wheezy + backports)

Copie des données du CT vers le disque image

  • monter la racine et y copier les données de notre CT :

    # mount /dev/exemple/root /mnt/
    # rsync -avPHS --numeric-ids --exclude lost+found vz-www:/vz/root/109/ /mnt/
  • (!) pour un test on peut utiliser debootstrap jessie /mnt/

Adaptation de la config de la VM

  • chroot dans le dossier copié :

    # chroot /mnt
    # su -
  • adapter/vérifier la config qui change d'une VM à l'autre : /etc/hosts, /etc/resolv.conf, /etc/network/interfaces, …

  • supprimer les éventuelles associations de noms d'interfaces réseau :

    # rm -f /etc/udev/rules.d/70-persistent-net.rules
  • configurer /etc/fstab :

    /dev/exemple/root  /  ext4  errors=remount-ro  0  1
    /dev/exemple/swap  none  swap  sw  0  0
  • installer LVM, la gestion ACPI et la gestion des claviers exotiques (= non-US) :

    mount -t proc proc /proc
    apt-get install lvm2 acpi-support-base console-data
    service acpid stop
    umount /proc
  • activer les tty (2 pour VNC, 1 pour virsh console) :
    • depuis systemd (Debian ≥ Jessie), en lançant cette commande :

      systemctl enable console-getty.service getty@tty2.service getty@ttyS0.service
    • avant systemd (Debian < Jessie), en ajoutant dans /etc/inittab :

      1:2345:respawn:/sbin/getty 38400 tty1
      2:23:respawn:/sbin/getty 38400 tty2
      # pour utiliser virsh console
      T0:23:respawn:/sbin/getty -L ttyS0 115200 vt102
  • s'assurer un accès root d'une façon ou d'une autre (assigner un mdp à root ou créer un compte sudo et le tester) afin de pouvoir utiliser virsh console ensuite

  • terminer :

    exit # sortir du su -
    exit # sortir du chroot
    umount /mnt # démonter la racine
    vgchange -a n exemple # désactiver le VG exemple
    qemu-nbd -d /dev/nbd1 # déconnecter le disque virtuel

Finalisation de la conversion (sans virt-manager)

  • lancement de la VM (sur l'hôte) :

    # kvm -m 512 -curses \
      -kernel /boot/vmlinuz-$(uname -r) -initrd /boot/initrd.img-$(uname -r) \
      -append "root=/dev/exemple/root nomodeset" \
      -drive file=/var/lib/libvirt/images/exemple.img,if=virtio \
      -net nic,model=virtio -net bridge,br=vmbr0
    • vmbr0 est le bridge sur lequel se connecter dans l'hôte

    • -curses démarre Qemu en mode « console semi-graphique »

    • nomodeset interdit la console en mode graphique

  • {i} la console est affichée directement à l'écran

  • {i} la séquence ESC+2 permet de basculer vers le contrôle de Qemu (entrer par ex. system_porwerdown pour un arrêt propre par ACPI)

  • {i} la séquence ESC+3 permet de basculer vers la console via le port série

  • {i} la séquence ESC+1 permet de revenir vers la console Linux

  • installer le noyau et ce qu'il faut pour démarrer :

    # apt-get install --no-install-recommends linux-image-amd64 grub-pc
  • {i} cocher /dev/vda pour l'endroit où installer grub-pc

  • forcer une réinstallation de udev (pour les cas où il était déjà là) :

    # apt-get install --reinstall udev
  • TruongTungLam: je dois créer le fichier grub.cfg:

    # grub-mkconfig > /boot/grub/grub.cfg
  • éteindre la VM :

    # poweroff
  • création définitive de la VM :

    # virt-install --name=exemple --import --disk path=/var/lib/libvirt/images/exemple.img,format=qcow2,bus=virtio --vcpus=1 --ram=512 --hvm --network bridge:vmbr0,model=virtio --vnc

Finalisation de la conversion (via virt-manager)

  • sur le serveur hôte : copier le noyau et le initrd système :

    # cp -a /boot/{vmlinuz,initrd.img}-$(uname -r) /var/lib/libvirt/images/
  • via virt-manager (sous Ubuntu) :
    • créer une nouvelle VM en utilisant l'image créée plus haut
    • réseau : associer la VM au bon bridge
    • une fois la VM créée, dans les "options de boot", dérouler l'option "démarrage direct sur le noyau" et renseigner les champs noyau, initrd (parcourir et sélectionner les fichiers précédemment copiés) et arguments du noyau (préciser le disque root) :
      • Sélection_015.png

  • démarrer la VM, s'y connecter (via ssh ou sur la console virt-manager) et installer le noyau, grub2, etc. :

    # apt-get install linux-image-amd64 grub-pc
    # apt-get install --reinstall udev

lire "Fourth step: start the Virtual Machine" pour les explications.

  • arrêter la VM, supprimer les options de "démarrage direct sur le noyau" (noyau, initrd et disque root)
  • démarrer la VM sur son propre noyau (démarrage normal)

Documentation


KVMLibvirt/OpenvzToKVM (dernière édition le 2016-02-22 16:23:13 par JeanChristopheAndré)