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 :
- Mémoire
- Disques et partitions du disque
- Interfaces et ponts réseau
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 :
- User Mode Linux (UML) : User Mode Linux (UML) est un noyau Linux compilé en tant que fichier ELF normal afin de pouvoir être exécuté en tant que processus utilisateur.
- VirtualBox : VirtualBox est un hyperviseur à source ouverte développé à l'origine par Sun Microsystems. Il est actuellement développé par Oracle, car Sun Microsystems a été racheté par Oracle en 2010. VirtualBox s'exécute sur plusieurs systèmes d'exploitation hôtes, notamment: Solaris, GNU / Linux, macOS, Windows et FreeBSD.
- LXD est un système de gestions de conteneurs... permettant de déployer des VMs plutot que des conteneurs au sens de Docker. Au titre de la gestion de conteneurs nous retrouvons les fonctions de créations, suppression, arrêt... de conteneurs mais aussi des fonctions pour copier des fichiers dans/depuis un conteneur, backup. Ceci ne sont que quelques exemples. D'un point de vue industriel, l'Open Container Initiative (OCI) s'est fixé comme mission de standardiser un peu les formats et les supports d'exécution des technologies de containers.
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 :
- Mount: Isolates a process from mounted filesystems. The mount namespace is the set of mount filesystems that a process can see. This set may be different from a process running natively on the host or a process running in another namespace (which has its own mounted filesystem set). A process within a mount namespace can change its set of mount filesystems (mount newones or unmount exiting ones) without affecting processes running outside of the namespace.
- UTS: Isolates the hostname and the domain names. The hostname in a namespace can be changed without affecting the hostname of the host itself.
- IPC: Isolates certain interprocess communication (IPC) resources, namely, POSIX message queues and System V IPC mechanisms.
- PID: Isolates the process ID number space. Processes in different namespaces (including the host), therefore, may have the same process ID value. Note that, a process running in a namespace will have two process IDs. One ID in the namespace itself and one in the host system. The values of the two process IDs need not be the same (except by random chance).
- Network: Isolates system network resources. Each namespace has its own network devices, IP addresses, TCP/UDP ports and routing tables.
- User: Isolates users and groups. User and group IDs in a namespace are different from those on the host system (or any other namespace). The benefit of this is that a process could be given privileged (superuser) access to resources within the user namespace while access to resources outside are unprivileged.
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.