Âmes sensibles, s'abstenir !
Je préfère prévenir tout de suite les plus purs d'entre vous, ce que nous allons faire risque de souiller notre OS libre. En effet, la finalité de cet article est de jouer à des jeux pleins de DRM (Steam, Uplay, Origin, etc.) dans un OS tout sauf libre : Windows 7 ! Si la phrase précédente vous a donné des nausées, passez votre chemin avant qu'il ne soit trop tard...
1. Vos contraintes : un matériel sur mesure
Qui dit lancer Windows, dit virtualisation. Le dual boot, c'est pour les pauvres ! Mais attention, ici, nous parlerons de virtualisation de première classe (comme au cinéma) : avec Xen et non pas VirtualBox ; et surtout, nous réserverons un adaptateur graphique à notre OS invité, afin d'en tirer pleinement profit.
Le concept est le suivant, avoir deux ordinateurs (sic) en un :
- Le premier ordinateur, votre ordinateur principal, tourne sous GNU/Linux (Linux Mint LMDE dans notre cas [LMDE]). Il possède sa propre carte graphique (intégrée à la carte mère), sa propre carte son (intégrée à la CM), son clavier et sa souris. Enfin, l'affichage se fait via la source DVI du moniteur.
- Le second ordinateur, sous Windows 7, possède sa propre carte graphique, un monstre ATI HD branché sur le port PCI express, sa carte son dédiée (via la sortie casque du moniteur), son clavier et sa souris (les mêmes qu'au-dessus, nous verrons plus bas comment). Enfin, l'affichage se fait via la source HDMI du moniteur.
Mais il est fou ?! Je ne veux pas avoir autant de matos, autant acheter deux PC ! En fait, je vous rassure, en choisissant bien son matériel, il n'y aura pas à doubler les équipements. Profitons juste des dernières technologies et utilisons-les intelligemment.
Tout d'abord, la carte mère. Cette dernière doit absolument gérer les instructions VT-d (et non pas uniquement VT-x). C'est le cas de la plupart des cartes mères récentes (pour CPU Intel) avec des chipsets Z77 ou H77. Les cartes mères pour processeurs AMD, quant à elles, doivent supporter la technologie IOMMU. Plus d'informations sur le matériel supporté dans les références [MATOS].
Ensuite, le processeur. Côté Intel, vous devez avoir un processeur lui aussi compatible VT-d. Regardez sur le site Intel, très bien fait [CPU_INTEL]. En gros, fuyez les processeurs série « K » spécial overclocking, ces derniers ne possèdent pas les instructions VT-d et coûtent plus cher. Côté AMD, c'est un peu plus restrictif, mais vous pouvez jeter un œil ici : [MATOS]
Ajoutez à cela une carte graphique gamer. Je vous recommande très fortement d'aller voir du côté de chez ATI/AMD. En effet, leurs cartes fonctionnent directement pour l'utilisation que nous allons en faire, alors que du côté de Nvidia, il va falloir jouer avec le BIOS de la carte, appliquer des patchs, recompiler des paquets, etc. Encore une fois, n'hésitez pas à consulter la liste du matériel supporté [MATOS].
Autre élément important, un switch/kvm USB avec gestion de l'audio. Il s'agit d'un petit boîtier en plastique qui coûte une vingtaine d'euros et va vous permettre de connecter votre clavier et votre souris dessus. À la simple pression d'un bouton sur ce fameux boîtier, vous basculerez votre clavier/souris et système audio d'un OS vers l'autre.
Enfin, et pour être complet, il vous faudra un moniteur avec une entrée DVI (ou VGA) et une entrée HDMI, ainsi qu'une sortie audio (prise casque).
2. Votre première tâche : installer Xen
Je pars du principe que vous me faites une confiance aveugle et avez par conséquent formaté votre disque afin d'y installer une Linux Mint LMDE 64bits toute fraîche, puis mis à jour vos paquets via cette commande :
sudo apt-get update && sudo apt-get dist-upgrade
Très bien, commençons !
Il faut installer l'hyperviseur Xen :
sudo apt-get install xen-linux-system-amd64
Puis, nous ajoutons la ligne suivante dans le fichier de configuration de GRUB (/etc/default/grub) :
GRUB_CMDLINE_XEN="iommu=1 dom0_mem=2048M"
avec dom0_mem correspondant à la quantité de mémoire que vous voulez allouer à votre système hôte.
« dom0 » est le nom donné par Xen au système hôte. Dans notre cas, le système hôte sera Linux Mint LMDE, et le système invité (ou « domU » dans la jargon Xen) sera Windows 7.
Dans ce même fichier, modifiez aussi la première ligne afin de booter en priorité sous Xen, cf. le fichier modifié :
GRUB_DEFAULT="Xen 4.1-amd64"
# GRUB_HIDDEN_TIMEOUT=0
# GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nomodeset"
GRUB_CMDLINE_LINUX=""
GRUB_CMDLINE_XEN="iommu=1 dom0_mem=2048M"
Ensuite, il faut mettre à jour GRUB :
sudo update-grub
et redémarrer votre machine.
Assurez-vous de bien avoir activé l'option « VT-d » ou « IOMMU » dans le BIOS de votre carte mère !
3. Votre seconde mission : configurer Xen
Vous devriez maintenant être sous Xen. Pour le vérifier, tapez :
sudo xm list
Name ID Mem VCPUs State Time(s)
Domain-0 0 11233 4 r----- 12236.5
Le « network-manager » est un programme assez infâme, il n'en fait qu'à sa tête et je vous conseille de le désactiver pour éviter les mauvaises surprises :
sudo /etc/init.d/network-manager stop && sudo update-rc.d network-manager disable
Une fois court-circuité, configurons nos interfaces « à la mano », comme les vrais Linuxiens que nous sommes. Dans le fichier /etc/network/interfaces, entrez les informations suivantes pour obtenir une IP via le DHCP et ajouter un « pont » nommé xenbr0, qui servira de lien entre l'OS invité et l'OS hôte :
#This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
auto xenbr0
iface xenbr0 inet dhcp
bridge_ports eth1
Attention à bien utiliser votre interface : eth0, eth1, wlan0, etc.
Pour prendre en compte les changements, nous relançons le service de réseau :
sudo /etc/init.d/networking restart
et nous vérifions la présence de l'interface xenbr0 avec la commande :
ip addr
xenbr0 devrait être visible et avoir une IP valide.
Il faut aussi ajouter quelques liens symboliques pour régler de petits problèmes :
sudo ln -s /usr/lib /usr/lib64
sudo ln -s /usr/lib/xen-4.1 /usr/xen-default
Voilà, Xen est configuré ! Attaquons-nous maintenant à la configuration de notre domU Windaube 7.
4. Encore une mission pour vous : configurer votre domU
Avant toute chose, faisons un point sur l'installation matérielle de votre super PC. Vous utilisez actuellement la carte graphique intégrée à la carte mère. Cette dernière est connectée en DVI à votre moniteur, et la sortie son utilisée est celle de la carte mère. Votre carte graphique de gamer est branchée en HDMI sur votre écran, mais vous ne l'utilisez pas pour le moment. Nous reparlerons plus tard du branchement du KVM.
Il faut déterminer le numéro identifiant la carte graphique « gamer ». Pour ce faire :
lspci | grep -i vga
00:02.0 VGA compatible controller: Intel Corporation Xeon E3-1200 v2/3rd Gen Core processor Graphics Controller (rev 09)
01:00.0 VGA compatible controller: Advanced Micro Devices [AMD] nee ATI Tahiti PRO [Radeon HD 7950]
Il y a deux résultats, c'est normal, puisque nous avons deux cartes graphiques. La carte qui nous intéresse est le modèle AMD, donc obtenons plus de détails sur cette dernière :
lspci | grep 01:00.
01:00.0 VGA compatible controller: Advanced Micro Devices [AMD] nee ATI Tahiti PRO [Radeon HD 7950]
01:00.1 Audio device: Advanced Micro Devices [AMD] nee ATI Tahiti XT HDMI Audio [Radeon HD 7970 Series]
Nous découvrons finalement 2 ID qui sont 01:00.0 et 01:00.1, notez-les bien !
Le fonctionnement des ID PCI est relativement simple, ils sont de la forme :
bus:device.function
Ici, le premier 01 veut dire que notre carte est dans le premier emplacement (en partant du haut) PCI express ; le second groupe de chiffres 00 correspond à l'objet physique : la carte AMD ; enfin, le dernier 0 ou 1, correspond à la fonction : d'un côté l'affichage et de l'autre la partie audio via HDMI.
Maintenant, il faut s'occuper du KVM. C'est très simple en pratique, mais un peu plus compliqué à expliquer avec des mots. Il va falloir réfléchir un peu et brancher plein de câbles.
Un KVM possède beaucoup de ports ! 2 USB en entrée, 2 USB en sortie, 2 audio en entrée et 1 audio en sortie (pour ce qui nous intéresse) [KVM].
Il va falloir relier deux ports USB de la tour vers les deux entrées USB du KVM. Mais attention, les ports USB doivent être des devices différents (cf. explication des PCI ID ci-dessus). En effet, l'un de ces devices USB ne sera plus utilisable sous votre dom0 : comme votre carte graphique gamer, il sera dédié au domU.
Pour faire simple, je vous conseille d'utiliser un des ports USB tout en haut du PC (ceux traditionnellement réservés aux claviers/souris) et un des ports USB proches de la prise Ethernet de votre carte mère.
Pour trouver facilement les ID, passez par l'outil « System profiler and benchmark » qui se trouve dans le menu de votre LMDE. Branchez votre clavier sur un groupe de ports USB sus-mentionnés, et notez son PCI ID de la forme XX:YY.Z ; ensuite, débranchez le clavier et branchez-le sur un autre groupe de ports USB. Notez à nouveau l'ID et branchez votre KVM dans les bons ports.
Pour référence, j'utilise les ports en haut de ma carte mère pour le PC2 (PCI ID = 00:1d.0) (donc le domU) et celui proche du contrôleur Ethenet pour mon dom0 (ce device contrôle aussi les ports en façade, que je veux garder utilisables au sein de mon dom0). Côté audio, ma carte son intégrée à la carte mère se branche dans l'entrée audio du KVM pour le PC1, et l'entrée audio du KVM pour le PC2 va dans la prise casque du moniteur.
Ouf ! C'est fini pour les branchements. Une fois les PCI ID déterminés, on reprend les lignes de commandes. Créez le fichier suivant :
vim /etc/xen/pciback.conf
# This file contains the list of pci devices the pciback driver should bind
# to at system startup.
# Please provide the devices in long BDF notation.
# Example:
# 0000:08:00.0
# NO EMPTY LINES!
#
0000:01:00.0 # carte graphique
0000:01:00.1 # partie audio via HDMI de la carte graphique
0000:00:1d.0 # port USB du KVM relié au PC2
Attention à la notation des PCI ID qui doit se faire sous leur forme longue : ajoutez « 0000: » devant ce que vous aviez noté.
Ensuite, il faut créer un script de démarrage afin de « cacher » ces 3 périphériques pour que le dom0 ne s'en serve pas directement :
vim /etc/init.d/pciback
# X-Start-Before: xend
# X-Stop-After:
# Default-Start: 2 3 4 5
# Default-Stop:
### END INIT INFO
. /lib/lsb/init-functions
scriptname=/etc/init.d/pciback
configfile=/etc/xen/pciback.conf
unbind() {
# Unbind a PCI function from its driver as necessary
[ ! -e /sys/bus/pci/devices/$1/driver/unbind ] || \
echo -n $1 > /sys/bus/pci/devices/$1/driver/unbind
}
bind() {
# Add a new slot to the PCI Backend’s list
echo -n $1 > /sys/bus/pci/drivers/pciback/new_slot
# Now that the backend is watching for the slot, bind to it
echo -n $1 > /sys/bus/pci/drivers/pciback/bind
}
case $1 in
start)
cat $configfile | while read line;do
echo $line | grep ^# >/dev/null 2>&1 && continue
unbind $line
bind $line
done
;;
stop|status|restart|force-reload)
# As we don’t know which driver was bound before, there is not much we can do here
;;
*)
echo “Usage: $scriptname start” >&2
Il faut rendre ce script exécutable et le démarrer juste après le lancement de xend durant le boot de notre hyperviseur Xen :
sudo chmod +x /etc/init.d/pciback && sudo update-rc.d pciback defaults 21 19
Enfin, ajoutez la ligne suivante dans le fichier /etc/modules :
xen-pciback passthrough=1
Redémarrez et vérifiez que vos périphériques sont bien réservés pour votre domU :
sudo xm pci-list-assignable-devices
0000:01:00.0
0000:01:00.1
0000:00:1d.0
5. La fin approche...
Voici le fichier de configuration de notre domU [CONF_FILES] :
cat domUs/win7.cfg
kernel = "hvmloader"
builder='hvm'
memory = 12288
# set your memory however you want. 4G is enough for me, and i want the
# rest for the host and the other VM
name = "win7"
vcpus=3
pae=1
acpi=1
apic=1
vif = [ 'type=netfront, mac=00:16:3e:68:b2:12,bridge=xenbr0, model=e1000' ]
disk = [ 'phy:/dev/mapper/guest-sys7,hda,w', 'phy:/dev/mapper/guest-win7,hdb,w', 'file:/home/nesousx/Isos/Win_7_Pro_x64.iso,hdc:cdrom,r' ]
device_model = 'qemu-dm'
boot="dc" # ordre de boot dc au début pour booter sur l'iso d'installation ensuite c tout court.
sdl=0
opengl=1
vnc=1
vncpasswd=''
vncconsole=1 # permet de lancer directement vnc viewer
stdvga=0
serial='pty'
tsc_mode=0
soundhw='all'
usb=1
usbdevice='mouse'
gfx_passthru=0
pci=[ '01:00.0', '01:00.1' , '00:1d.0' ]
localtime=1
N'oubliez pas d'ajuster selon vos besoins, l'adresse, le nombre de cores (vcpus), la quantité de mémoire (memory), l'adresse MAC dans la ligne vif, et les chemins d'accès du disque que vous voulez utiliser, ainsi que l'emplacement du fichier d'installation [ISO_WIN7], et les numéros de vos PCI ID.
Notez que j'utilise LVM comme système de stockage. C'est la méthode donnant les meilleures performances. Je ne vais pas revenir sur l'utilisation de LVM, cela a déjà été très bien traité dans Linux Pratique et GNU/Linux Magazine.
Afin de pouvoir suivre l'installation de votre domU, vous devez installer VNC Viewer :
sudo apt-get install vncviewer
6. Après tant d'attente, l'installation et les redémarrages de Windows 7
Vous voilà prêt à démarrer l'installation de votre domU :
sudo xm create domUs/win7.cfg
Une fenêtre VNC Viewer devrait s'ouvrir et l'installation de Windows 7 devrait débuter. Procédez comme d'habitude sous cet OS : sans lire et en cliquant sur « Next » « Next » « Next ». L'installation se termine au bout de plusieurs redémarrages (Windows...). Si VNC Viewer se ferme (il se fermera), relancez-le :
vncviewer localhost
Une fois enfin arrivé sur le Bureau de Windows, vous allez pouvoir installer les pilotes propriétaires de votre carte graphique et... redémarrer. Après le chargement du logo Windows, l'écran devrait rester noir, c'est bon signe ! Changez la source de votre moniteur pour sélectionner HDMI et vous devriez avoir un joli Bureau Windows sous les yeux. Vous utilisez désormais votre carte ATI sous Linux ! Si vous n'avez pas de souris, ni de clavier, c'est que vous avez oublié d'appuyer sur le bouton de votre KVM.
Dernière petite étape : afin d'augmenter les performances et d'avoir les bons pilotes pour les éléments paravirtualisés de Xen, installez les pilotes GPL PV [GPLPV].
Voilà, vous y êtes arrivé ! Vous pouvez à nouveau jouer à en faire craquer votre facture d'électricité, sans avoir à dual booter.
Dernier petit point, cet article arrive quelques mois après la sortie de Steam Linux et certains d'entre vous trouveront peut-être dommage d'utiliser une machine virtuelle pour jouer sous Steam. Ceci dit, n'oubliez pas que Steam Linux n'est compatible à l'heure actuelle qu'avec un nombre très restreint de jeux, là où la machine que nous venons de monter se comportera exactement comme un PC sous Windows vendu en supermarché (ou ailleurs).
Remerciements
Les internets, les moteurs de recherche et un très bon fil de discussion dont je me suis fortement inspiré pour mettre en place ce système [CESAR] et vous le décrire par la suite.
Références
[LMDE] http://www.linuxmint.com/download_lmde.php
[INTEL] http://ark.intel.com/
[MATOS] http://wiki.xen.org/wiki/VTd_HowTo
[CONF_FILES] https://github.com/Nesousx/xen
[KVM] http://www.asciiflow.com/#Draw2234936168077638856
[ISO_WIN7] http://www.mydigitallife.info/official-windows-7-sp1-iso-from-digital-river/
[GPLPV] http://wiki.univention.de/index.php?title=Installing-signed-GPLPV-drivers
[CESAR] http://forums.linuxmint.com/viewtopic.php?f=42&t=112013