Aller au contenu

Administration Unix - CM séance 11

Avant-propos :

  1. Pour gagner du temps pour le TP, allez sur

    http://sol.dil.univ-mrs.fr/~thiel/ISO/
    

    puis lancez tout de suite le téléchargement du fichier xubuntu-*.iso

  2. Correction de l'examen

10. Machines virtuelles

Une machine virtuelle (VM) est un logiciel qui simule une autre machine.

On appelle hôte (ou host) la machine qui exécute la VM.

10.1. Types de Machines simulées

a) Machine abstraite

Machine de Turing : (Alan Turing, 1936)

La plus célèbre ; c'est un modèle d'automate très simple, qui comporte :

  • un ruban infini (sa mémoire) : une suite de cases consécutives pouvant contenir un symbole parmi un alphabet fini (par ex: 0, 1, blanc) ;

  • une tête de lecture/écriture sur la case courante du ruban, pouvant se déplacer à gauche ou à droite sur le ruban ;

  • un état courant (le nombre d'états possibles étant fini) ;

  • une table d'actions, qui constitue le "programme" de la machine : elle indique à la machine, selon la case lue et l'état courant :

    • quel symbole écrire sur le ruban,
    • comment déplacer la tête de lecture (vers la gauche ou la droite),
    • quel est le nouvel état

Il existe des réalisations mécaniques de machines de Turing : en légos, en bois, etc (cf youtube, dailymotion)

Tout algorithme est calculable par une machine de Turing
⟶ fondements théoriques de la complexité et de la calculabilité.

Un langage qui permet de simuler une machine de Turing est dit "Turing-complet" (C, java, bash, ..., html5+css3, TeX, ...).

Certains langages exotiques sont directement basés sur une machine de Turing très restreinte : P'', Brainfuck, Whitespace, Ook!

Machine de Turing universelle :

= machine de Turing pouvant simuler n'importe quelle machine de Turing, celle dernière étant fournie sous forme de données sur le ruban.

⟶ À l'origine du concept d'ordinateur à programme enregistré (et modifiable), et de l'architecture des ordinateurs actuels, dite de John von Neumann (1946).

b) Machines virtuelles de haut niveau

Elles simulent un processeur fictif, avec son propre jeu d'instruction. Un programme binaire exécutable par une telle machine s'appelle un bytecode.

Exemples :

  • machine virtuelle java (JVM), bytecode java
  • CLR (plateforme .NET de Microsoft)
  • VM Parrot (pour langages Perl/Raku, Ruby, Lua, ...)
  • BD+ pour les Blu-ray

Buts :

  • portabilité : le bytecode produit sera utilisable sur tous les systèmes où sera disponible la machine virtuelle, indépendamment de l'architecture matérielle de l'hôte ;
  • isolation : le bytecode n'a pas un accès direct aux ressources de l'hôte (c-à-d mémoire, processeurs, disques, processus, etc).

L'exécution de bytecode est assez efficace, mais pas autant que du code natif qui tourne directement sur le processeur.

Techniques pour augmenter l'efficacité :

  • compilation à la volée (Just-in-time Compilation, JIT) : pendant l'exécution, traduction de morceaux de bytecode en code machine natif directement exécuté par l'hôte.
  • compilation anticipée (ex. Android RunTime, ART) : le bytecode est directement traduit en code machine natif à l'installation.

c) Virtualisation complète (full virtualization)

La VM simule un ordinateur physique complet, permettant d'y installer un système d'exploitation sans le modifier.

Pour ce faire, la VM doit simuler complètement :

  • les ressources matérielles (mémoire, processeur, disque dur, carte graphique, réseau...)
  • des ressources logicielles (BIOS, pilotes...)

On appelle :

  • système hôte (host OS), le système de la machine hôte (dans lequel tourne la VM),
  • système invité (guest OS), le système installé dans la VM.
  ┌─────────────────────────┐
  │ Système invité          │
  ├─────────────────────────┤
  │ Machine virtuelle       │
  ├─────────────────────────┤
  │ Système hôte            │
  ├─────────────────────────┤
  │ Machine hôte (physique) │
  └─────────────────────────┘

Exemples :

  • Virtualbox (Oracle)
  • VMWare (WMWare)
  • XEN (Linux Foundation et Intel)
  • Proxmox VE (Proxmox Server Solutions GmbH)
  • Hyper-V (Microsoft)
  • QEMU (Fabrice Bellard)
  • DOSBox (Peter Veenstra, Sjoerd van der Berg ; émule DOS et win98)
  • ...

cf https://en.wikipedia.org/wiki/Comparison_of_platform_virtualization_software

Avantages :

  • utiliser simultanément plusieurs systèmes sur le même ordinateur
  • sécurité par isolation (pour les serveurs : une VM par service)
  • souplesse : création de machines à la demande, allocation de ressources

Accélération matérielle ("hardware-assisted virtualization") : pour améliorer l'efficacité, de nombreux processeurs actuels possèdent un jeu d'instructions spécialisées pour accélérer la virtualisation : Intel VT-x, AMD-V Ces techniques on d'abord été développées dans les mainframes (IBM S/370).

Certaines VMs nécessitent l'accélération matérielle (par ex. VirtualBox) qui doit être activée dans le BIOS (elle ne l'est pas par défaut).

Certaines VM permettent également d'émuler des architectures différentes ; c'est le cas de QEMU ; indispensable pour le développement de systèmes embarqués par exemple avec processeurs ARM

10.2. Modes de virtualisation

a) Hyperviseur

Un hyperviseur est une plate-forme de virtualisation qui permet à plusieurs VM de travailler sur une machine physique en même temps.

Ils sont classés en 2 types :

  • Type 1 : natif ("bare metal")
    s'exécute directement sur une machine physique ; c'est un noyau hôte allégé et optimisé.

    Exemples : Xen (Linux, BSD) ; Hyper-V (Microsoft)

  • Type 2 : hosted
    s'exécute à l'intérieur d'un système d'exploitation.

    Exemples : Virtualbox, VMWare, QEMU, ...

b) Paravirtualisation

Désigne une technique de virtualisation particulière :

  • au lieu de simuler une machine complète, l'hyperviseur fournit une API pour le système invité ;
  • le système invité appelle cette API ; il doit donc être modifié dans ce but.

Il s'agit d'une virtualisation plus simple et efficace, permettant d'approcher les performances d'un système réel ; beaucoup utilisée sur les serveurs, pour la sécurité par isolation des VM.

Exemples pour Linux :

  • KVM
    • intégré au noyau
    • il permet la paravirtualisation (grâce à virtio, une API du noyau)
    • donne accès à l'accélération matérielle pour la virtualisation complète
    • utilisé par de nombreux hyperviseurs de types 1 et 2 comme support (QEMU, ...)
  • Xen
    • peut paravirtualiser, ou faire fonctionner des systèmes non modifiés.

c) Conteneurs

Un conteneur est une méthode de virtualisation, non pas d'une machine, mais d'un environnement d'exécution (processeur, mémoire, réseau, système de fichier).

Un conteneur s'appuie sur le noyau du système hôte. Le noyau peut exécuter de nombreux conteneurs simultanément ; cela consomme moins de ressources que des machines virtuelles.

Sécurité : le noyau crée pour chaque conteneur un environnement isolé en espace utilisateur, et y enferme le conteneur.

⟶ le noyau peut ainsi limiter l'accès aux ressources du système (périphériques, mémoire, ...)

⟶ Une application qui s'exécute dans un tel conteneur croira qu'il s'agit de la seule application en cours d'exécution.

Sous Linux, les technologies utilisées par le noyau s'appellent les cgroups (control groups) et le support des isolated namespaces.

Distribution :

  • un conteneur est un format de données prêt à être déployé sur un serveur et son système ;
  • il contient une application avec tous les éléments dont elle a besoin pour fonctionner : librairies, outils, fichiers, base de données, serveur web, etc

Exemples : LXC, Docker, Kubernetes

d) Bac à sable (sandbox)

Le terme sandbox peut avoir plusieurs significations.

Dans la sécurité informatique, c'est un mécanisme de sécurité qui se base sur l'isolation des composants logiciels et une limitation de l'accès au système d'exploitation hôte.

De nombreuses technologies peuvent être combinées. Sous Linux : Seccomp, cgroups, Linux namespaces, SELinux, Apparmor, ...

Les conteneurs sont en principe des sandbox (plus ou moins étanche, selon les technologies et la configuration).

Il existe des formats de distribution d'application, qui sont portable sur n'importe quel Linux ; certains tourne nativement dans un sandbox :

  • Snap (Canonical pour Ubuntu ; en Go et C) : format de distribution auto-contenu (avec toutes les librairies et ressources nécessaires) ; l'application tourne dans un sandbox, les E/S sont filtrées ; permet les mises à jour

  • Flatpak (Alex Larsson, en C) : même objectifs que Snap ; utilisé sur les distributions autres qu'Ubuntu

  • AppImage (Simon Peter, en c) : format de distribution auto-contenu, prêt à être exécuté, sans étape d'installation. Plus ancien et plus simple ; pas de sandbox ni sécurité

e) Outils de gestion

Vagrant (Mitchell Hashimoto et John Bender, en Ruby) :
création et configuration de VM (Virtualbox, VMWare, ...), de conteneurs, déploiement sur des serveurs
Ansible (RedHat, en Python, Powershell et Ruby) :
configuration d'ordinateurs et de VM, déploiement de logiciels et de conteneurs

Puppet (Ruby), Chef (Ruby), Salt (Python), ...

10.3. Disques virtuels

Une VM peut utiliser des mémoires de masse :

  • un disque physique, ou des partitions sur un disque physique
  • un disque virtuel (VD)

Un disque virtuel simule un disque physique (secteurs, système de fichiers, droits, ...)

Au niveau de l'hôte, il est stocké comme un fichier (appelé fichier image).

Un disque virtuel peut être :

  • statique : la taille du fichier image est réservée au départ, à la taille du disque qu'il simule ;
  • dynamique : la taille du fichier image croît au fur et à mesure qu'on y rajoute des fichiers ; mais il ne peut pas dépasser la taille du disque utilisée au formatage.

Avantages : facilite le clonage, le déploiement, les sauvegardes.

Formats populaires :

  • VDI (Virtual Disk Image, .vdi) : spécifique à VirtualBox

  • VMDK (Virtual Machine Disk, .vmdk) : format de fichier ouvert, créé à la base pour VMWare ; utilisé également par Virtualbox, QEMU, ...

  • VHD (Virtual Hard Disk, .vhd) : Microsoft, Hyper-V ; utilisé par VirtualBox

  • ISO image (.iso) : fichier au format ISO 9660 des CDROM C'est une copie binaire du système de fichiers et de leurs contenus. Les logiciels installables à partir d'un disque bootable sont souvent distribués sous une image iso.

  • IMG (.img) : copie "raw", c'est-à-dire brute, d'un disque physique. Son utilisation dépend du système de fichier qui est à l'intérieur.

  • Apple Disk Image (.dmg) : MacOS Pour distribuer des applications.

Additions invités :

Il s'agit d'un disque virtuel, généralement une image ISO, fourni par l'hyperviseur.

Il contient des scripts et des drivers pour mieux tirer parti de la VM :

  • résolution de l'écran à la taille de la fenêtre
  • intégration de la souris
  • ...