GitzTalk//gitztalk.com/2016-03-30T00:00:00-04:00Utiliser dnsmasq avec VMWare Workstation2016-03-30T00:00:00-04:002016-03-30T00:00:00-04:00Orkamungustag:gitztalk.com,2016-03-30:/posts/2016/03/30/dnsmasq-vmware-fr/<p>Récemment, en modifiant la configuration des services du mon réseau interne, j'ai commencé à avoir des erreurs DNS avec des machines virtuelles VMware Workstation configurées en réseau NAT. Ces machines n'arrivaient pas à trouver des noms d'hôtes sur Internet (google.com par exemple). Sur QEMU et Virtualbox, avec des configurations …</p><p>Récemment, en modifiant la configuration des services du mon réseau interne, j'ai commencé à avoir des erreurs DNS avec des machines virtuelles VMware Workstation configurées en réseau NAT. Ces machines n'arrivaient pas à trouver des noms d'hôtes sur Internet (google.com par exemple). Sur QEMU et Virtualbox, avec des configurations similaires et sur le même système hôte, les machines virtuelles arrivaient à communiquer avec l'externe. J'ai donc tenté de faire fonctionner VMware mais sans succès.</p>
<p>Cette semaine je suis tombé sur (<a href="https://blog.nelhage.com/2010/10/dnsmasq-and-vmware/">cette page par Nelson Elhage</a>). La solution qu'il propose est assez simple et elle fonctionne très bien.</p>
<p>Voici à quoi ressemble ma configuration de dnsmasq (<code>/etc/dnsmasq.conf</code>) :</p>
<div class="highlight"><pre><span></span><span class="c1">##### VMWare custom DNS config #####</span>
<span class="c1"># Web ref: https://blog.nelhage.com/2010/10/dnsmasq-and-vmware/</span>
listen-address<span class="o">=</span>172.16.140.1
listen-address<span class="o">=</span>127.0.0.1
no-dhcp-interface<span class="o">=</span>lo
<span class="c1"># Location of the actual DNS</span>
<span class="nv">server</span><span class="o">=</span>192.168.1.1
<span class="nv">local</span><span class="o">=</span>/vmware/
<span class="c1"># Only resolve hosts within the domain</span>
no-hosts
no-resolv
<span class="nv">domain</span><span class="o">=</span>vmware
dhcp-fqdn
<span class="c1"># Only use the 10 - 200 range</span>
dhcp-range<span class="o">=</span>172.16.140.10,172.16.140.200,36h
dhcp-authoritative
<span class="c1"># VMware gateway route is on .2</span>
dhcp-option<span class="o">=</span>option:router,172.16.140.2
</pre></div>
<p>Ensuite il suffit de désactiver le serveur DHCP interne de VMware dans le « Virtual Network Editor », redémarrer les services de réseautique de l'hôte (<code>systemctl restart networking</code>) et redémarrer les machines virtuelles.</p>Linux Containers (LXC) sur Debian2015-04-03T00:00:00-04:002015-04-03T00:00:00-04:00Orkamungustag:gitztalk.com,2015-04-03:/posts/2015/04/03/lxc-debian-fr/<p>Les <em>Linux Containers</em> (LXC) (<a href="https://linuxcontainers.org/">site officiel</a>) utilisent les fonctionnalités de <em>cgroups</em> (<a href="https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt">documentation</a>) pour isoler certains processus dans le contexte du système d'exploitation. Ultimement, LXC est une technique de virtualisation intégrée au noyau Linux.</p>
<p>L'avantage de cette technique de virtualisation est qu'elle est beaucoup moins complexe à mettre en place. Installer …</p><p>Les <em>Linux Containers</em> (LXC) (<a href="https://linuxcontainers.org/">site officiel</a>) utilisent les fonctionnalités de <em>cgroups</em> (<a href="https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt">documentation</a>) pour isoler certains processus dans le contexte du système d'exploitation. Ultimement, LXC est une technique de virtualisation intégrée au noyau Linux.</p>
<p>L'avantage de cette technique de virtualisation est qu'elle est beaucoup moins complexe à mettre en place. Installer un logiciel de virtualisation tel que Virtualbox ou VMware nécessite l'installation de modules et de services supplémentaires qui ne sont pas inclus avec le système d'exploitation. Dans le cas de LXC, tous les modules sont inclus dans le noyau Linux, il suffit d'installer les outils de gestion.</p>
<p>Contrairement à la virtualisation « classique », les ressources comme la mémoire, l'espace de disque et le processeur attribués à un « machine virtuelle » (ou contenant) LXC ne sont pas réservés. Par exemple, avec Virtualbox, si une machine virtuelle (VM) a accès à 512 Mo de mémoire, peu importe l'utilisation réelle de la mémoire pour la VM, le système hôte doit réserver cette plage de mémoire et se retrouve donc avec 512 Mo de moins pour faire fonctionner d'autres processus. </p>
<p>Debian supporte LXC depuis la version 6.0 (Debian Squeeze) qui a été lancé en 2011. Depuis, le support pour LXC et les outils inclus dans le dépôt APT se sont améliorés constamment. Pratiquement toutes les distributions modernes supportent LXC, même RHEL et CentOS 6.</p>
<p>Sur Debian, si vous n'avez pas <code>systemd</code> (ce n'est pas nécessaire avec <code>systemd</code> si vous avez installé <code>libvirt-bin</code>, il faut ajouter cette ligne dans <code>/etc/fstab</code> :</p>
<div class="highlight"><pre><span></span>cgroup /sys/fs/cgroup cgroup defaults 0 0
</pre></div>
<p>Une fois le <code>cgroup</code> configuré, il suffit d'installer quelques paquets et de rouler l'outil de configuration :</p>
<div class="highlight"><pre><span></span><span class="n">apt</span><span class="o">-</span><span class="k">get</span> <span class="n">install</span> <span class="n">lxc</span> <span class="n">bridge</span><span class="o">-</span><span class="n">utils</span> <span class="n">libvirt</span><span class="o">-</span><span class="n">bin</span> <span class="n">debootstrap</span>
<span class="o">[</span><span class="p">...</span><span class="o">]</span>
<span class="n">lxc</span><span class="o">-</span><span class="n">checkconfig</span>
<span class="o">[</span><span class="p">...</span><span class="o">]</span>
<span class="o">---</span> <span class="n">Namespaces</span> <span class="o">---</span>
<span class="n">Namespaces</span><span class="p">:</span> <span class="n">enabled</span>
<span class="n">Utsname</span> <span class="n">namespace</span><span class="p">:</span> <span class="n">enabled</span>
<span class="n">Ipc</span> <span class="n">namespace</span><span class="p">:</span> <span class="n">enabled</span>
<span class="n">Pid</span> <span class="n">namespace</span><span class="p">:</span> <span class="n">enabled</span>
<span class="n">User</span> <span class="n">namespace</span><span class="p">:</span> <span class="n">enabled</span>
<span class="n">Network</span> <span class="n">namespace</span><span class="p">:</span> <span class="n">enabled</span>
<span class="n">Multiple</span> <span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">pts</span> <span class="n">instances</span><span class="p">:</span> <span class="n">enabled</span>
<span class="o">---</span> <span class="n">Control</span> <span class="n">groups</span> <span class="o">---</span>
<span class="n">Cgroup</span><span class="p">:</span> <span class="n">enabled</span>
<span class="n">Cgroup</span> <span class="n">clone_children</span> <span class="n">flag</span><span class="p">:</span> <span class="n">enabled</span>
<span class="n">Cgroup</span> <span class="n">device</span><span class="p">:</span> <span class="n">enabled</span>
<span class="n">Cgroup</span> <span class="n">sched</span><span class="p">:</span> <span class="n">enabled</span>
<span class="n">Cgroup</span> <span class="n">cpu</span> <span class="n">account</span><span class="p">:</span> <span class="n">enabled</span>
<span class="n">Cgroup</span> <span class="n">memory</span> <span class="n">controller</span><span class="p">:</span> <span class="n">enabled</span>
<span class="n">Cgroup</span> <span class="n">cpuset</span><span class="p">:</span> <span class="n">enabled</span>
<span class="o">---</span> <span class="n">Misc</span> <span class="o">---</span>
<span class="n">Veth</span> <span class="n">pair</span> <span class="n">device</span><span class="p">:</span> <span class="n">enabled</span>
<span class="n">Macvlan</span><span class="p">:</span> <span class="n">enabled</span>
<span class="n">Vlan</span><span class="p">:</span> <span class="n">enabled</span>
<span class="n">File</span> <span class="n">capabilities</span><span class="p">:</span> <span class="n">enabled</span>
</pre></div>
<p>Ensuite, pour créer notre premier contenant LXC, il suffit d'exécuter la commande suivante :</p>
<div class="highlight"><pre><span></span>lxc-create -n my_first_lxc -t debian
</pre></div>
<p>Une fois le contenant LXC créé, il est possible de le démarrer comme ceci (assurez-vous de noter le mot de passe pour l'utilisateur <code>root</code>) :</p>
<div class="highlight"><pre><span></span>lxc-start -n my_first_lxc
</pre></div>
<p>Il est possible d'ajuster une panoplie de paramètres (notamment les paramètres réseaux) en modifiant le fichier <code>/var/lib/lxc/my_first_lxc/config</code>.</p>
<p>Puisque les contenants LXC n'utilisent pas d'images de disque par défaut, il est possible d'aller jouer dans le système de fichier et de faire des références à d'autres endroits du système de fichier de l'hôte.</p>
<p>Selon moi, les contenants LXC sont très utiles pour la compilation de logiciel. Avant d'utiliser les LXC, j'étais un adepte de <code>chroot</code>. Ce dernier est un outil encore indispensable, mais il y a beaucoup de limitations avec <code>chroot</code> qui ne sont pas présentes en utilisant un contenant virtualisé comme LXC. On peut « bridger » l'interface réseau pour donner une adresse IP unique à la machine LXC. On peut aussi plus facilement isoler les services.</p>
<p>LXC est très simple d'utilisation, et c'est sans surprise que Docker se sert de LXC comme levier afin de faciliter la distribution et la gestion de plusieurs contenants de style « sandbox ».</p>
<h3>Références supplémentaires :</h3>
<ul>
<li><a href="https://wiki.debian.org/LXC">https://wiki.debian.org/LXC</a></li>
</ul>Quoi de neuf pour septembre 2014?2014-09-24T00:00:00-04:002014-09-24T00:00:00-04:00Orkamungustag:gitztalk.com,2014-09-24:/posts/2014/09/24/september-2014-fr/<p>Le mois de septembre a été très rempli. Comme je n'ai pas eu l'opportunité de publier des articles, voici une liste de sujets d'actualité du mois de septembre.</p>
<h2>Vulnérabilité d'exécution de code à distance pour bash (CVE-2014-6271)</h2>
<p>Une vulnérabilité sévère a été annoncée dans l'interpréteur de commandes <em>bash</em>. La plupart …</p><p>Le mois de septembre a été très rempli. Comme je n'ai pas eu l'opportunité de publier des articles, voici une liste de sujets d'actualité du mois de septembre.</p>
<h2>Vulnérabilité d'exécution de code à distance pour bash (CVE-2014-6271)</h2>
<p>Une vulnérabilité sévère a été annoncée dans l'interpréteur de commandes <em>bash</em>. La plupart des distributions ont publiés une annonce de sécurité pour informer à leurs utilisateurs sur la procédure pour corriger cette vulnérabilité. Il est recommandé de mettre à jour ce paquet à la dernière version le plus rapidement possible. Pour éviter que des services utilisant les fonctionnalités CGI exploitent la faille, l'utilisation d'un pare-feu d'application web est fortement recommandé.</p>
<p>Selon Florian Wiemer et Stéphane Chazelas, la vulnérabilité est causée par la façon dont <em>bash</em> utilise les variables d'environnement pour propager les définitions de fonctions à travers l'environnement. Un attaquant pourrait faire un appel arbitraire à un programme binaire à partir de l'extérieur, ce qui permettrait une exécution de code à distance ou un déni de service.</p>
<h6>Vous voulez en savoir plus?</h6>
<p><a href="https://www.debian.org/security/2014/dsa-3032">Debian.org - Alerte de sécurité Debian #3032</a></p>
<h2>Lancement de Fedora 21 Alpha</h2>
<p>La version Alpha de Fedora 21 a été lancée hier. F21 sera divisé en différents "produits": Feodra Cloud, Feodra Server et Fedora Workstation. Ces versions vont évidemment puiser leurs paquets à partir du même dépot de logiciels, mais les paquets installés par défauts seront différents pour mieux refléter les différents besoins.</p>
<p>J'ai essayé F21 Workstation rapidement avec le disque <em>live</em>, histoire de prendre quelques captures d'écrans et de voir comment Gnome 3.14 progresse. Je ne suis pas un grand fan de Gnome mais j'ai toujours trouvé l'intégration avec Fedora très bien effectuée. Je suis assez confiant que F21 sera une solide lors de sa sortie.</p>
<p>J'espère toutefois que l'équipe en charge de l'installeur graphique Anaconda travaillerons sur la stabilité du logiciel. En effet, j'ai eu quelques problèmes lors de la configuration des partitions sur Centos 7 la semaine dernière. Les crashs d'Anaconda forçaient un redémmarrage complet du système...</p>
<p>Pour ceux qui n'attendent que les captures d'écrans, régalez-vous!</p>
<p><center><table><tr><td><a href="/images/linux/fedora21/fedora_21a_01.png"><img alt="fedora21_01" src="/images/linux/fedora21/fedora_21a_01_s.jpg" style="width: 400px; height: auto; max-width: 100%;" title="Vue générale du bureau"/></a></td></p>
<td><a href="/images/linux/fedora21/fedora_21a_02.png"><img alt="fedora21_01" src="/images/linux/fedora21/fedora_21a_02_s.jpg" style="width: 400px; height: auto; max-width: 100%;" title="Gestion des espaces de travail dynamique"/></a></td>
<p></tr></table></center></p>
<h6>Vous voulez en savoir plus?</h6>
<p><a href="https://fedoraproject.org/wiki/F21_Alpha_release_announcement">Fedoraproject.org - Annonce du lancement</a></p>
<h2>Perte de données clients chez Home Depot</h2>
<p>La semaine dernière, Home Depot a publié une annonce à l'intention des médias à propos des rumeurs de brèche de sécurité dans les systèmes de paiements de la compagnie au Canada et aux États-Unis. Home Depot confirme que des criminels auraient mis la main sur "approximativement" 56 millions de numéros de cartes entre avril et septembre 2014.</p>
<p>Les canadiens qui utilisent le système de puce + NIP pourraient ne pas être affectés. Toutefois, il n'y a pas de confirmation. Les clients américains ne sont pas aussi chanceux puisque les cartes magnétiques sont facilement clonables. Les cartes à puces sont beaucoup moins répandues aux États-Unis et plusieurs compagnies (dont Home Depot) n'offrent pas des terminaux de ventes acceptants les cartes à puces dans toutes leurs succursales. N'oubliez pas de vérifier vos transactions bancaires.</p>
<p>Combien de brèches de ce genre est-ce que ça prendra pour que les autorités se mettent à punir la culture corporative irresponsable? Il semble que de plus en plus de brèches arrivent chaque années.</p>
<h6>Vous voulez en savoir plus?</h6>
<p><a href="http://media.corporate-ir.net/media_files/IROL/63/63646/HD_Data_Update_II_9-18-14.pdf">Annonce d'Home Depot (fichier PDF)</a></p>
<h2>Vim en tant que Pid 1</h2>
<p>Alors voilà quelque chose d'intéressant! Je me souviens d'avoir lu un article il y a quelques temps où l'auteur avait configuré emacs pour rouler comme <code>/sbin/init</code>. Je suis toutefois un incorruptible utilisateur de Vi(m). J'imagine qu'avoir Vim comme processus initial pourrait être utile dans le future quand tous les appareils ménagers seront pourvus de microprocesseurs et que pour une raison, seule la machine à café sera à portée de la main pour coder.</p>
<p>Selon Remy van Elst, il suffit simplement de compiler Vim en mode statique et le placer comme processus <em>init</em>. Dans son guide, il utilise <a href="http://distro.ibiblio.org/tinycorelinux/">Tiny Core Linux</a>, une distribution très compacte du kernel Linux avec Busybox.</p>
<h6>Vous voulez en savoir plus?</h6>
<p><a href="https://raymii.org/s/blog/Vim_as_PID_1_Boot_to_Vim.html">Raymii.org - Boot to Vim, Vim as Pid 1</a></p>TRIM sur Debian Jessie avec LVM sur dm-crypt/LUKS2014-09-01T00:00:00-04:002014-09-01T00:00:00-04:00Orkamungustag:gitztalk.com,2014-09-01:/posts/2014/09/01/debian-jessie-trim-dm-crypt-luks-fr/<p>Le mois dernier, j'ai installé Debian Jessie sur mon Thinkpad T410 nouvellement équipé d'un SSD. Pour qu'il n'y aie pas de dégradation de performance, il faut activer la fonctionnalité TRIM. Celle-ci averti le SSD qu'il peut libérer les blocs non-alloués par le système de fichier.</p>
<p>Lorsqu'on utilise un seul système …</p><p>Le mois dernier, j'ai installé Debian Jessie sur mon Thinkpad T410 nouvellement équipé d'un SSD. Pour qu'il n'y aie pas de dégradation de performance, il faut activer la fonctionnalité TRIM. Celle-ci averti le SSD qu'il peut libérer les blocs non-alloués par le système de fichier.</p>
<p>Lorsqu'on utilise un seul système de fichier directement sur le disque, c'est très facile d'utiliser TRIM. On peut faire TRIM manuellement en exécutant <code>fstrim</code> sur la partition voulue. On peut aussi inscrire dans <code>/etc/fstab</code> l'option <code>discard</code> pour le faire automatiquement, pourvue que le système de fichier supporte l'option. La plupart des systèmes de fichiers modernes comme ext4, btrfs et xfs supportent cette option.</p>
<p>Mon arrangement est toutefois un peu plus complexe. J'utilise dm-crypt/LUKS pour chiffrer les partitions sur mon SSD. Ensuite, j'utilise LVM sur la partition dm-crypt pour monter les systèmes de fichiers utilisés par le système d'exploitation (<code>/</code>, <code>/home</code> et <code>swap</code>). Un tel arrangement permet de déverrouiller toutes les partitions d'un coup avec un seul mot de passe au démarrage. L’inconvénient, c'est que la commande <code>fstrim</code> ne se rend pas jusqu'au disque dur, elle est bloquée par LVM et par dm-crypt. Toutefois, c'est facile à ajuster.</p>
<p>Premièrement, il faut configurer dm-crypt en modifiant <code>/etc/crypttab</code> :</p>
<div class="highlight"><pre><span></span>sda5_crypt /dev/sda5 none luks,discard
</pre></div>
<p>Ensuite, pour LVM, il faut modifier la section <code>devices</code> du fichier <code>/etc/lvm/lvm.conf</code> :</p>
<div class="highlight"><pre><span></span>devices {
[...]
issue_discards = 1
}
</pre></div>
<p>Pour les partitions <code>/</code>, <code>/home</code> et <code>swap</code>, il faut modifier <code>/etc/fstab</code> :</p>
<div class="highlight"><pre><span></span># <file system> <mount point> <type> <options> <dump> <pass>
/dev/mapper/ssd-root / ext4 relatime,errors=remount-ro,discard 0 1
/dev/mapper/ssd-home /home ext4 relatime,discard 0 2
/dev/mapper/ssd-swap none swap sw,discard 0 0
</pre></div>
<p>Après avoir fait ces modifications, il faut régénérer l'initramfs pour prendre en compte les nouvelles options pour le volume chiffré.</p>
<div class="highlight"><pre><span></span>Update-initramfs -u -k $(uname -r)
</pre></div>
<p>Après un redémarrage, pour vérifier si tout fonctionne correctement vous devriez pouvoir lancer manuellement la commande TRIM (<code>fstrim</code>) sur une de vos partitions.</p>
<h4>Références :</h4>
<ul>
<li><a href="https://wiki.debian.org/SSDOptimization">https://wiki.debian.org/SSDOptimization</a></li>
<li><a href="http://wiki.gentoo.org/wiki/SSD">http://wiki.gentoo.org/wiki/SSD</a></li>
</ul>KVM, vraiment si rapide?2014-07-24T00:00:00-04:002014-07-24T00:00:00-04:00Orkamungustag:gitztalk.com,2014-07-24:/posts/2014/07/24/just-how-fast-kvm-really-is-fr/<p>Pour ajouter à mon précédent billet sur <a href="/posts/2014/06/30/gaming-in-a-vm-fr/">QEMU / KVM</a>, j'ai fait quelques tests de performance additionnels. Le but était de comparer aux performances natives les résultats de QEMU / KVM, VMware Player et Oracle Virtualbox. Il s'agit simplement de donner une mesure de comparaison. D'autres personnes pourront faire une analyse plus …</p><p>Pour ajouter à mon précédent billet sur <a href="/posts/2014/06/30/gaming-in-a-vm-fr/">QEMU / KVM</a>, j'ai fait quelques tests de performance additionnels. Le but était de comparer aux performances natives les résultats de QEMU / KVM, VMware Player et Oracle Virtualbox. Il s'agit simplement de donner une mesure de comparaison. D'autres personnes pourront faire une analyse plus poussée des résultats.</p>
<p>Mon système est relativement dépassé : Intel Core i7 860, 12 Go de RAM et une AMD Radeon HD 5850 1Go. Le système d'exploitation hôte est Debian GNU / Linux Sid x86_64. Pour les tests natifs, Windows 7 est utilisé. Les logiciels de Futuremark (3d Mark) doivent être activés avec une licence avant l'utilisation. Unigine Heaven est un <em>benchmark</em> multi-plateforme gratuit. Les détails concernant les logiciels utilisés sont au bas de l'article.</p>
<h2>Résultats</h2>
<h3>3d Mark 2006</h3>
<p>Bien que 3d Mark 2006 est un <em>benchmark</em> qui commence à se faire vieux, il représente très bien les jeux basés sur le DirectX 9.0c. Pour VMware Player, il y a quelques problèmes d'affichages au niveau des effets d'ombres et de lumière. <a href="/images/kvm/vmware-3dmark06-glitches.jpg">Cliquez ici pour voir une capture d'écran</a>.</p>
<table>
<thead>
<tr>
<th align="left"> </th>
<th align="center"><strong> Windows 7 </strong></th>
<th align="center"><strong> QEMU / KVM </strong></th>
<th align="center"><strong> VMware Player </strong></th>
<th align="center"><strong> Oracle Virtualbox </strong></th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><em>Score</em></td>
<td align="center">17308</td>
<td align="center">16130</td>
<td align="center">11496</td>
<td align="center">3824</td>
</tr>
<tr>
<td align="left"><em>SM2.0</em></td>
<td align="center">6631</td>
<td align="center">5948</td>
<td align="center">4132</td>
<td align="center">1878</td>
</tr>
<tr>
<td align="left"><em>SM3.0</em></td>
<td align="center">8607</td>
<td align="center">8013</td>
<td align="center">5207</td>
<td align="center">N/D</td>
</tr>
<tr>
<td align="left"><em>CPU</em></td>
<td align="center">4563</td>
<td align="center">4514</td>
<td align="center">4233</td>
<td align="center">2980</td>
</tr>
</tbody>
</table>
<p></br></p>
<p>Impact moyen de performance comparé à Windows 7 <em>baremetal</em> :</p>
<ul>
<li>QEMU / KVM : -6,27%</li>
<li>VMware Player : -29,50%</li>
<li>Oracle Virtualbox : -61,43%<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup></li>
</ul>
<h3>3d Mark Vantage</h3>
<p>VMWare Player et Oracle Virtualbox ne supportent pas le DirectX 10. 3d Mark Vantage ne peut donc pas fonctionner sous ces logiciels de virtualisation.</p>
<table>
<thead>
<tr>
<th align="left"> </th>
<th align="center"><strong> Windows 7 </strong></th>
<th align="center"><strong> QEMU / KVM </strong></th>
<th align="center"><strong> VMware Player </strong></th>
<th align="center"><strong> Oracle Virtualbox </strong></th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><em>Score</em></td>
<td align="center">15867</td>
<td align="center">14623</td>
<td align="center">N/D</td>
<td align="center">N/D</td>
</tr>
<tr>
<td align="left"><em>GPU</em></td>
<td align="center">15813</td>
<td align="center">14365</td>
<td align="center">N/D</td>
<td align="center">N/D</td>
</tr>
<tr>
<td align="left"><em>CPU</em></td>
<td align="center">16446</td>
<td align="center">15457</td>
<td align="center">N/D</td>
<td align="center">N/D</td>
</tr>
</tbody>
</table>
<p></br></p>
<p>Impact moyen de performance comparé à Windows 7 <em>baremetal</em> :</p>
<ul>
<li>QEMU / KVM : -7,86%</li>
<li>VMware Player : N/D</li>
<li>Oracle Virtualbox : N/D</li>
</ul>
<h3>3d Mark 2011</h3>
<p>VMWare Player et Oracle Virtualbox ne supportent pas le DirectX 11. 3d Mark 2011 ne peut donc pas fonctionner sous ces logiciels de virtualisation.</p>
<table>
<thead>
<tr>
<th align="left"> </th>
<th align="center"><strong> Windows 7 </strong></th>
<th align="center"><strong> QEMU / KVM </strong></th>
<th align="center"><strong> VMware Player </strong></th>
<th align="center"><strong> Oracle Virtualbox </strong></th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><em>Score</em></td>
<td align="center">3980</td>
<td align="center">3882</td>
<td align="center">N/D</td>
<td align="center">N/D</td>
</tr>
<tr>
<td align="left"><em>GPU</em></td>
<td align="center">3775</td>
<td align="center">3739</td>
<td align="center">N/D</td>
<td align="center">N/D</td>
</tr>
<tr>
<td align="left"><em>Physics</em></td>
<td align="center">5761</td>
<td align="center">5218</td>
<td align="center">N/D</td>
<td align="center">N/D</td>
</tr>
<tr>
<td align="left"><em>Combined</em></td>
<td align="center">3772</td>
<td align="center">3545</td>
<td align="center">N/D</td>
<td align="center">N/D</td>
</tr>
</tbody>
</table>
<p></br></p>
<p>Impact moyen de performance comparé à Windows 7 <em>baremetal</em> :</p>
<ul>
<li>QEMU / KVM : -4,71%</li>
<li>VMware Player : N/D</li>
<li>Oracle Virtualbox : N/D</li>
</ul>
<h3>Unigine Heaven</h3>
<p>Unigine Heaven est un <em>benchmark</em> pour le DirectX 11. Toutefois, pour permettre d'élargir l'échantillon de test, j'ai seulement noté les résultats du benchmark de base en DirectX 9. VMware Player produit des problèmes d'affichage, notamment pour les effets d'ombres dans Unigine Heaven. <a href="/images/kvm/vmware-heaven-glitches.jpg">Cliquez ici pour voir une capture d'écran</a>.</p>
<p>Sous Virtualbox, on obtient l'erreur suivante : <code>D3D9Render required number of buffers 4 is not supported</code>. Il est donc impossible de tester les performances sous Virtualbox.</p>
<table>
<thead>
<tr>
<th align="left"> </th>
<th align="center"><strong> Windows 7 </strong></th>
<th align="center"><strong> QEMU / KVM </strong></th>
<th align="center"><strong> VMware Player </strong></th>
<th align="center"><strong> Oracle Virtualbox </strong></th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><em>Score</em></td>
<td align="center">1897</td>
<td align="center">1772</td>
<td align="center">1234</td>
<td align="center">N/D</td>
</tr>
<tr>
<td align="left"><em>FPS</em></td>
<td align="center">75,3</td>
<td align="center">70,4</td>
<td align="center">49</td>
<td align="center">N/D</td>
</tr>
<tr>
<td align="left"><em>FPS Min</em></td>
<td align="center">9,4</td>
<td align="center">8,9</td>
<td align="center">8,5</td>
<td align="center">N/D</td>
</tr>
<tr>
<td align="left"><em>FPS Max</em></td>
<td align="center">150,1</td>
<td align="center">132,3</td>
<td align="center">113,7</td>
<td align="center">N/D</td>
</tr>
</tbody>
</table>
<p></br></p>
<p>Impact moyen de performance comparé à Windows 7 <em>baremetal</em> :</p>
<ul>
<li>QEMU / KVM : -7,57%</li>
<li>VMware Player: -25,93%</li>
<li>Oracle Virtualbox : N/D</li>
</ul>
<h2>Conclusion</h2>
<p>Pour conclure, je doit admettre que je suis surpris des résultats obtenus. Premièrement, je ne m'attendais pas à ce que QEMU / KVM soit si performant. Avec un impact moyen de -6,60% comparé aux performances natives, il est évident que la virtualisation peut maintenant convenir pour des applications exigeantes en ressources.</p>
<p>De plus, j'ai été surpris de voir les résultats de VMware Player. Bien que certains artefacts visuels étaient apparents lors des tests graphiques de 3d Mark 2006 et d'Heaven, l'impact de performance est acceptable. Il est possible que les pilotes Mesa Radeon ont un impact sur VMware pour ce qui est du rendu graphique. Pour du <em>gaming</em> léger, ou pour faire de l'accélération de bureau plus poussés comme Gnome Shell et KDE4, VMware Player est une excellente alternative. De plus, il est très facile de mettre des machines virtuelles en marche.</p>
<p>Pour ce qui est d'Oracle Virtualbox, il semble que les pilotes 3D soient expérimentaux. En plus d'être assez instable et de causer des artefacts sur l'affichage, il sont très peu performants. Virtualbox reste intéressant en tant que logiciel de virtualisation <em>open source</em> (licence GPL) gratuit, comparé à VMware Player qui est un logiciel propriétaire. De ce fait, Virtualbox est disponible dans la plupart des dépôts de logiciels des distributions Linux.</p>
<p>Il serait intéressant d'ajouter une comparaison avec Xen et Hyper-V. Peut-être bien dans un prochain article.</p>
<h2>Détails additionnels</h2>
<h3>Benchmarks</h3>
<table>
<thead>
<tr>
<th align="left"> </th>
<th align="center"><strong> Sites officiels </strong></th>
<th align="center"></th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">3d Mark 2006</td>
<td align="center"><a href="http://www.futuremark.com/benchmarks/legacy">Lien</a></td>
<td align="center"></td>
</tr>
<tr>
<td align="left">3d Mark Vantage</td>
<td align="center"><a href="http://www.futuremark.com/benchmarks/3dmark-vantage">Lien</a></td>
<td align="center"></td>
</tr>
<tr>
<td align="left">3d Mark 2011</td>
<td align="center"><a href="http://www.futuremark.com/benchmarks/3dmark11">Lien</a></td>
<td align="center"></td>
</tr>
<tr>
<td align="left">Unigine Heaven</td>
<td align="center"><a href="https://unigine.com/products/heaven/">Lien</a></td>
<td align="center"></td>
</tr>
</tbody>
</table>
<h3>Autres logiciels</h3>
<table>
<thead>
<tr>
<th align="left"> </th>
<th align="center"><strong> Sites officiels </strong></th>
<th align="center"><strong> Versions </strong></th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">QEMU</td>
<td align="center"><a href="http://wiki.qemu.org/Main_Page">Lien</a></td>
<td align="center">2.0</td>
</tr>
<tr>
<td align="left">KVM</td>
<td align="center"><a href="http://www.linux-kvm.org/page/Main_Page">Lien</a></td>
<td align="center">-</td>
</tr>
<tr>
<td align="left">Libvirt</td>
<td align="center"><a href="http://libvirt.org/">Lien</a></td>
<td align="center">1.2.4</td>
</tr>
<tr>
<td align="left">Linux</td>
<td align="center"><a href="https://www.kernel.org/">Lien</a></td>
<td align="center">3.15</td>
</tr>
<tr>
<td align="left">VMware Player</td>
<td align="center"><a href="https://www.vmware.com/products/player/">Lien</a></td>
<td align="center">6.0.3</td>
</tr>
<tr>
<td align="left">Oracle Virtualbox</td>
<td align="center"><a href="https://www.virtualbox.org/">Lien</a></td>
<td align="center">4.3.12</td>
</tr>
<tr>
<td align="left">Windows 7</td>
<td align="center"><a href="https://fr.wikipedia.org/wiki/Windows_7">Wikipedia</a></td>
<td align="center">Pro x64 SP1</td>
</tr>
<tr>
<td align="left">Debian GNU / Linux</td>
<td align="center"><a href="https://www.debian.org/">Lien</a></td>
<td align="center">Sid x64_64</td>
</tr>
</tbody>
</table>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>Je n'ai pas compté le test SM3 dans le calcul de moyenne pour Oracle Virtualbox. <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Gaming en machine virtuelle?2014-06-30T00:00:00-04:002014-06-30T00:00:00-04:00Orkamungustag:gitztalk.com,2014-06-30:/posts/2014/06/30/gaming-in-a-vm-fr/<blockquote>
<p><em>Gaming en machine virtuelle?</em></p>
</blockquote>
<p>Bien sûr, je ne parle pas de jouer à Angry Birds. Si vous m'aviez posé la question il y a quelques années, je me serais probablement moqué de vous. En effet, la virtualisation de type <em>desktop</em> n'a jamais été très performante au niveau de l'accélération 3D …</p><blockquote>
<p><em>Gaming en machine virtuelle?</em></p>
</blockquote>
<p>Bien sûr, je ne parle pas de jouer à Angry Birds. Si vous m'aviez posé la question il y a quelques années, je me serais probablement moqué de vous. En effet, la virtualisation de type <em>desktop</em> n'a jamais été très performante au niveau de l'accélération 3D. Contrairement aux processeurs (UPC) qui ont depuis plusieurs années des extensions de virtualisation, les cartes vidéos n'ont jamais ce type de fonctionnalités.</p>
<p>Au mieux, les hyperviseurs vont aller chercher à émuler un pilote graphique haute performance en utilisant certaines capacités du GPU (<em>Graphic Processing Unit</em>) de l'hôte pour accélérer un peu les systèmes invités. C'est notamment ce qui permet de rouler Aero, l'effet de vitre et de transparence de Windows Vista et Windows 7 en machine virtuelle.</p>
<p>Au delà de l'affichage du bureau avec une accélération matérielle, on se rend compte des limites de ces pilotes 3D. Les produits comme VMware Player et Oracle Virtualbox n'arrivent pas à fournir des performances adéquates, notamment pour les jeux en 3D.</p>
<p>En faisant des recherches, il y a quelques années, je me suis apperçu que l'hyperviseur Xen permettait de déléguer entièrement une carte graphique à un système invité<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>. Le problème que j'ai rencontré avec Xen est qu'il nécessitait d'ajouter certains modules au kernel Linux. Tout ça ne jouait pas très bien avec les pilotes Nvidia pour ma carte vidéo. J'ai donc abandonné l'idée de faire fonctionner Xen.</p>
<p>En juin dernier, VFIO-VGA a été ajouté au kernel Linux 3.9<sup id="fnref-2"><a class="footnote-ref" href="#fn-2">2</a></sup>. Puisque KVM fait parti du kernel depuis longtemps, j'avais déjà un hyperviseur qui fonctionnait sans problèmes avec ma Geforce. J'ai lu un peu sur le sujet et j'ai récupéré une Radeon HD 5850 pour tester cette nouvelle fonctionnalité.</p>
<p>Le reste de cet article est repris d'un document que j'ai rédigé l'hiver dernier. J'ai retravaillé un peu la structure du texte pour rendre la lecture plus accessible. Je le publie ici aujourd’hui puisque j'ai l'intention de revenir sur le sujet prochainement, histoire de démontrer l'évolution rapide de QEMU et de KVM.</p>
<p>Une image vaut mille mots :</p>
<p><center><a href="/images/kvm/kvm_3dmark06.png"><img alt="kvm_3dmark06" src="/images/kvm/kvm_3dmark06_s.png" style="width: 640px; height: auto; max-width: 100%;" title="Score de 15610 à 3D Mark 2006"/></a></p>
<p><em>Image - Performance d'une VM sous 3D Mark 2006</em></center></p>
<h2>Mise en garde</h2>
<p>Comme cette technologie est en cours de développement et que les patchs sont régulièrement acceptés, il n'est pas conseillé de déployer VFIO-VGA dans un environnent de production sans avoir une très bonne connaissance du sujet. De plus, je recommande d'avoir une bonne compréhension du fonctionnement des hyperviseurs avant de vous aventurer plus loin.</p>
<p>De ce fait, pour augmenter la stabilité et les performances, il est idéal de suivre de près les notes des développeurs des logiciels. Plusieurs patchs doivent être appliqués pour permettre le bon fonctionnement en fonction du matériel que vous utilisez. Pour appliquer des patchs, il faut donc savoir aller chercher le code source des programmes et être en mesure de compiler le programme patché, ce qui est en dehors du cadre de ce document.</p>
<p>Chaque distribution de Linux possède ses différences. Toutefois, il est possible d'arriver à un résultat similaire à partir de n'importe quelle distribution. Il y a des gens qui ont réussi à faire fonctionner VFIO-VGA avec Arch Linux, Fedora, Debian et Ubuntu. Si vous n'êtes pas familier avec Linux et un environnement en ligne de commande, vous aurez beaucoup de chemin à faire.</p>
<h2>Préparation</h2>
<h3>Matériel nécessaire</h3>
<p>Certaines caractéristiques sont requises au niveau du matériel afin de partager à une machine virtuelle (VM) vos périphériques. Pour faire du <em>VGA passthrough</em>, le système hôte doit avoir des capacités IOMMU<sup id="fnref-3"><a class="footnote-ref" href="#fn-3">3</a></sup>.</p>
<p>Avant l'arrivée des contrôleurs de mémoire intégrée et de la fusion du Northbridge avec le processeur, il fallait s'assurer que le processeur et le chipset supporte les fonctionnalités. Maintenant, VT-d et AMD-Vi sont des fonctions intégrées à l'UPC. Le BIOS (ou UEFI) doit tout de même supporter VT-d ou AMD-Vi.</p>
<h4>Processeur</h4>
<p>Chez Intel, il faut un processeur avec les extensions de virtualisation<sup id="fnref-4"><a class="footnote-ref" href="#fn-4">4</a></sup> VT-x et VT-d (<a href="http://ark.intel.com/">vérifiable ici</a>). Si vous avez un processeur K (par exemple un Core i7 4770K), il y a de fortes chances que VT-d ne soit pas supporté. Vous ne pourrez pas faire de <em>VGA passthrough</em> sans VT-d.</p>
<p>Pour AMD, il faut un processeur avec les extensions AMD-V et AMD-Vi. AMD n'a pas de base de données compréhensive sur le sujet, malheureusement, mais les processeurs les plus récents semblent tous avoir ces extensions.</p>
<h4>Carte mère (Chipset et BIOS/UEFI)</h4>
<p>La carte-mère doit également supporter VT-x/AMD-V et VT-d/AMD-Vi. Vous devez donc regarder avec le manufacturier pour le modèle de carte-mère si ces technologies sont supportées. Presque tous les constructeurs supportent VT-x/AMD-V.</p>
<p>Pour ce qui est de VT-d/AMD-Vi, la plupart des cartes construites par Gigabyte et par Asrock semblent supporter cette extension de virtualisation. Pour les autres constructeurs, comme Asus et MSI, c'est mal documenté.</p>
<h4>Carte vidéo</h4>
<p>Idéalement, il faut deux cartes vidéos sur le système. Une pour l'hôte et une pour l'invité. Gardez à l'esprit que le GPU n'est pas partagé entre les deux systèmes. Lorsque VFIO-VGA passe le contrôle d'un périphérique à un système invité, il n'est plus utilisable par l'hôte. Donc si vous n'avez qu'une carte vidéo, vous perdrez l'affichage de votre hôte et il ne sera possible d'y avoir accès que par SSH. Ça s'approche du Dom0 pour Xen.</p>
<p>Chez AMD/ATI, une Radeon de série HD 3000 ou plus récent est souhaitable. Chez Nvidia, une Geforce de série 8000 ou plus récent est recommandé. Les équivalents FirePro et Quadro devraient également fonctionner.</p>
<p>L'affichage devra être dirigé vers un moniteur à partir d'un des ports de la carte vidéo qui est passée à la VM. Il faut donc prévoir en conséquence.</p>
<h4>Contrôle de la VM (affichage, clavier, souris)</h4>
<p>Spice, RDP, VNC ou NX peuvent être utilisés pour contrôler la VM. Ces solutions réseaux n'arrivent pas à fournir un débit souhaitable pour jouer par contre.</p>
<p>Pour faciliter l'installation du système d'exploitation, il est possible d'utiliser <code>-vga qxl</code> qui présentera l'affichage de la VM dans la fenêtre de QEMU. Le fonctionnement ressemblera à celui de VMware Player.</p>
<p>Toutefois, lorsqu'un jeu sera en marche, <code>-vga qxl</code> ne devrait pas être utilisé pour éviter les pertes de performances. Dans ce cas, il faut prévoir une méthode pour contrôler le clavier et la souris de la VM. <a href="http://synergy-project.org/">Synergy</a> peut être utilisé pour partager ces fonctionnalités entre l'hôte et l'invité. Autrement, on peut passer le contrôle de n'importe quel périphérique USB à la VM. On pourrait donc utiliser une <em>switchbox KVM</em> (<a href="http://www.trendnet.com/products/proddetail.asp?status=view&prod=215_TK-207K">comme celle-ci</a>) pour changer le focus sur la VM ou sur l'hôte.</p>
<h3>Logiciels nécessaires</h3>
<p>Pour permettre le <em>VGA passthrough</em>, nous allons donc utiliser <a href="http://www.linux-kvm.org/page/Main_Page">KVM</a> et <a href="http://wiki.qemu.org/Main_Page">QEMU</a>. Optionnellement, vous pouvez utiliser <a href="http://libvirt.org/">Libvirt</a> pour faciliter la gestion des VM si vous en avez plusieurs sur le même hôte. Il est également possible d'utiliser <a href="http://wiki.libvirt.org/page/Virtio">Virtio</a> pour augmenter la performance des périphériques réseaux et des contrôleurs de disques de la VM.</p>
<h4>Kernel Linux</h4>
<p>Il faut un <a href="https://www.kernel.org/">kernel Linux</a> au moins équivalent à la version 3.9. À partir de cette version, le VFIO-VGA est introduit. J'ai personnellement testé depuis 3.11. Vous pouvez prendre un kernel qui est fourni par votre distribution mais il y a de fortes chances que vous devrez le recompiler avec les options suivantes :</p>
<div class="highlight"><pre><span></span>CONFIG_VFIO_IOMMU_TYPE1
CONFIG_VFIO
CONFIG_VFIO_PCI
CONFIG_VFIO_PCI_VGA
CONFIG_VIRTIO_PCI
CONFIG_VIRTIO_BALLOON
CONFIG_VIRTIO_MMIO
CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES
</pre></div>
<p>De plus, pour que l'hôte continue de bien fonctionner quand une VM est en fonction, il faut un patch pour modifier l'arbitrage des GPU. Dans mon cas, je dois appliquer <a href="http://www.mail-archive.com/qemu-devel@nongnu.org/msg174066.html">ce patch</a> pour permettre à ma Geforce de bien fonctionner quand une VM est en marche.</p>
<h4>QEMU (et SeaBIOS)</h4>
<p>Pour éviter d'avoir à redémarrer l'hôte à chaque fois que la VM se ferme, prévoyez QEMU à partir de la version 1.7 avec le patch VGA RESET. Si VGA RESET n'est pas appliqué, vous ne pourrez pas démarrer une machine virtuelle deux fois de suite sans redémarrer ou mettre en veille le système hôte. VGA RESET à été intégré à QEMU depuis la version 2.0. J'utilise <a href="https://github.com/awilliam/qemu-vfio">https://github.com/awilliam/qemu-vfio</a>.</p>
<p>SeaBIOS à été fusionné avec QEMU depuis la version 1.7. Il n'est donc pas nécessaire de compiler SeaBIOS ailleurs.</p>
<h2>Configuration</h2>
<h3>Les modules</h3>
<p>Une fois les logiciels installés, il faut configurer le système hôte pour permettre à VFIO-PCI de s'accrocher à notre matériel physique. Pour ce faire, il y a un sujet assez compréhensif sur les forums d'<a href="https://bbs.archlinux.org/viewtopic.php?id=162768">Arch Linux</a>. Je vous conseille d'y jeter un coup d'œil.</p>
<p>Pour mon système, j'ai blacklisté le module <code>radeon</code> pour l'empêcher de s'approprier ma deuxième carte vidéo. Il suffit d'ajouter ou de créer un fichier dans le dossier <code>/etc/modprobe.d/</code>.</p>
<div class="highlight"><pre><span></span># /etc/modprobe.d/blacklist.conf
blacklist radeon
</pre></div>
<p>Ensuite, j'ai créé un fichier pour m'assurer que les modules KVM et VFIO chargent certaines valeurs.</p>
<div class="highlight"><pre><span></span># /etc/modprobe.d/kvm.conf
options kvm ignore_msrs=1
options kvm_intel emulate_invalid_guest_state=0
# Si votre carte mere ne supporte pas bien IOMMU
# Surveillez vos fichiers logs attentivement si vous activez cette option
options vfio_iommu_type1 allow_unsafe_interrupts=1
</pre></div>
<p>Finalement, j'ai ajouté la ligne de démarrage de Linux dans <code>/etc/default/grub</code> :</p>
<div class="highlight"><pre><span></span>GRUB_CMDLINE_LINUX_DEFAULT="quiet splash iommu=on intel_iommu=on"
</pre></div>
<p>Après avoir modifié les paramétrés de GRUB, il faut toujours mettre à jour les fichiers qui sont chargés au démarrage. Sur Debian et Ubuntu, les scripts <code>update-initramfs</code> et <code>update-grub</code> permettent de le faire facilement. Au redémarrage du système, on peut vérifier que les modules sont bien chargés.</p>
<div class="highlight"><pre><span></span>$ dmesg <span class="p">|</span> grep -i pci-dma
<span class="o">[</span> 0.923886<span class="o">]</span> PCI-DMA: Intel<span class="o">(</span>R<span class="o">)</span> Virtualization Technology <span class="k">for</span> Directed I/O
</pre></div>
<h3>VFIO</h3>
<p>J'utilise le script suivant placé dans <code>/usr/bin/</code> pour attacher mes périphériques à vfio-pci :</p>
<div class="highlight"><pre><span></span><span class="ch">#!/bin/bash</span>
<span class="c1">#</span>
<span class="c1"># /usr/bin/vfio-bind</span>
<span class="c1"># Attach devices to vfio-pci</span>
modprobe vfio-pci
<span class="k">for</span> dev in <span class="s2">"</span><span class="nv">$@</span><span class="s2">"</span><span class="p">;</span> <span class="k">do</span>
<span class="nv">vendor</span><span class="o">=</span><span class="k">$(</span>cat /sys/bus/pci/devices/<span class="nv">$dev</span>/vendor<span class="k">)</span>
<span class="nv">device</span><span class="o">=</span><span class="k">$(</span>cat /sys/bus/pci/devices/<span class="nv">$dev</span>/device<span class="k">)</span>
<span class="k">if</span> <span class="o">[</span> -e /sys/bus/pci/devices/<span class="nv">$dev</span>/driver <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
<span class="nb">echo</span> <span class="nv">$dev</span> > /sys/bus/pci/devices/<span class="nv">$dev</span>/driver/unbind
<span class="k">fi</span>
<span class="nb">echo</span> <span class="nv">$vendor</span> <span class="nv">$device</span> > /sys/bus/pci/drivers/vfio-pci/new_id
<span class="k">done</span>
</pre></div>
<p>Pour faciliter l'expérience, on peut se loguer en super utilisateur (oui en root!). Ça évitera beaucoup de complications au niveau des permissions et vous n'aurez pas besoin de faire <code>sudo</code> pour chaque commande.</p>
<p>Nous pouvons appeler le script avec les bons périphériques en vérifiant leur ID : <code>lspci | grep -i radeon</code>.</p>
<p>Personnellement, je partage ma carte vidéo (les ID sont <code>02:00.0</code> et <code>02:00.1</code>).</p>
<div class="highlight"><pre><span></span>$ vfio-bind 0000:02:00.0 0000:02:00.1
</pre></div>
<p>Si vous n'avez pas eu de <em>segfault</em> ou de messages d'erreurs, alors tout va très bien!</p>
<h3>La machine virtuelle</h3>
<p>Pour contrôler ma VM, j'ai un deuxième clavier et une deuxième souris qui sont connectés sur des ports USB. Je peux noter leur ID pour les passer à ma VM en faisant ceci :</p>
<div class="highlight"><pre><span></span>$ lsusb <span class="p">|</span> grep -i microsoft
Bus <span class="m">002</span> Device 005: ID 093a:2510 Microsoft Corp. Wired Mouse 600
Bus <span class="m">002</span> Device 003: ID 045e:0750 Microsoft Corp. Wired Keyboard 600
</pre></div>
<p>Ensuite, il suffit d'appeler <code>qemu-system-x86_64 --enable-kvm</code> et lui ajouter les paramêtres qu'on désire. Pour pouvoir passer une carte vidéo à une VM, il faut au moins <code>-vga none</code> et ce <code>-device</code> :</p>
<div class="highlight"><pre><span></span>-vga none \
-device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1 \
</pre></div>
<p>Ensuite, on peut simplement ajouter notre carte vidéo avec le bon ID (que nous avons noté plus haut) :</p>
<div class="highlight"><pre><span></span><span class="x">-device vfio-pci,host=</span><span class="p">$</span><span class="nv">VOTRE_CARTE_VIDEO</span><span class="x">,bus=root.1,addr=00.0,multifunction=on,x-vga=on \</span>
<span class="x">-device vfio-pci,host=</span><span class="p">$</span><span class="nv">GPU_AUDIO</span><span class="x">,bus=root.1, addr=00.1</span>
</pre></div>
<p>Pour transmettre l'audio de la VM à l'hôte, vous pouvez utiliser ceci :</p>
<div class="highlight"><pre><span></span>-device ich9-intel-hda,bus=pcie.0,addr=1b.0,id=sound0 \
-device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0
</pre></div>
<p>J'ai tout rassemblé à l'intérieur d'un script pour simplifier l'appel de commande. Vous pouvez vous en inspirer :</p>
<div class="highlight"><pre><span></span><span class="ch">#!/bin/bash</span>
<span class="c1">###############################################################################</span>
<span class="c1"># Settings</span>
<span class="c1">###############################################################################</span>
<span class="c1"># VM Name</span>
<span class="nv">NAME</span><span class="o">=</span><span class="s2">"Windows"</span>
<span class="c1"># BIOS</span>
<span class="nv">SYSTEM_BIOS</span><span class="o">=</span><span class="s2">"/usr/share/qemu/bios.bin"</span>
<span class="c1"># CPU</span>
<span class="nv">CPU</span><span class="o">=</span><span class="s2">"host"</span>
<span class="nv">CORES</span><span class="o">=</span><span class="s2">"2"</span>
<span class="c1"># RAM</span>
<span class="nv">RAM</span><span class="o">=</span><span class="s2">"4096"</span>
<span class="c1"># Passthrough devices</span>
<span class="nv">GPU_RADEON</span><span class="o">=</span><span class="s2">"02:00.0"</span>
<span class="nv">GPU_AUDIO</span><span class="o">=</span><span class="s2">"02:00.1"</span>
<span class="nv">GPU_BIOS</span><span class="o">=</span><span class="s2">"/var/tmp/kvm/vgabios-gigabyte-hd5850-1024m.rom"</span>
<span class="c1"># USB Keyboard</span>
<span class="nv">USB_KBD</span><span class="o">=</span><span class="s2">"045e:0750"</span>
<span class="c1"># USB Mouse</span>
<span class="nv">USB_MOU</span><span class="o">=</span><span class="s2">"093a:2510"</span>
<span class="c1"># Networking</span>
<span class="nv">MAC_ADDR</span><span class="o">=</span><span class="s2">"ENTREZ-UNE-ADRESSE-MAC"</span>
<span class="c1"># Hard Drive</span>
<span class="nv">HD_PATH</span><span class="o">=</span><span class="s2">"/var/tmp/kvm/windows/windows.img"</span>
<span class="c1"># CD Rom</span>
<span class="nv">CD_PATH_WIN</span><span class="o">=</span><span class="s2">"CHEMIN-VERS-ISO-DE-SYSTEME-DEXPLOITATION"</span>
<span class="nv">CD_PATH_VIRTIO</span><span class="o">=</span><span class="s2">"/var/tmp/kvm/Downloads/kvirtio-win-0.1-65.iso"</span>
<span class="c1"># Execute</span>
<span class="c1">###############################################################################</span>
qemu-system-x86_64 --enable-kvm <span class="se">\</span>
-M q35 -m <span class="nv">$RAM</span> -cpu <span class="nv">$CPU</span>,hv-time -name <span class="nv">$NAME</span> <span class="se">\</span>
-smp <span class="k">$((</span><span class="nv">$CORES</span><span class="o">*</span><span class="m">2</span><span class="k">))</span>,sockets<span class="o">=</span>1,cores<span class="o">=</span><span class="nv">$CORES</span>,threads<span class="o">=</span><span class="m">1</span> <span class="se">\</span>
-bios <span class="nv">$BIOS</span> -vga none -rtc <span class="nv">base</span><span class="o">=</span>localtime,clock<span class="o">=</span>host <span class="se">\</span>
-device ioh3420,bus<span class="o">=</span>pcie.0,addr<span class="o">=</span>1c.0,multifunction<span class="o">=</span>on,port<span class="o">=</span>1,chassis<span class="o">=</span>1,id<span class="o">=</span>root.1 <span class="se">\</span>
-device piix4-ide,bus<span class="o">=</span>pcie.0,id<span class="o">=</span>ide <span class="se">\</span>
-device vfio-pci,host<span class="o">=</span><span class="nv">$GPU_RADEON</span>,bus<span class="o">=</span>root.1,addr<span class="o">=</span>00.0,multifunction<span class="o">=</span>on,x-vga<span class="o">=</span>on,rombar<span class="o">=</span>0,romfile<span class="o">=</span><span class="nv">$GPU_BIOS</span> <span class="se">\</span>
-device vfio-pci,host<span class="o">=</span><span class="nv">$GPU_AUDIO</span>,bus<span class="o">=</span>root.1, <span class="nv">addr</span><span class="o">=</span>00.1 <span class="se">\</span>
-device ich9-intel-hda,bus<span class="o">=</span>pcie.0,addr<span class="o">=</span>1b.0,id<span class="o">=</span>sound0 <span class="se">\</span>
-device hda-duplex,id<span class="o">=</span>sound0-codec0,bus<span class="o">=</span>sound0.0,cad<span class="o">=</span><span class="m">0</span> <span class="se">\</span>
-usb -usbdevice host:<span class="nv">$USB_KBD</span> -usbdevice host:<span class="nv">$USB_MOU</span> <span class="se">\</span>
-net nic,macaddr<span class="o">=</span><span class="nv">$MAC_ADDR</span>,model<span class="o">=</span>virtio -net tap,ifname<span class="o">=</span>tap0,script<span class="o">=</span>no,downscript<span class="o">=</span>no <span class="se">\</span>
-drive <span class="nv">file</span><span class="o">=</span><span class="nv">$HD_PATH</span>,id<span class="o">=</span>disk,if<span class="o">=</span>virtio <span class="se">\</span>
-drive <span class="nv">file</span><span class="o">=</span><span class="nv">$CD_PATH_WIN</span>,id<span class="o">=</span>wincd -device ide-cd,bus<span class="o">=</span>ido.0,drive<span class="o">=</span>wincd <span class="se">\</span>
-drive <span class="nv">file</span><span class="o">=</span><span class="nv">$CD_PATH_VIRTIO</span>,id<span class="o">=</span>isocd -device ide-cd,bus<span class="o">=</span>ide.1,drive<span class="o">=</span>isocd <span class="se">\</span>
-boot <span class="nv">order</span><span class="o">=</span>dc, <span class="nv">menu</span><span class="o">=</span>on
<span class="c1">###############################################################################</span>
</pre></div>
<p>Si tout fonctionne bien, votre VM démarre et vous avez de l'affichage à partir de votre deuxième carte vidéo. Vous pouvez remplacer <code>-vga none</code> par <code>-vga qxl</code> afin de partager votre clavier et souris avec l'hôte.</p>
<h2>Observations</h2>
<p>La stabilité est très bonne, tant au niveau de l'hôte que du système invité. Je peux continuer à recevoir mes courriels sur mon hôte et je peux y conserver mes travaux en cours pendant que la VM fonctionne. En utilisation, je n'ai eu aucun crash et j'ai fait fonctionner ma VM pendant plus d'une semaine sans redémarrage.</p>
<p>Voici une petit aperçu :</p>
<p><center><video id="metro_2033" class="video-js vjs-default-skin" controls preload="auto" width="640" height="400" poster="/images/kvm/kvm_metro2033.jpg" data-setup='{}'>
<source src="/videos/kvm/kvm_metro_2033_wo_audio.webm" type='video/webm'>
<source src="/videos/kvm/kvm_metro_2033_wo_audio.mp4" type='video/mp4'>
<p class="vjs-no-js">Activez JavaScript et utilisez un nagivateur décent pour voir ce vidéo HTML5.</p>
</video></p>
<p><em>Vidéo - Metro 2033 sous KVM/QEMU</em></center></p>
<p>Après avoir installé les pilotes Catalyst et le <a href="http://www.microsoft.com/en-us/download/details.aspx?id=34429">DirectX 9.0c</a>, il est possible de jouer à pratiquement n'importe quel jeu. Les plus modernes que j'ai testé sont des jeux de stratégie (RTS) : <a href="http://www.uberent.com/pa/">Planetary Annhilation</a> et <a href="http://wargame-rd.com/">Wargame Red Dragon</a>. Le tout roule sans problème majeur, toutefois ces jeux sont eux-mêmes encore en phase bêta.</p>
<p>J'ai observé des problèmes de performances avec des jeux qui utilisent le moteur d'Unreal, par exemple <a href="http://www.xcom.com/enemyunknown/">XCOM : Enemy Unknown</a> et <a href="http://borderlandsthegame.com/">Borderlands</a>. Ces jeux font appel à des registres de débogage sur le CPU et KVM ne sait pas trop quoi en faire, ce qui a un impact majeur sur les performances avec ses jeux. Toutefois, une série de patchs ont été proposés depuis mes essais et il sembleraient rectifier la situation.</p>
<h2>Conclusion</h2>
<p>Pour conclure, je crois que d'ici quelques mois, je pourrai entièrement retirer la partition NTFS de Windows 7 sur mon disque dur. Les performances sont extrêmement satisfaisantes. Contrairement à un <em>dual boot</em>, l'utilisation de machine virtuelle me permet de ne pas interrompre mon travail sur l'hôte pour aller sur Windows pendant quelques heures.</p>
<p>VIRTIO fournit des performances d'I/O très bonnes pour l'interface réseau et pour le disque dur virtuel. Dans le cas du transfert sur le réseau, c'est presque à vitesse native.</p>
<p>Je vois cette technique comme très intéressante pour plusieurs raisons :</p>
<ol>
<li>Maximisation de performance – Possible de maximiser les performances pour des jeux 3D ou pour des logiciels exigeants comme tout ce qui est CAD, Adobe Premiere, etc.</li>
<li>Intégration avec Libvirt et Virsh – Permet de gérer relativement facilement les machines virtuelles de KVM à partir de l'hôte. C'est l'idéal pour faire des tests de développement, tant développement d'applications web que locales pour tester différents environnements de travail.</li>
<li>Logiciel libre / FOSS – On peut exécuter, étudier, modifier et distribuer le code librement.</li>
</ol>
<p>Il y a quelques limitations pour l'instant :</p>
<ol>
<li>Instable / En cours de développement – Il y a souvent des mises à jours pour ces fonctionnalités, donc ce n'est pas encore souhaitable pour un déploiement dans une environnement de production.</li>
<li>Relativement complexe – Contrairement à de la virtualisation <em>desktop</em> comme Virtualbox, la technique de <em>VGA passthrough</em> pour KVM est beaucoup plus complexe. Tout d'abord, il faut une assez bonne connaissance de l’environnement Linux. Sans ça, il y a de grandes chances que des erreurs soient simplement dues à l'utilisateur. Même un <em>power user</em> Mac ou Windows aura beaucoup de lecture à faire avant de se lancer dans l'aventure. En lien avec le numéro 1, s'il faut être à l'aise pour diagnostiquer, comprendre et réparer les erreurs qui peuvent survenir. <code>/var/log</code> est une mine d'or pour ça par exemple.</li>
</ol>
<p>Enfin, c'était un projet qui m'intéressait depuis maintenant quelques années. Ma curiosité m'a amené à composer ce document pour montrer aux autres à quel point la virtualisation est un sujet captivant.</p>
<h3>Références supplémentaires :</h3>
<ul>
<li><a href="http://en.wikipedia.org/wiki/X86_virtualization">http://en.wikipedia.org/wiki/X86_virtualization</a></li>
<li><a href="http://software.intel.com/en-us/articles/intel-virtualization-technology-for-directed-io-vt-d-enhancing-intel-platforms-for-efficient-virtualization-of-io-devices">http://software.intel.com/en-us/articles/intel-virtualization-technology-for-directed-io-vt-d-enhancing-intel-platforms-for-efficient-virtualization-of-io-devices</a></li>
<li><a href="http://www.linux-kvm.org/page/VGA_device_assignment">http://www.linux-kvm.org/page/VGA_device_assignment</a></li>
<li><a href="http://kernelnewbies.org/">http://kernelnewbies.org/</a></li>
</ul>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p><a href="http://wiki.xen.org/wiki/Xen_VGA_Passthrough">http://wiki.xen.org/wiki/Xen_VGA_Passthrough</a> <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn-2">
<p><a href="http://www.linux-kvm.org/wiki/images/e/ed/Kvm-forum-2013-VFIO-VGA.pdf">Alex Williamson (2013), VGA Assignment Using VFIO (PDF)</a> <a class="footnote-backref" href="#fnref-2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn-3">
<p><a href="http://en.wikipedia.org/wiki/IOMMU">http://en.wikipedia.org/wiki/IOMMU</a> <a class="footnote-backref" href="#fnref-3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn-4">
<p><a href="http://en.wikipedia.org/wiki/X86_virtualization">http://en.wikipedia.org/wiki/X86_virtualization</a> <a class="footnote-backref" href="#fnref-4" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
</ol>
</div>Enfin en ligne!2014-06-29T00:00:00-04:002014-06-29T00:00:00-04:00Orkamungustag:gitztalk.com,2014-06-29:/posts/2014/06/29/online-at-last-fr/<p>Bonjour, je m'appelle Orkamungus et je suis un passionné de technologie.</p>
<p>J'ai fait ce site web pour partager avec les autres de l'information concernant une panoplie de sujets de technologie. Puisque je parle anglais et français, je ferai un effort pour traduire la plupart du contenu hébergé sur ce domaine …</p><p>Bonjour, je m'appelle Orkamungus et je suis un passionné de technologie.</p>
<p>J'ai fait ce site web pour partager avec les autres de l'information concernant une panoplie de sujets de technologie. Puisque je parle anglais et français, je ferai un effort pour traduire la plupart du contenu hébergé sur ce domaine. Lorsqu'une traduction est disponible, il y aura un hyperlien dans l'entête de l'article, à côté de l'auteur, la date et les étiquettes.</p>
<p>Le contenu publié ici portera sur les sujets suivants :</p>
<ul>
<li>GNU/Linux (ou simplement Linux selon votre allégeance)</li>
<li>Les logiciels open source et les logiciels libres</li>
<li>La sécurité</li>
<li>Les tendances</li>
<li>La virtualisation</li>
<li>Et tout ce qui m'échappe à l'heure actuelle</li>
</ul>
<p>Ce site est fait à partir de <a href="http://getpelican.com/">Pelican</a>. Il est toujours en construction et pourrait être modifié. Le contenu devrait survivre aux révisions esthétiques ou fonctionnelles. De plus, je ferai de mon mieux pour ne pas trop modifier la structure du site. Un jour, un engin de recherche et un système de commentaires seront disponibles.</p>
<p>Pelican est un générateur de sites statiques programmé en <a href="http://www.python.org/">Python</a>. J'ai choisi cette technologie pour construire mon site web puisqu'il offre certains avantages par rapport aux plate-formes blog plus traditionnelles (comme Wordpress et Drupal) et d'autres générateurs de sites statiques (comme Octopress). En voici quelques un :</p>
<ul>
<li>Pas de base de données MySQL puisque le site est complètement statique</li>
<li>Ne dépend pas de Ruby</li>
<li>Supporte les traductions</li>
<li>Très léger et rapide</li>
<li>Et je peux écrire le contenu avec n'importe quel éditeur de texte (Vim ou Geany) dans le format Markdown</li>
</ul>
<p>Pour rester concentré sur la rédaction, je me suis dit que je n'allais pas mettre trop de temps sur l'apparence du site. Je dois donc remercier l'auteur du <a href="https://github.com/jsliang/pelican-fresh/">thème Fresh</a>. Si je modifie ce thème, je publierai le code sur <a href="https://github.com/Orkamungus/">github</a>.</p>
<p>Pour finir, prenez le temps de vous abonner aux fils <a href="/atom.html">atom</a> ou <a href="/rss.html">rss</a> pour suivre toutes les nouvelles. Vous pouvez toujours m'envoyer un <a href="/pages/about-fr.html">courriel</a> si vous avez des inquiétudes, questions ou des obscénités à partager.</p>
<p>Des articles intéressants arriveront sous peu!</p>