Forum Linux.général Cloner une VM

Posté par . Licence CC by-sa.
Tags :
2
22
juil.
2019

Je vais être honnête, j’ai n’ai même pas cherché moi-même comment faire. Je veux connaître vos avis d’experts, même si, in fine, je vais quand même chercher moi-même pour croiser tout ce que vous m’aurez proposé.

Alors voilà, j’ai une VM (KVM, image QCOW) et je voudrais en avoir trois ou quatre semblables à celle-ci. Quand je dis semblable il y aurait forcément quelques différences : le nom d’hôte et son IP.

Il s’agit en l’occurrence de VM en CentOS 7 (et l’hôte est en Debian 9) mais une méthode agnostique de la distribution de la VM serait idéale.

Une commande aussi simple que virsh clone vm_a vm_b (et qui gère la conf réseau) ça me plairait bien quoi :)

  • # Attention ssh

    Posté par (page perso) . Évalué à 3 (+2/-1).

    cp imageA imageB

    Attention cependant à refaire des clefs ssh dans la nouvelle machine, à modifier les mots de passe qui vont bien…

    apt-get --purge remove openssh-server
    apt-get install openssh-server

    Comme cela est assez dépendant des services qui tournent sur la machine, il n'y a pas de méthodes magiques marchant dans tous les cas.

  • # Utiliser les outils libvirt : virt-install et guestfs

    Posté par (page perso) . Évalué à 6 (+4/-0).

    Regarde virt-clone.

    Pour ma part, j'ai rédigé un script pour créer une nouvelle VM fraîche à partir d'une VM orignale, en utilisant les outils libvirt.

    https://gitlab.com/bersace/dotfiles/blob/master/files/vm

    • [^] # Re: Utiliser les outils libvirt : virt-install et guestfs

      Posté par . Évalué à 5 (+2/-0).

      Merci. Je vais étudier ton script car mon essai de ce soir a été infructueux malheureusement.

      Pour cloner c’est simple :

      Ma VM à cloner s’appelle "Annabelle", première chose à faire, je l’éteins : virsh shutdown Annabelle, ensuite :

      virt-clone --original Annabelle --name Micheline --file /data/VMs/Micheline.qcow2
      Ça ça marche, j’ai maintenant une VM nommée "Micheline". Youpi ! Effectivement difficile de faire plus simple, encore que j’aurais pu utiliser --auto-clone puisque l’image disque d’Annabelle est le fichier /data/VMs/Annabelle.qcow2, ça serait revenu au même, mais dans le doute j’ai préféré préciser le nom du fichier pour l’image de ma nouvelle VM.

      Et c’est maintenant que ça se complique… tout un tas de trucs doivent être différents entre les deux VM, ne serait-ce que leur adresse réseau, mais il y a aussi leurs clés d’hôtes et encore tout un tas d’info dont les trois quarts me passent au dessus de la tête je n’ai pas honte de le dire. Bon OK c’est compliqué mais l’ordinateur est là pour me faciliter la vie en simplifiant, non ?

      Donc, naïvement je me suis dit qu’un virt-sysprep -d Micheline allait faire le job, d’ailleurs voilà ce qu’il me dit :

      # virt-sysprep -d Micheline
      [   0,0] Examining the guest ...
      [   3,3] Performing "abrt-data" ...
      [   3,3] Performing "bash-history" ...
      [   3,3] Performing "blkid-tab" ...
      [   3,3] Performing "crash-data" ...
      [   3,3] Performing "cron-spool" ...
      [   3,4] Performing "dhcp-client-state" ...
      [   3,4] Performing "dhcp-server-state" ...
      [   3,4] Performing "dovecot-data" ...
      [   3,4] Performing "logfiles" ...
      [   3,4] Performing "machine-id" ...
      [   3,4] Performing "mail-spool" ...
      [   3,4] Performing "net-hostname" ...
      [   3,4] Performing "net-hwaddr" ...
      [   3,4] Performing "pacct-log" ...
      [   3,4] Performing "package-manager-cache" ...
      [   3,4] Performing "pam-data" ...
      [   3,4] Performing "puppet-data-log" ...
      [   3,4] Performing "rh-subscription-manager" ...
      [   3,4] Performing "rhn-systemid" ...
      [   3,4] Performing "rpm-db" ...
      [   3,4] Performing "samba-db-log" ...
      [   3,4] Performing "script" ...
      [   3,4] Performing "smolt-uuid" ...
      [   3,4] Performing "ssh-hostkeys" ...
      [   3,4] Performing "ssh-userdir" ...
      [   3,4] Performing "sssd-db-log" ...
      [   3,4] Performing "tmp-files" ...
      [   3,4] Performing "udev-persistent-net" ...
      [   3,4] Performing "utmp" ...
      [   3,4] Performing "yum-uuid" ...
      [   3,4] Performing "customize" ...
      [   3,4] Setting a random seed
      [   3,7] Performing "lvm-uuids" ...
      

      Mais… c’est super ça ! Il en a même fait plus que nécessaire… en tout cas je vois "ssh-hostkeys", il a donc dû changer les clés d’hôte de Micheline…

      Mais voilà… si je démarre Micheline elle a l’adresse d’Annabelle (qui est éteinte). Annabelle avait une IP fixe (192.168.122.200) :

      # ssh root@192.168.122.200
      @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
      @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
      @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
      IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
      Someone could be eavesdropping on you right now (man-in-the-middle attack)!
      It is also possible that a host key has just been changed.
      The fingerprint for the ECDSA key sent by the remote host is
      SHA256:uho0TtI******bzUWQxVGFVvqikrCVkXQk9ad0*****.
      Please contact your system administrator.
      Add correct host key in /root/.ssh/known_hosts to get rid of this message.
      Offending ECDSA key in /root/.ssh/known_hosts:7
        remove with:
        ssh-keygen -f "/root/.ssh/known_hosts" -R 192.168.122.200
      ECDSA host key for 192.168.122.200 has changed and you have requested strict checking.
      Host key verification failed.
      
      

      Si je ne raconte pas de connerie (il est bientôt minuit quand-même…) virt-sysprep m’a bien changé la clé d’hôte mais il a pas changé l’IP ?!

      Je me dis que je suis sur la bonne voie mais il y a quand même des trucs bizarres… J’éteins Micheline et rallume Annabelle :

          # virsh list |grep Annabelle
           13    Annabelle                      running
      

      Je peux de nouveau me connecter en SSH à l’adresse 192.168.122.200, c’est bien Annabelle, c’est la bonne clé.

      Par contre ce sont les commandes suivantes que j’ai du mal à comprendre, je ne comprends pas pourquoi je n’ai aucune info :

      # virsh domifaddr Annabelle
      Name MAC address Protocol Address
      -------------------------------------------------------------------------------

      rien ! nada, que dalle :(

      J’ai la vague impression que si Annabelle avait une lease DHCP plutôt qu’une IP fixe j’aurais moins de problème mais j’ai la flemme de tester et je tiens à mon IP fixe.

      Bon, si j’ai le temps demain, avec mes expériences foireuses de ce soir et le script d’Etienne je vais p-e m’en sortir !

      Pour filer quelques info supplémentaires, l’hôte est une Debian 9 et Annabelle est une CentOS 7

      • [^] # Re: Utiliser les outils libvirt : virt-install et guestfs

        Posté par (page perso) . Évalué à 3 (+1/-0).

        Mais voilà… si je démarre Micheline elle a l’adresse d’Annabelle (qui est éteinte). Annabelle avait une IP fixe (192.168.122.200) :

        Là tu touche à une autre sujet, la configuration réseau.

        virt-sysprep ne configure pas l'IP à ma connaissance. Pour ma part, j'utilise dnsmasq avec bonheur. Particulièrement, j'utilise lxc-net (périphérique lxcbr0) pour mes conteneurs LXC ET mes VM. J'ai également la résolution DNS des VM/conteneurs pour ne plus me poser de questions d'IP fixe ou dynamique.

        cf. https://bersace.cae.li/point-virt.html et autres articles. Je déploie avec mes playbooks également : https://gitlab.com/bersace/dotfiles/blob/master/lxc.yml et le rôle deimosfr.lxc auquel je contribue.

        Pour un dév ou un admin sys, avoir VM, conteneurs LXC et docker en réseau avec DNS sur son poste me semble important. Si la configuration n'est pas aboutie, on y passe beaucoup trop de temps à chaque projets.

      • [^] # Re: Utiliser les outils libvirt : virt-install et guestfs

        Posté par (page perso) . Évalué à 3 (+1/-0).

        Si tu ne veux pas te lancer dans la configuration dynamique du réseau, essaie de changer l'IP du clone via virt-sysprep --run-command.

      • [^] # Adresse MAC

        Posté par . Évalué à 1 (+0/-0).

        Bonjour

        Il te faudrait changer l'adresse MAC du périphérique réseau de ta machine virtuelle clone.

        • [^] # Re: Adresse MAC

          Posté par . Évalué à 2 (+1/-0).

          Je n'avais pas fait attention à :

          [ 3,4] Performing "net-hwaddr" ...

          alors, si l'adresse MAC a été changée
          c'est sans doute une histoire de configuration de l'interface réseau
          en IP fixe, peut-être par le fichier /etc/network/interfaces

          • [^] # Re: Adresse MAC

            Posté par . Évalué à 3 (+0/-0).

            Je vais effectivement essayer de changer l’ip "à la main" avec un virt-sysprep --run-command

            Merci à tous pour votre aide, comme toujours vous assurez !

        • [^] # Re: Adresse MAC

          Posté par (page perso) . Évalué à 3 (+1/-0). Dernière modification le 25/07/19 à 09:37.

          L'adresse MAC est configurée dans l'hyperviseur, c'est virt-clone qui la change. virt-sysprep touche uniquement à l'intérieur de la VM. net-hwaddr sert à nettoyer les règles udev associant le nom eth0 selon l'adresse MAC.

          virt-sysprep ne touche pas à /etc/network/interfaces, ni à /etc/sysconfig/network.

  • # [Résolu]

    Posté par . Évalué à 3 (+0/-0).

    Voici comment je m’y suis pris :

    1. Un coup de virt-clone, comme décrit plus haut, ça c’est pas très compliqué.

    2. Utilisation de virt-sysprep sur la nouvelle VM pour qu’il modifie ce qu’il doit modifier. Par défaut il prend (toutes ?) les opérations nécessaires. La liste est aussi dans un précédent commentaire. Mais voilà, il ne change pas l’IP de ma nouvelle VM, ce qui est forcément très gênant pour tout un de raisons :(

    C’est là que l’option --file de virt-sysrep devrait s’avérer utile : le fichier à modifier c’est /etc/sysconfig/network-scripts/ifcfg-eth0 et l’expression sed pour remplacer la valeur de IPADDR doit être ultra simple… sauf que… sauf que, j’en ai fait un paquet sans jamais y arriver :( C’est comme si le fichier que je tentais de modifier n’avait jamais "IPADDR=192.168.122.200" mais autre chose… ou alors il fallait des doubles échappement ou encore, je dois me rendre à l’évidence : les regex et moi ça fait deux :/

    Solution pour remplacer : (NB: la machine clone (Micheline) est arrêtée) :

    virt-edit -d Micheline /etc/sysconfig/network-scripts/ifcfg-eth0
    là on change l’IP.

    Ensuite je peux me connecter à cette nouvelle machine ! Par contre elle a conservé le nom d’hôte "annabelle" (comme la VM d’origine). Un coup de netui et c’est plié !

    Voilà, je vais avoir un moyen simple d’avoir plusieurs VM « identiques » sans avoir à les installer une par une. Youpi.

    Il y a sûrement mieux mais je suis assez fier de cette solution. J’aurais juste aimé que l’option --file fonctionne pour moi… comme j’ai eu une solution de contournement je n’ai pas testé --run-command (à la place de --file). Je suis également passé à côté de l’option --hostname qui aurait sûrement pu m’éviter d’avoir à lancer netui.

    Encore une fois : merci à tous.

    • [^] # Re: [Résolu]

      Posté par . Évalué à 3 (+0/-0).

      J’apprends à me servir de libvirt… je me suis rendu compte que virt-sysprep était loin de tout remettre « d’aplomb » :

      # virt-df
      Système de fichiers                  1K-blocs   Utilisé Disponible Utilisation%
      Annabelle:/dev/sda1                    1038336     115544     922792   12%
      Annabelle:/dev/centos_annabelle/root  17811456    1234740   16576716    7%
      Micheline:/dev/sda1                    1038336     115544     922792   12%
      Micheline:/dev/centos_annabelle/root  17811456    1109656   16701800    7%
      

      Comme on peut le voir le nom du VG (le VG par défaut qui reprend le nom d’hôte dans son nom) n’est pas modifié non plus.

      À part le fait que ce soit « crade », est-ce que ça peut avoir des impacts, et si oui lesquels ? Une chose à avoir à l’esprit en préparant son “master” (la VM qui va servir de modèle) ce serait notamment de nommer directement le VG avec un nom plus générique. Ici j’avais choisi le partitionnement LVM automatique (de CentOS 7), je n’aurais pas dû faire ça.

      Il va falloir que je jette un œil à virt-buiilder ça peut être une solution : au lieu de cloner une VM j’ai une méthode/un script pour créer autant de VM que je veux.

      Question subsidiaire : est-ce que certains connaissent KVM-qemu et VMWare/vSphere ? Quels sont les avantages et les inconvénients de chacun ?

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.