TP virtualisation, LP ASUR 2018 - 2019

Introduction

Les systèmes d’exploitation fournissent une couche d’abstraction au-dessus du matériel de l’ordinateur. Le système d’exploitation virtualise la plupart des ressources physiques d’un ordinateur, par exemple :

Les ordinateurs modernes sont suffisamment puissants pour utiliser la virtualisation pour donner l’illusion que de nombreuses machines virtuelles, chacune exécutant une instance distincte du système d’exploitation, tournent sur un même hôte. La virtualisation n'est pas un concept nouveau (la mémoire virtuelle, par exemple, a été conçue dans les années 1950). IBM a introduit le système d’exploitation VM/370 pour ses ordinateurs centraux d’architecture 370 dans les années 1960. L’environnement VM/370 comprend deux composants logiciels, à savoir le programme de contrôle (CP) et le système de moniteur de conversation (CMS). Le CP effectue la gestion des ressources et crée l'environnement de machine virtuelle dans lequel un système d'exploitation peut s'exécuter.

Passons en revue quelques gestionnaires de machines virtuelles / hyperviseur :

Exercice UML

Lancer une instance UML en suivant les instructions de la page principale du projet. Bien entendu, lancer cette instance dans une VM de RosettaHub. Ensuite, veuillez mettre en évidence les problèmes avec hostfs comme cela est expliqué sur cette page.

Exercice VirtualBox

Après avoir installé VirtualBox dans une VM de RosettaHub (voir par exemple différentes méthodes sur cette page. Peut être que le plus simple est de passer par apt-get install virtualbox ?), vous devez utiliser la commande VBoxManage pour créer et utiliser des VMs. Dans ce cadre, veuillez faire les manipulations telles qu'elles sont présentées sur cette page.

Exercices LXD

Après avoir lu et compris l'introduction à LDX proposée sur cette page, faites les manipulations qui sont également proposées.

Containers (conteneurs)

Les conteneurs constituent une forme de virtualisation du système d'exploitation mais, contrairement aux machines virtuelles, ils ne virtualisent pas le matériel sous-jacent et consomment donc moins de ressources qu'un ordinateur virtuel complet.

Le déploiement d’une application sur divers systèmes peut être problématique en raison des dépendances de l’application. L'arbre de dépendance d'une application peut être assez complexe. Des systèmes sophistiqués de gestion de paquets, tels que apt, résolvent beaucoup de ces problèmes de dépendance. Cependant, pour les développeurs partageant du code source (par exemple, via des outils comme git), l'environnement mis en place par le système de gestion de paquets peut ne pas être suffisant.

Le noyau Linux prend en charge un certain nombre de fonctionnalités d'isolation, à savoir les espaces de noms (namespace) et les groupes de contrôle (cgroups). Les espaces de noms sont une abstraction de certains systèmes de gestion de ressource. Un processus exécuté dans un espace de noms spécifique semble avoir sa propre instance d'une ressource, l'isolant ainsi du reste du système. Nous décrivons les espaces de noms dans la section ci-dessous. Les Cgroups permettent, quant à eux, de limiter la quantité de ressources système utilisée par un processus (ou groupes de processus).

Namespaces

La catégorie des types d'espace de noms Linux est fournie dans la liste ci-dessous :

Les systèmes Unix ont depuis longtemps une fonction d'isolation dans l'appel système chroot. L’appel système chroot modifie la perception d’un processus de son répertoire / (racine). Un sous-répertoire sous la hiérarchie du système de fichiers peut être spécifié en tant que nouveau répertoire “/” de processus.

Bien que chroot ne soit pas un espace de noms de noyau, il peut fournir un confinement rudimentaire à un processus. Nous démontrons les espaces de noms en écrivant un utilitaire pour exécuter un processus dans un environnement confiné. Nous allons d'abord aller chercher une archive, décrite dans le livre "Embedded Operating Systems" publié chez Springer. Ce livre est accompagné d’un dépôt git contenant des fichiers utiles pour nos manipulations. L'un des fichiers est une archive d'une structure de fichier racine GNU / Linux simple. Utilisez git clone pour aller chercher le dépôt pour le livre dont on parle, comme suit :

$ mkdir ˜/emxlbook && cd ˜/emxbook
$ git clone https://github.com/agholt/emx.git
				    

Dans le répertoire emx/chapter3 se trouve l'archive tarball de la structure de fichier racine, décompressez-la avec la ligne de commande ci-dessous :

$ tar zxf emx/chapter3/emx.tar.gz
				  

Cela crée un répertoire appelé root dans le répertoire de travail actuel (qui devrait se trouver dans ~/emxbook). Le répertoire, root, contient une structure de répertoires racine pour un système GNU / Linux. Il contient tous les fichiers d’administration, bibliothèques partagées, scripts de démarrage, utilitaires et fichiers de périphériques nécessaires au système d’exploitation GNU / Linux. Le seul composant qui manque est un noyau Linux, mais nous n’en avons pas besoin à ce stade car un système de conteneur utilise le noyau de l’hôte. Examinez le contenu du répertoire, racine:

$ ls root/
  bin dev lib proc sbin usr var.tar
  boot etc linuxrc root sys var
				  

Lançons maintenant la commande chroot sur ce répertoire et demandons un shell :

$ sudo chroot root /bin/sh -i
/ #
				  

Bien que le chemin de notre répertoire soit donné par /, nous sommes dans le répertoire ~/emxbook/root. Le répertoire ~/emxbook/root de l'hôte est identique à celui de / dans le chroot. On terminera par vérifier que l'on ne peut pas remonter d'un niveau dans la hiérarchie des répertoires via un cd ... Nous sommes confinés !

LXC

LXC, contraction de l’anglais Linux Containers est un système de virtualisation, utilisant l'isolation comme méthode de cloisonnement au niveau du système d'exploitation. LXC repose sur les fonctionnalités des cgroups du noyau Linux ainsi que le cloisonnement des espaces de nommage du noyau, permettant d'éviter à un système de connaître les ressources utilisées par le système hôte ou un autre conteneur.

Le travail consiste à rejouer les instructions qui vous sont données sur cette page. Merci de vérifier que votre OS dispose bien de la dernière version de LXC. Si ce n'est pas le cas, faites l'installation de la dernière version, puis procéder à la création, destruction, gel de conteneurs LXC comme cela est expliqué.

Il est aussi possible d'utiliser des conteneurs en mode "unprivilegied". La distinction entre le mode privilégié et le mode non privilégié est discuté ici. On nous dit aussi sur le Web que "Ubuntu is also one of the few (if not only) Linux distributions to come by default with everything that's needed for safe, unprivileged LXC containers". Pour savoir si les conteneurs crées sont en mode privilégié ou pas, lire cette note. Votre mission est de vérifier si la distribution Linux que vous utilisez autorise les conteneurs unprivilegied ou pas. Veuillez mentionner et expliquer vos observations afin de justifer votre réponse.

Notes : pour Debian, il se peut que, pour installer le mode non privilégié, il soit nécessaire de suivre ces instructions. Une dicussion très technique des problèmes avec les modes privilégiés et non privilégiés se trouve ici.