1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
|
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
"http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
<chapter id="TechnicalBackground">
<title>Sous-bassements techniques</title>
<para>Le contenu de ce chapitre n'est pas indispensable pour utiliser
VirtualBox avec succès. Nous indiquons ce qui suit à titre informatif pour
ceux qui sont plus familiers de la technologie et de l'architecture informatique
et qui veulent en savoir davantage sur la manière fonctionne VirtualBox "sous
le capeau".</para>
<sect1 id="vboxconfigdata">
<title>Où VirtualBox stocke ses fichiers</title>
<para>Dans VirtualBox, une machine virtuelle et ses paramètres sont
déscrits dans un fichier de paramètres de la machine virtuelle, au format
XML. De plus, la plupart des machines virtuelles ont un ou plusieurs
disques durs qui leur sont en général présentés par des images de disque
(comme au format VDI). L'endroit où sont stockés tous ces fichiers
dépend de la version de VirtualBox qui a créé la machine.</para>
<sect2>
<title>Machines créées par VirtualBox version 4.0 ou supérieur</title>
<para>À partir de la version 4.0, par défaut, chaque machine virtuelle
dispose d'un répertoire sur votre ordinateur hôte (où tous les fichiers
de cette machine sont stockés -- le fichier des paramètres XML (avec une
extension de fichier <computeroutput>.vbox</computeroutput>) et ses
images de disque.</para>
<para>Par défaut, ce "dossier machine" se trouve dans un dossier ordinaire
appelé "VirtualBox VMs", créé par VirtualBox dans le dossier personnel
de l'utilisateur du système actuel. L'emplacement de ce répertoire personnel
dépend des conventions du système d'exploitation hôte :</para>
<itemizedlist>
<listitem>
<para>Sur Windows, il s'agit de
<computeroutput>%HOMEDRIVE%%HOMEPATH%</computeroutput>; en général
quelque chose comme <computeroutput>C:\Documents and
Settings\NomUtilisateur\</computeroutput>.</para>
</listitem>
<listitem>
<para>Sur Mac OS X, il s'agit de
<computeroutput>/Users/nomutilisateur</computeroutput>.</para>
</listitem>
<listitem>
<para>Sur Linux et Solaris, il s'agit de
<computeroutput>/home/nomutilisateur</computeroutput>.</para>
</listitem>
</itemizedlist>
<para>Par simplicité, nous abrègerons cela ci-dessous par
<computeroutput>$HOME</computeroutput>. En utilisant cette convention, le
dossier ordinaire de toutes les machines virtuelles est
<computeroutput>$HOME/VirtualBox VMs</computeroutput>.</para>
<para>Par exemple, quand vous créez une machine virtuelle qui s'appelle
"VM Exemple", vous verrez que VirtualBox crée<orderedlist>
<listitem>
<para>le dossier <computeroutput>$HOME/VirtualBox VMs/VM Exemple/</computeroutput>
et, dans ce dossier,</para>
</listitem>
<listitem>
<para>le fichier des paramètres <computeroutput>VM Exemple.vbox</computeroutput> et</para>
</listitem>
<listitem>
<para>l'image de disque virtuel <computeroutput>VM Example.vdi</computeroutput>.</para>
</listitem>
</orderedlist></para>
<para>C'est le rangement par défaut si vous utilisez l'assistant "Créer
une nouvelle machine virtuelle" comme décrit au <xref linkend="gui-createvm" />. Une fois que
vous commencez à travailler avec la VM, des fichiers supplémentaires
apparaîtront : vous trouverez des fichiers journaux dans un
sous-dossier qui s'appelle
<computeroutput>Logs</computeroutput>, and une fois que vous aurez pris
des instantanés, ils apparaîtront dans un sous-dossier
<computeroutput>Snapshots</computeroutput>. Pour chaque VM, vous pouvez
modifier l'emplacement de son dossier d'instantanés dans les paramètres
de la VM.</para>
<para>Vous pouvez changer le dossier machine par défaut en sélectionnant
"Préférences" du menu "Fichier" de la fenêtre principale de VirtualBox.
Puis, dans la fenêtre qui apparaît, cliquez sur l'onglet "Général". Sinon,
utilisez <computeroutput>VBoxManage setproperty
machinefolder</computeroutput> ;; voir le <xref
linkend="vboxmanage-setproperty" />.</para>
</sect2>
<sect2>
<title>Machines créées par des versions de VirtualBox antérieures à 4.0</title>
<para>Si vous avez mis à jour vers VirtualBox 4.0 en partant d'une ancienne
version de VirtualBox, vous aurez probablement vos fichiers de paramètres
et les disques selon l'organisation du szstème de fichiers d'alors.</para>
<para>Avant la version 4.0, VirtualBox séparait les fichiers des
paramètres de la machine des images de disque virtuel. Les fichiers de
paramétrages de la machine avaient une extension
<computeroutput>.xml</computeroutput> et se trouvaient dans un dossier
appelé "Machines" dans le répertoire de configuration global de VirtualBox
(voir la prochaine section). Donc, par exemple, sur Linux, il s'agissait
du répertoire caché <computeroutput>$HOME/.VirtualBox/Machines</computeroutput>.
Le dossier par défaut des disques durs s'appelait "HardDisks" et se trouvait
également dans le dossier <computeroutput>.VirtualBox</computeroutput>.
L'utilisateur pouvait changer les deux endroits dans les préférences
globales (le concept de "dossier par défaut des disques durs" a été
abandonné avec VirtualBox 4.0, vu que les images de disque se trouvent
désormais par défaut dans le dossier de chaque machine.)</para>
<para>L'ancienne organisation avait plusieurs gros inconvénients.<orderedlist>
<listitem>
<para>Il était très difficile de déplacer une machine virtuelle
d'un hôte à l'autre car les fichiers concernés ne se trouvaient pas
dans le même dossier. De plus, les médias virtuels de toutes les
machines étaient enregistrés avec un registre global dans le
fichier des paramètres transversaux de VirtualBox.
(<computeroutput>$HOME/.VirtualBox/VirtualBox.xml</computeroutput>).</para>
<para>Pour déplacer une machine sur un autre hôte, il n'était donc
pas suffisant de déplacer le fichier des paramètres XML et les images
de disque (qui se trouvaient à des endroits différents), mais
il fallait en plus copier méticuleusement les entrées du disque
dur à partir du XML du registre de médias global, ce qui était
presqu'impossible si la machine avait des instantanés et, donc, des
images de différenciation.</para>
</listitem>
<listitem>
<para>Le stockage des images de disque virtuel, qui peuvent beaucoup
grossir, sous le répertoire caché
<computeroutput>.VirtualBox</computeroutput> (au moins sur les hôtes
Linux et Solaris) amenait de nombreux utilisateurs à se demander
ce qu'était devenu leur espace disque.</para>
</listitem>
</orderedlist></para>
<para>Si les nouvelles VMs créées avec VirtualBox 4.0 ou supérieur
respecteront la nouvelle organisation, pour une compatibilité maximum, les
anciennes VMs <emphasis>ne sont pas</emphasis> converties en nouvelle
organisation. Sans cela, les paramètres de la machine seraient immanquablement
cassés si l'utilisateur rétrogradait de la 4.0 à une version plus ancienne
de VirtualBox.</para>
</sect2>
<sect2>
<title>Données globales de configuration</title>
<para>Outre les fichiers des machines virtuelles, VirtualBox gère des
données globales de configuration. Sur Linux et Solaris, depuis as of VirtualBox 4.3
elles se trouvent dans le répertoire caché <computeroutput>$HOME/.config/VirtualBox</computeroutput>
même si <computeroutput>$HOME/.VirtualBox</computeroutput> sera utilisé
s'il existe pour rester compatible avec les anciennes versions ; sur
un Mac, elles se trouvent
dans <computeroutput>$HOME/Library/VirtualBox</computeroutput>.</para>
<para>VirtualBox crée automatiquement ce répertoire de configuration si
nécessaire. Vous pouvez éventuellement fournir un répertoire de configuration
alternatif en réglant la variable d'environnement
<computeroutput><literal>VBOX_USER_HOME</literal></computeroutput> ou,
en plus, sur Linux ou Solaris, en utilisant la variable standard
<computeroutput><literal>XDG_CONFIG_HOME</literal></computeroutput> (car le
fichier des paramètres globaux de <computeroutput>VirtualBox.xml</computeroutput>
pointe vers tous les autres fichiers de configuration, ce qui permet
de naviguer entre plusieurs configurations de VirtualBox.</para>
<para>VirtualBox stocke essentiellement dans ce répertoire son fichier
de paramètres globaux, un autre fichier XMK appelé
<computeroutput>VirtualBox.xml</computeroutput>. Cela comprend des
options de configuration globales et la liste des machines virtuelles
enregistrées avec des pointeurs vers leurs fichiers de paramètres XML.
Ni l'emplacement du fichier ni son répertoire n'ont changé avec
VirtualBox 4.0.)</para>
<para>Avant VirtualBox 4.0, tous les médias virtuels (fichiers images
de disque) étaient également stockés dans un registre global de ce
fichier de paramètres. Par compatibilité, ce registre de médias existe
toujours si vous mettez à jour VirtualBox et s'il y a des médias
issus de machines créées avec une version inférieure à 4.0. Si vous
n'avez pas de telles machines, ce ne sera pas des retistres de médias
globaux ; avec VirtualBox 4.0, chaque fichier XML d'une machine a
son propre registre de médias.</para>
<para>De même, avant VirtualBox 4.0, le dossier "Machines" par défaut
et le dossier "HardDisks" par défaut se trouvaient dans le répertoire de
configuration de VirtualBox (par exemple, <computeroutput>$HOME/.VirtualBox/Machines</computeroutput>
sur Linux). Si vous mettez à jour à partir d'une version de VirtualBox
inférieure à la 4.0, les fichiers de ce répertoire ne sont pas déplacés
automatiquement afin de ne pas casser la rétro compatibilité.</para>
</sect2>
<sect2>
<title>Résumé des des modifications de la configuration de 4.0</title>
<table>
<title>ignoreme</title>
<tgroup cols="3">
<tbody>
<row>
<entry></entry>
<entry><emphasis role="bold">Avant 4.0</emphasis></entry>
<entry><emphasis role="bold">4.0 ou supérieur</emphasis></entry>
</row>
<row>
<entry>Dossier par défaut des machines</entry>
<entry><computeroutput>$HOME/.VirtualBox/Machines</computeroutput></entry>
<entry><computeroutput>$HOME/VirtualBox
VMs</computeroutput></entry>
</row>
<row>
<entry>Emplacement des images de disque</entry>
<entry><computeroutput>$HOME/.VirtualBox/HardDisks</computeroutput></entry>
<entry>In each machine's folder</entry>
</row>
<row>
<entry>Extension des fichiers de paramètres de la machine</entry>
<entry><computeroutput>.xml</computeroutput></entry>
<entry><computeroutput>.vbox</computeroutput></entry>
</row>
<row>
<entry>Registre de médias</entry>
<entry>Fichier <computeroutput>VirtualBox.xml</computeroutput>
global</entry>
<entry>Chaque fichier des paramètres d'une machine</entry>
</row>
<row>
<entry>Enregistrement des médias</entry>
<entry>Ouverture/fermeture explicite obligatoire</entry>
<entry>Automatique après la connexion</entry>
</row>
</tbody>
</tgroup>
</table>
</sect2>
<sect2>
<title>Fichiers XML de VirtualBox</title>
<para>VirtualBox utilise l'XML tant pour les fichiers des paramètres
de la machine que pour le fichier de configuration global,
<computeroutput>VirtualBox.xml</computeroutput>.</para>
<para>Tous les fichiers XML de VirtualBox sont versionnés. Quand un nouveau
fichier de paramètres est créé (par exemple parce qu'on crée une nouvelle
machine virtuelle), VirtualBox utilise automatiquement le format des
paramètres de la version actuelle de VirtualBox. Il se peut que ces
fichiers ne soient pas lus si vous rétrogradez à une version plus
ancienne de VirtualBox. Cependant, quand VirtualBox rencontre un fichier
de paramètres d'une ancienne version (comme après une mise à jour de
VirtualBox), il essaie autant que possible de garder le format des
paramètres. Il ne mettra à jour en silence les fichiers des paramètres
que si les paramètres actuels ne peuvent pas être exprimés dans l'ancien
format, par exemple parce que vous avez activé une fonction qui n'était
pas présente dans l'ancienne version de VirtualBox.<footnote>
<para>Par exemple, avant VirtualBox 3.1, il n'était possible que d'activer
ou de désactiver un seul lecteur DVD dans une machine virtuelle.
S'il a été activé, cela serait toujours possible sur le deuxième
maître du contrôleur IDE. Avec VirtualBox 3.1, on peut connecter
des lecteurs DVD à un slot de son choix sur un contrôleur de son choix,
donc ils pourraient être sur le deuxième esclave d'un contrôleur IDE
ou sur un slot SATA. Si vous avez un fichier de paramètres d'une
machine d'une ancienne version et si vous mettez à jour
VirtualBox vers la 3.1 et si vous déplacez le lecteur DVD de sa
position par défaut, on ne peut pas l'exprimer dans l'ancien format
des paramètres ; le fichier XML de la machine serait écrit dans
le nouveau format et une copie de sauvegarde de l'ancien format serait
gardée.</para>
</footnote> Dans ces cas-là, VirtualBox sauvegarde le fichier des anciens
paramètres dans le répertoire de configuration de la machine virtuelle.
Si vous avez besoin de revenir à une ancienne version de VirtualBox,
vous devrez recopier à la main ces fichiers de sauvegarde.</para>
<para>Nous ne documentons volontairement pas les spécifications des fichiers
XML de VirtualBox car nous nous réservons le droit de les modifier à l'avenir.
Nous vous suggérons donc fortement de ne pas éditer ces fichiers à la main.
VirtualBox offre un accès complet à ses données de configuration par son
outil en ligne de commande <computeroutput>VBoxManage</computeroutput>
(voir le <xref linkend="vboxmanage" />) et son API (voir le <xref
linkend="VirtualBoxAPI" />).</para>
</sect2>
</sect1>
<sect1 id="technical-components">
<title>Exécutables et composants de VirtualBox</title>
<para>VirtualBox a été conçu pour être modulaire et flexible. Quand on ouvre
l'interface graphique (GUI) de VirtualBox et qu'on démarre une VM,
au moins trois processus fonctionnent :<orderedlist>
<listitem>
<para><computeroutput>VBoxSVC</computeroutput>, le processus du service
de VirtualBox qui fonctionne toujours en tâche de fond. Ce processus
est lancé automatiquement par le processus du premier client
VirtualBox (la GUI, <computeroutput>VBoxManage</computeroutput>,
<computeroutput>VBoxHeadless</computeroutput>, le service web ou
autres) et il s'arrête peu de temps après que le dernier client a
quitté. Le service est responsable d'archiver, maintenir l'état de
toutes les VMS et de la communication entre les composants de VirtualBox.
Cette communication est implémentée via COM/XPCOM.<note>
<para>Quand nous parlons de "clients" ici, nous voulons dire
les clients locaux d'un processus serveur
<computeroutput>VBoxSVC</computeroutput> en particulier, pas les
clients sur un réseau. VirtualBox utilise son propre concept
client/serveur pour permettre à ses processus de coopérer, mais
tous ces processus tournent sous le même compte utilisateur du
système d'exploitation hôte, et c'est entièrement transparent
pour l'utilisateur.</para>
</note></para>
</listitem>
<listitem>
<para>Le processus de la GUI,, <computeroutput>VirtualBox</computeroutput>,
une application client basée sur la bibliothèque multiplateformes
Qt. Lancée sans l'option <computeroutput>--startvm</computeroutput>,
cette application agit comme un gestionnaire de VirtualBox, en
affichant les VMs et leurs paramètres. Elle communique alors les
paramètres et les changements d'état à <computeroutput>VBoxSVC</computeroutput>
et elle répercute les changements subis par d'autres moyens comme
<computeroutput>VBoxManage</computeroutput>.</para>
</listitem>
<listitem>
<para>Si on lance l'application client <computeroutput>VirtualBox</computeroutput>
avec l'argument <computeroutput>--startvm</computeroutput>, elle
charge la bibliothèque VMM qui inclut l'hyperviseur proprement dit
et qui lance une machine virtuelle et offre une entrée et une sortie
à l'invité.</para>
</listitem>
</orderedlist></para>
<para>Toutes les interfaces de VirtualBox (client) communiqueront avec le
processus du service et elles peuvent contrôler et répercuter l'état actuel.
Par exemple, tant le selecteur de VM que la fenêtre de VM ou VBoxManage peuvent
être utilisés pour mettre en pause la VM en fonction, les autres composants
reflèteront toujours le changement d'état.</para>
<para>La GUI de VirtualBox n'est qu'une des nombreuses interfaces (client)
disponibles. La liste complète comprise dans VirtualBox est :<orderedlist>
<listitem>
<para><computeroutput>VirtualBox</computeroutput>, l'interface Qt
implémentant le gestionnaire et les VMS en fonction ;</para>
</listitem>
<listitem>
<para><computeroutput>VBoxManage</computeroutput>, une alternative
moins conviviale mais plus puissante, décrite au <xref
linkend="vboxmanage" />.</para>
</listitem>
<listitem>
<para><computeroutput>VBoxSDL</computeroutput>, une interface graphique
simple basée sur la bibliothèque SDL ; voir <xref
linkend="vboxsdl" />.</para>
</listitem>
<listitem>
<para><computeroutput>VBoxHeadless</computeroutput>, une interface de
VM qui ne fournit pas directement de sortie graphiqke et d'entrée
clavier/souris,
mais qui permet une redirection par VirtualBox Remote Desktop Extension;
voir <xref linkend="vboxheadless" />.</para>
</listitem>
<listitem>
<para><computeroutput>vboxwebsrv</computeroutput>, le processus du
service web de VirtualBox qui permet de contrôler un hôte VirtualBox à
distance. Ceci est décrit en détails dans le manuel de référence
du VirtualBox Software Development Kit (SDK) ; merci de voir le
<xref linkend="VirtualBoxAPI" /> pour des détails.</para>
</listitem>
<listitem>
<para>Le shell Python de VirtualBox, une alternative en Python à
VBoxManage. Elle est aussi décrite dans le manuel de référence du SDK.</para>
</listitem>
</orderedlist></para>
<para>En interne, VirtualBox consiste beaucoup plus d'interfaces
séparées. Vous pourriez les rencontrer en analysant les messages d'erreur
internes ou les fichiers journaux. Parmi elles, on compte :</para>
<itemizedlist>
<listitem>
<para>IPRT, une bibliothèque d'exécution portable qui forme une couche
d'abstraction d'accès aux fichiers, du filage (threading), la manipulation
de chaînes, etc. Chaque fois que VirtualBox accède aux fonctions du
système hôte, il le fait via cette bibliothèque pour une portabilité
multiplateformes.</para>
</listitem>
<listitem>
<para>VMM (Virtual Machine Monitor), le cœur de l'hyperviseur.</para>
</listitem>
<listitem>
<para>EM (Execution Manager), contrôle l'exécution d'un code invité.</para>
</listitem>
<listitem>
<para>REM (Recompiled Execution Monitor), fournit une émulation logicielle
des instructions du processeur.</para>
</listitem>
<listitem>
<para>TRPM (Trap Manager), intercepte et traite les traps et les
exceptions de l'invité.</para>
</listitem>
<listitem>
<para>HWACCM (Hardware Acceleration Manager), offre un support pour
VT-x et AMD-V.</para>
</listitem>
<listitem>
<para>PDM (Pluggable Device Manager), une interface abstraite entre le
VMM et les périphériques émulés qui sépare lese implémentations du
périphérique de l'intérieur du VMM et qui facilite l'ajout de nouveaux
périphériques émulés. Par PDM, des développeurs tiers peuvent ajouter
de nouveaux périphériques virtuels à VirtualBox, sans devoir modifier
VirtualBox lui-même.</para>
</listitem>
<listitem>
<para>PGM (Page Manager), un composant contrôlant la pagination de
l'invité.</para>
</listitem>
<listitem>
<para>PATM (Patch Manager), corrige le code de l'invité pour améliorer
et accélérer la virtualisation logicielle.</para>
</listitem>
<listitem>
<para>TM (Time Manager), gère les horloges et tous les aspects de l'heure
des invités.</para>
</listitem>
<listitem>
<para>CFGM (Configuration Manager), fournit une structure arborescente
qui garde les paramètres de configuration de la VM et tous les périphériques
émulés.</para>
</listitem>
<listitem>
<para>SSM (Saved State Manager), enregistre et charge l'état d'une VM.</para>
</listitem>
<listitem>
<para>VUSB (Virtual USB), une couche USB qui sépare les contrôleurs USB
émulés des contrôleurs de l'hôte et des périphériques USB ; ceci
active également l'USB distant.</para>
</listitem>
<listitem>
<para>DBGF (Debug Facility), un débogueur de VM intégré.</para>
</listitem>
<listitem>
<para>VirtualBox émule un certain nombre de périphériques pour offrir
l'environnement matériel dont ont besoin divers invités. La plupart de
ces périphériques standards se trouvent dans beaucoup de machines
compatibles PC et sont largement supportés par les systèmes d'exploitation
invités. Pour les périphériques réseaux et de stockage en particulier,
il existe plusieurs options pour que les périphériques émulés accèdent
au matériel sous-jacent. Ces périphériques sont gérés par
PDM.</para>
</listitem>
<listitem>
<para>Les suppléments invité pour divers systèmes d'exploitation invités.
Il s'agit de code installé dans les machines virtuelles ; voir <xref
linkend="guestadditions" />.</para>
</listitem>
<listitem>
<para>Le composant "Main" est spécial : il croise tous les bits
ci-dessus et c'est la seule API publique fournie par VirtualBox. Tous
les processus clients listés ci-dessus n'utilisent que cettte API et
n'accèdent jamais directement aux composants de l'hyperviseur. Il s'en
suit que des applications tierces utilisant l'API principale de VirtualBox
peuvent s'appuyer sur le fait qu'elle est toujours bien testée et que
toutes les possibilités de VirtualBox sont complètement présentées. C'est
cette API qui est décrite dans le manuel de référence du SDK de
VirtualBox indiqué ci-dessus (de nouveau, voir le <xref linkend="VirtualBoxAPI" />).</para>
</listitem>
</itemizedlist>
</sect1>
<sect1 id="hwvirt">
<title>Virtualisation matérielle vs. logicielle</title>
<para>VirtualBox permet aux logiciels de la machine virtuelle de s'exécuter
directement sur le processeur de l'hôte, mais il utilise une gamme de
techniques complexes pour intercepter les opérations interférant avec votre
hôte. Chaque fois que l'invité essaie de faire quelque chose de potentiellement
dangereux pour votre ordinateur et ses données, VirtualBox s'interpose et
rentre en action. En particulier, pour beaucoup de matériel auquel croit
avoir accès l'invité, VirtualBox simule un certain environnement "virtuel"
selon la façon dont vous avez configuré une machine virtuelle. Par exemple,
quand l'invité cherche à accéder à un disque dur, VirtualBox redirige ces
requêtes vers ce que vous avez configuré comme étant le disque dur virtuel
de la machine virtuelle -- en principe, un fichier image sur votre hôte.</para>
<para>Malheureusement, la plateforme x86 n'a jamais été conçue pour pour
être virtualisée. La détection des
situations où VirtualBox doit contrôler le code invité qui s'exécute, comme
décrit ci-dessus, est difficile. Il existe deux façons de faire cela :<itemizedlist>
<listitem>
<para>Depuis 2006, les processeurs Intel et AMD supportent ce qu'on
appelle la <emphasis role="bold">"virtualisation matérielle"</emphasis>.
Cela signifie que ces processeurs peuvent aider VirtualBox à intercepter
des opérations potentiellement dangereuses que pourrait essayer de
faire le système d'exploitation invité et ils facilitent la présentation
de matériel virtuel à une machine virtuelle.</para>
<para>Ces fonctionnalités du matériel diffèrent entre les processeurs
Intel et AMD. Intel a appelé sa techno <emphasis
role="bold">VT-x</emphasis> ;; AMD a nommé la leur <emphasis
role="bold">AMD-V</emphasis>. Le support d'Intel et d'AMD de la
virtualisation est très différent dans le détail, mais pas si différent
dans le principe.<note>
<para>Sur de nombreux szstèmes, les fonctions de virtualisation
matérielle doivent être préalablement activées dans le BIOS avant
de pouvoir être utilisées par VirtualBox.</para>
</note></para>
</listitem>
<listitem>
<para>Contrairement aux autres logiciels de virtualisation, pour
de nombreux scénari d'utilisation, VirtualBox <emphasis>n'exige pas</emphasis>
que les fonctions de virtualisation matérielle soient présentes.
Par des techniques sophistiquées, VirtualBox virtualise beaucoup
de systèmes d'exploitation invités complets de manière
<emphasis role="bold">logicielle</emphasis>. Cela signifie que vous
pouvez lancer des machines virtuelles même sur d'anciens processeurs
qui ne supportent pas la virtualisation matérielle.</para>
</listitem>
</itemizedlist></para>
<para>Même si VirtualBox n'exige pas toujours la virtualisation matérielle,
son activation est <emphasis>nécessaire</emphasis> dans les scénari suivants :<itemizedlist>
<listitem>
<para>Certains systèmes d'exploitation, rares, comme OS/2, utilisent
des instructions processeur très ésotériques qui ne sont pas supportées
par notre virtualisation logicielle. Pour les machines virtuelles
configurées pour contenir un tel système d'exploitation, la
virtualisation matérielle est activée automatiquement.</para>
</listitem>
<listitem>
<para>Le support des invités 64 bits de VirtualBox (ajouté avec la
version 2.0) et le multiprocessing (SMP, ajouté avec la version 3.0)
exigent tous deux l'activation de la virtualisation matérielle (ce n'est
tout de même pas une grosse limite vu l'immense majorité des processeurs
64 bits et multi cœurs actuels incluant lavirtualisation matérielle ;
les exceptions à cette règle étant par exemple les anciens processeurs
Intel Celeron et AMD Opteron.)</para>
</listitem>
</itemizedlist></para>
<warning>
<para>Ne lancez pas d'autres hyperviseurs (produits de virtualisation
open-source ou propriétaires) en même temps que VirtualBox ! Si
plusieurs hyperviseurs peuvent, en principe, être <emphasis>installés</emphasis>
en parallèle, n'essayez pas de <emphasis>lancer</emphasis> plusieurs
machines virtuelles à partir d'hyperviseurs concurrents en même temps.
VirtualBox ne peut pas savoir ce qu'un autre hyperviseur essaie de faire
sur un même hôte, et surtout si plusieurs produits essaient d'utiliser la
virtualisation matérielle, les fonctions telles que VT-x, cela peut planter
tout l'hôte. De plus, dans VirtualBox, vous pouvez mélanger la virtualisation
logicielle et matérielle quand vous lancez plusieurs VMs. Dans certains cas,
une petite perte de performances sera inévitable si vous mélangez des
VMs avec virtualisation VT-x et logicielle. Nous recommandons de ne pas
mélanger les modes de virtualisation si la performance maximum et
une faible overhead sont essentiels. Cela <emphasis>ne s'applique pas</emphasis>
à AMD-V.</para>
</warning>
</sect1>
<sect1>
<title>Détails sur la virtualisation logicielle</title>
<para>L'implémentation de la virtualisation sur les processeurs x86 sans
le support de la virtualisation matérielle est une tâche extraordinairement
complexe car l'architecture du processeur n'a pas été conçue pour être
virtualisée. On peut résoudre en général les problèmes, mais au prix de
performances réduites. Ainsi, il existe un conflit constant entre les
performances de virtualisation et et son soin.</para>
<para>Le jeu d'instructions x86 a été conçu au départ dans les années 1970 et
subi des modifications significatives avec l'ajout d'un mode protégé dans
les années 1980s avec l'architecture du processeur 286, puis à nouveau avec
l'Intel 386 et l'architecture 32 bits. Alors que le 386 avait un
support de virtualisation vraiment limité pour les opérations en mode réel,
(le mode V86, utilisé par la "DOS Box" de Windows 3.x et d'OS/2 2.x), aucun
pport n'existait pour virtualiser toute l'architecture.</para>
<para>En théorie, la virtualisation logicielle n'est pas complexe en soi.
Outre les quatre niveaux de privilèges ("rings") fournis par le matériel
(dont en général on n'utilise que deux : ring 0 pour le mode noyau et ring 3
pour le mode utilisateur), il faut faire la différence entre le "contexte
hôte" et le "contexte invité".</para>
<para>Dans le "contexte hôte", tout est comme s'il n'y avait pas d'hyperviseur
actif. Cela pourrait être le mode actif si une autre application de votre
hôte consomme du temps processeur ; dans ce cas, il existe un mode
ring 3 hôte et un mode ring 0 hôte. L'hyperviseur n'est pas impliqué.</para>
<para>Par contre, dans le "contexte invité", une machine virtuelle est active.
Tant que le code invité s'exécute en ring 3, ce n'est pas très problématique
vu qu'un hyperviseur peut paramétrer les tableaux des pages correctement et
exécuter ce code de manière native sur le processeur. Les problèmes arrivent
sur la manière d'intercepter ce que fait le noyau de l'invité.</para>
<para>Il y a plusieurs solutions possibles à ces problèmes. Une approche
est l'émulation logicielle totale, ce qui implique généralement une recompilation.
A savoir que tout le code qui doit être exécuté par l'invité est analysé,
transformé sous une forme qui n'autorisera pas l'invité à modifier et à
voir l'état réel du processeur, lequel l'exécutera simplement. Ce processus
est bien sûr très complexe et coûteux en termes de performances. (VirtualBox
contient un recompilateur basé sur QEMU qu'on peut utiliser pour une
émulation logicielle pure, mais le recompilateur n'est activé que dans
des situations particulières, décrites ci-dessous.)</para>
<para>Une autre solution possible est la paravirtualisation, où seuls les
OS invités spécialement modifiés sont autorisés à s'exécuter. De cette manière,
la plupart des accès matériels sont rendus abstraits et toutes les fonctions
qui accèderaient normalement au matériel ou à l'état privilégié du processeur
se basent plutôt sur l'hyperviseur. La paravirtualisation peut donner
de bonnes fonctionnalités et de bonnes performances sur des processeurs
x86 standards, mais cela ne peut marcher que si l'OS invité peut être
modifié, ce qui n'est évidemment pas toujours le cas.</para>
<para>VirtualBox choisit une approche différente. Quand uo démarre une
machine virtuelle par son pilote noyau du support ring-0, VirtualBox a
réglé le système hôte pour qu'il puisse lancer nativement la plupart du
code invité, mais il s'insère lui-même "en bas" de l'image. Il peut alors
supposer le contrôle lorsque c'est nécessaire -- si une instruction privilégiée
est exécutée, l'invité plante (traps) (en particulier car un accès au registre
E/S a été tenté et un périphérique doit être virtualisé) ou car des interruptions se produisent. VirtualBox peut
alors gérer cela et soit acheminer une requête vers un périphérique virtuel,
soit, si possible, déléguer la gestion de tels éléments à l'OS hôte ou
invité. Dans le contexte invité, VirtualBox peut être donc dans un des trois
états :</para>
<para><itemizedlist>
<listitem>
<para>Le code invité ring 3 s'exécute sans modifications, à pleine
vitesse, autant que possible. Le nombre de fautes sera généralement
faible (sauf si l'invité autorise l'E/S du port depuis ring 3,
chose que nous ne pouvons pas faire car nous ne voulons pas que
l'invité puisse accéder aux ports réels). On parle aussi de "mode brut",
car le code ring-3 de l'invité s'exécute sans modifications.</para>
</listitem>
<listitem>
<para>Mour le code invité en ring 0, VirtualBox utilise une astuce
savoureuse : il reconfigure l'invité pour que son code ring-0
se lance plutôt en ring 1 (ce qui n'est en principe pas utilisé sur les
systèmes d'exploitation x86). Il s'en suit que lorsque le code ring-0
de l'invité (qui s'exécute en fait en ring 1) tel que le pilote d'un
périphérique invité, essaie d'écrire sur un registre E/S ou d'exécuter
une instruction non privilégiée, l'hyperviseur de VirtualBox en ring
0 "réel" peut prendre le dessus.</para>
</listitem>
<listitem>
<para>L'hyperviseur (VMM) peut être actif. Chaque fois qu'une erreur
survient, VirtualBox regarde l'instruction problématique et il peut
la reléguer à un périphérique virtuel, à l'OS hôte, à l'invité ou
il peut le lancer dans le recompilateur.</para>
<para>En particulier, on utilise le recompilateur quand le code invité
désactive les interruptions et VirtualBox ne peut pas savoir quand
on y reviendra (dans ces situations, VirtualBox analyse en fait le
code invité en utilisant son propre désassembleur). De plus, certaines
instructions privilégiées telles que LIDT doivent être gérées à part.
Enfin, tout le code en mode réel ou protégé (comme le code du BIOS,
un invité DOS ou un démarrage de système d'exploitation) se lance
complètement dans un recompilateur.</para>
</listitem>
</itemizedlist></para>
<para>Malheureusement, cela ne fonctionne que dans une certaine mesure.
Entre autres, les situations suivantes nécessitent une gestion spéciale :</para>
<para><orderedlist>
<listitem>
<para>L'exécution de code ring 0 en ring 1 provoque beaucoup d'erreurs
d'instructions supplémentaires car ring 1 n'est pas autorisé à exécuter
des instructions privilégiées (dont le ring-0 de l'invité en contient
beaucoup). Avec chacune de ces erreurs, le VMM doit s'arrêter et
émuler le code pour obtenir le comportement désiré. Si cela fonctionne,
l'émulation de milliers d'erreurs est très coûteuse et très pénalisante
en performances de l'invité virtualisé.</para>
</listitem>
<listitem>
<para>Il existe des défauts dans l'implémentation de ring 1 de
l'architecture x86 qui n'ont jamais été corrigés. Certaines instructions
qui <emphasis>planteraient</emphasis> même en ring 1 ne le font pas.
Cela concerne par exemple les paires d'instructions LGDT/SGDT, LIDT/SIDT,
ou POPF/PUSHF. Alors que l'opçration "load" est privilégiée et peut
donc planter, l'instruction "store" réussit toujours. Si l'invité est
autorisé à les exécuter, il verra l'état réel du PC et pas celui
virtualisé. L'instruction CPUID a également le même problème.</para>
</listitem>
<listitem>
<para>Un hyperviseur a en général besoin de réserver certaines parties
de l'espace d'adresse de l'invité (tant l'espace d'adresse liénaire
que les sélecteurs) pour son propre usage. Ce n'est pas complètement
transparent pour l'OS invité et cela peut provoquer des conflits.</para>
</listitem>
<listitem>
<para>L'instruction SYSENTER (utilisée pour les appels système) exécutée
par une application en fonction dans un OS invité transite toujours
par le ring 0. Mais c'est là où l'hyperviseur se lance et pas l'OS
invité. Dans ce cas, l'hyperviseur doit bloquer et émuler l'instruction
même quand ce n'est pas souhaitable.</para>
</listitem>
<listitem>
<para>Les registres de segments du processeur contiennent un cache
de descripteur "caché" inaccessible de manière logicielle. L'hyperviseur
ne peut pas lire, enregistrer ou restaurer cet état, mais l'OS invité
peut l'utiliser.</para>
</listitem>
<listitem>
<para>Certaines ressources doivent (et peuvent) être neutralisées par
l'hyperviseur, mais l'accès est si fréquent que cela crée une perte
significative de performances. Un exemple réside dans le registre
TPR (Task Priority) en mode 32 bits. Les accès à ce registre doivent
être bloqués par l'hyperviseur, mais certains szstèmes d'exploitation
invités (en particulier Windows et Solaris) écrivent très souvent
dans ce registre, ce qui porte une atteinte certaine aux performances
de virtualisation.</para>
</listitem>
</orderedlist></para>
<para>Pour corriger ces problèmes de performances et de sécurité, VirtualBox
contient un gestionnaire d'analyse et de scan de code
(Code Scanning and Analysis Manager (CSAM)), qui désassemble le code invité,
et un gestionnaire de correctifs (Patch Manager (PATM)), qui peut le remplacer
pendant l'exécution.</para>
<para>Avant d'exécuter du code ring 0, CSAM le scanne de manière récursive
pour trouver des instructions problématiques. PATM le corrige <emphasis>in-situ
</emphasis>, c'est-à-dire qu'il remplace l'instruction par un passage à la
mémoire de l'hyperviseur, où un générateur intégré a mis une implémentation
plus convenable. En réalité, c'est une tâche très complexe car il existe
de nombreuses situations compliquées à trouver et à gérer correctement. Donc,
vu son actuelle complexité, vous pourriez trouver que PATM est un recompilateur
avancé <emphasis>in-situ</emphasis> recompiler.</para>
<para>De plus, à chaque fois qu'une erreur survient, VirtualBox analyse
le code problématique pour déterminer s'il est possible de le corriger afin
de l'empêcher de provoquer davantage futures d'erreurs. Cette approche
fonctionne bien en pratique et améliore de façon drastique les performances
de la virtualisation logicielle.</para>
</sect1>
<sect1>
<title>Détails sur la virtualisation matérielle</title>
<para>Avec VT-x d'Intel, il existe deux modes opératoires du processeur :
le mode racine VMM et le mode non-racine.<itemizedlist>
<listitem>
<para>En mode racine, le processeur se comporte beaucoup comme les
anciennes générations de processeurs sans le support VT-x. Il y a quatre
niveaux de privilèges ("rings") et le même jeu d'instructions est
supporté avec, en plus, des instructions spécifiques de virtualisation.
Le mode racine est ce que le système d'exploitation hôte utilise sans
virtualisation, et il est aussi utilisé par l'hyperviseur quand la
virtualisation est active.</para>
</listitem>
<listitem>
<para>En mode non-racine, le fonctionnement du processeur est très
différent. Il y a toujours quatre niveaux de privilèges et le même
jeu d'instructions, mais une nouvelle structure, qui s'appelle VMCS
(Virtual Machine Control Structure), contrôle désormais le fonctionnement
du processeur et elle détermine la manière dont se comportent certaines
instructions. Le mode non-racine est celui dans lequel les systèmes invités
fonctionnent.</para>
</listitem>
</itemizedlist></para>
<para>Le passage du mode racine au mode non racine s'appelle "l'entré1 VM",
celui en sens invers s'appelle "Quitter VM". Le VMCS inclut une zone d'état
invité et hôte sauvegardée/restaurée à chaque entrée et sortie en VM.
Surtout, les VMMS contrôlent les opérations de l'invité qui feront quitter
la VM.</para>
<para>Les VMCS permettent un contrôle très fin via ce que les invités
peuvent et ne peuvent pas faire. Par exemple, un hyperviseur peut autoriser
un invité à écrire certains bits dans des registres de contrôle protégés,
mais pas dans d'autres. Cela permet une virtualisation efficace dans des cas
où les invités peuvent être autorisés à écrire des bits de contrôle sans
gêner l'hyperviseur, tout en les empêchant de modifier les bits de contrôle
dont l'hyperviseur a besoin pour avoir un contrôle total. Le VMMS fournit
aussi un contrôle via l'affichage d'interruptions et les exceptions.</para>
<para>Chaque fois qu'une instruction ou un événement fait quitter une VM,
le VMCS contient des informations sur les raisons de la sortie, ainsi que,
souvent, des détails environnants. Par exemple, si une écriture dans le
registre CR0 fait quitter, l'instruction en cause est enregistrée, ainsi
que le fait qu'un accès en écriture sur le registre de contrôle a prurnqué
la sortie, et des informations sur la le registre source et destination.
L'hyperviseur peut ainsi gérer efficacement la condition sans avoir besoin
de techniques avancées telles que CSAM et PATM décrits ci-dessus.</para>
<para>VT-x évite intrinsèquement plusieurs problèmes qui se posent avec la
virtualisation logicielle. L'invité a son propre espace d'adresse distinct,
qu'il ne partage pas avec l'hyperviseur, ce qui élimine les plantages
potentiels. De plus, le code du noyau de l'OS invité se lance avec le
privilège ring 0 en mode non racine VMX, rendant inopérants les problèmes
d'exécution de code en ring 0 sur des niveaux moins privilégiés. Par exemple,
l'instruction SYSENTER peut faire une transition vers le ring 0 sans problèmes.
Naturellement, même en ring 0 en mode non-racine VMX, tous les accès E/S par
le code invité amène toujours la VM à quitter, permettant l'émulation
de périphérique.</para>
<para>La plus grosse différence entre VT-x et AMD-V est qu'AMD-V fournit
en environnement de virtualisation plus complet. VT-x exige que le code
non-racine VMX s'exécute en mode pagination activée, ce qui rejette la
virtualisation matérielle de logiciels dont le code est en mode réel et en
mode protégé non paginé. Cela n'inclut en général que les firmwares et les
chargeurs d'OS, néanmoins cela complique l'implémentation d'un hyperviseur
avec VT-x. AMD-V n'a pas cette restriction.</para>
<para>Bien entendu, la virtualisation matérielle n'est pas parfaite. Par
rapport à la virtualisation logicielle, la charge des fins des VMs est
relativement élevée. Cela pose des problèmes aux périphériques dont l'émulation
requiet un grand nombre de blocages (trass). Par exemple, avec le périphérique
VGA en mode 16 couleurs, mon seulement tous les accès au port en E/S, mais
aussi tous les accès à la mémoire tampon (framebuffer) doivent être
bloqués.</para>
</sect1>
<sect1 id="nestedpaging">
<title>Vagination nestée et VPIDs</title>
<para>En plus de la virtualisation matérielle "brute", votre processeur peut
supporter aussi des techniques sophistiquées supplémentaires :<footnote>
<para>VirtualBox 2.0 a ajouté le support de la pagination nestée d'AMD ;
le support de l'EPT et des VPIDs d'Intel a été ajouté à la version 2.1.</para>
</footnote><itemizedlist>
<listitem>
<para>Une fonctionnalité récente, qui s'appelle la
<emphasis role="bold">"pagination nestée"</emphasis> implémente la
gestion de la mémoire dans le matériel, ae qui peut beaucoup accélérer
la virtualisation matérielle puisque ces tâches n'ont plus besoin d'être
accomplies par le logiciel de virtualisation.</para>
<para>Avec la pagination nested, le matériel fournit un autre niveau
d'indirection en passant du linéaire aux adresses physiques. Les
tables de page fonctionnent comme avant mais les adresses linéaires
sont désormais d'abord traduites en adresses physiques de "l'invité"
et pas directement en adresses physiques. Il existe maintenant un
nouveau jeu de registres de pagination sous le mécanisme depagination
traditionnel et qui traduit les adresses physiques invitées en adresses
physiques de l'hôte, qui sont utilisées pour accéder à la mémoire.</para>
<para>La pagination nested élimine la charge causée par les fins de
VM et les accès aux tables de pages. Par définition, avec les tables
de pages nested, l'invité peut gérer la pagination sans que l'hyperviseur
n'intervienne. La pagination nestée améliore ainsi substantiellement
les performances de virtualisation.</para>
<para>Sur les processeurs AMD, la pagination nested est disponible
depuis l'architecture Barcelona (K10) -- on l'appelle maintenant la
"rapid virtualization indexing" (RVI). Intel a ajouté le support de
la pagination nested, qu'ils appellent la "extended page tables" (EPT),
à leurs processeurs Core i7 (Nehalem).</para>
<para>Si la pagination nested est activée, l'hyperviseur de VirtualBox
peut également utiliser <emphasis role="bold">large pages</emphasis>,
pour réduire l'utilisation du TLB et la charge. Cela peut provoquer
une amélioration jusqu'à 5% des performances. Pour activer cette
fonctionnalité pour une VM, vous avez besoin d'utiliser la commande
<computeroutput>VBoxManage modifyvm
</computeroutput><computeroutput>--largepages</computeroutput> ;
voir <xref linkend="vboxmanage-modifyvm" />.</para>
</listitem>
<listitem>
<para>Sur les processeurs Intel, une autre fonction matérielle, qui
s'appelle <emphasis role="bold">"Virtual Processor Identifiers" (VPIDs)</emphasis>,
peut beaucoup accélérer le changement de contexte en réduisant le
besoin de flasher beaucoup les Translation Lookaside Buffers
(TLBs) du processeur.</para>
<para>Pour activer ces fonctions pour une VM, vous devez utiliser
les commandes <computeroutput>VBoxManage modifyvm --vtxvpid</computeroutput> and
<computeroutput>--largepages</computeroutput> ; voir <xref
linkend="vboxmanage-modifyvm" />.</para>
</listitem>
</itemizedlist></para>
</sect1>
</chapter>
|