Exécuter GNOME dans un conteneur – Bien choisir son serveur d impression

Author: Titanfall —

Short summary: La conteneurisation de l'interface graphique sépare votre travail et vos loisirs. La virtualisation a toujours été le jeu d'un homme riche, et plus frugal passionnés – incapables de se payer des composants de classe serveur sophistiqués – souvent lutter pour suivre. Linux fournit des hyperviseurs gratuits de haute qualité, mais quand vous commencez à lancer […]

Quick overview

Site
Tutos GameServer
Canonical URL
https://tutos-gameserver.fr/2019/08/11/executer-gnome-dans-un-conteneur-bien-choisir-son-serveur-d-impression/
LLM HTML version
https://tutos-gameserver.fr/2019/08/11/executer-gnome-dans-un-conteneur-bien-choisir-son-serveur-d-impression/llm
LLM JSON version
https://tutos-gameserver.fr/2019/08/11/executer-gnome-dans-un-conteneur-bien-choisir-son-serveur-d-impression/llm.json
Manifest
https://tutos-gameserver.fr/llm-endpoints-manifest.json
Estimated reading time
15 minutes (865 seconds)
Word count
2883

Key points

Primary visual

Exécuter GNOME dans un conteneur

 – Bien choisir son serveur d impression
Main illustration associated with the content.

Structured content

La conteneurisation de l'interface graphique sépare votre travail et vos loisirs. La virtualisation a toujours été le jeu d'un homme riche, et plus frugal passionnés – incapables de se payer des composants de classe serveur sophistiqués – souvent lutter pour suivre. Linux fournit des hyperviseurs gratuits de haute qualité, mais quand vous commencez à lancer de véritables charges de travail sur l'hôte, ses ressources deviennent saturé rapidement. Aucune quantité de RAM disponible insérée dans un ancien ordinateur de bureau Dell va remédier à cette situation. Si un hôte correctement décoré est hors de votre portée, vous voudrez peut-être envisager des conteneurs à la place.

Au lieu de virtualiser un ordinateur entier, les conteneurs permettent à des parties de Linux le noyau doit être divisé en plusieurs morceaux. Cela se produit sans surcharge de matériel émulé ou d'exécution de plusieurs noyaux identiques. Plein Un environnement graphique, tel que GNOME Shell, peut être lancé dans un conteneur, avec un peu de bon sens.

Vous pouvez y parvenir grâce aux espaces de noms, une fonctionnalité intégrée à Linux noyau. Un examen approfondi de cette fonctionnalité dépasse le cadre de cette article, mais un bref exemple met en lumière la manière dont ces fonctionnalités peuvent créer conteneurs. Chaque type d’espace de noms segmente une partie différente du noyau. L'espace de noms PID, par exemple, empêche les processus à l'intérieur de l'espace de noms de voir d'autres processus en cours d'exécution dans le noyau. En conséquence, ces les processus croient qu’ils sont les seuls à fonctionner sur l’ordinateur. Chaque namespace fait la même chose pour les autres zones du noyau. le mount namespace isole le système de fichiers des processus qu'il contient. le l'espace de noms réseau fournit une pile réseau unique aux processus en cours d'exécution à l'intérieur d'eux. Les espaces de noms IPC, utilisateur, UTS et cgroup font la même chose pour ces zones du noyau aussi. Lorsque les sept espaces de noms sont combinés, le résultat est un conteneur: un environnement suffisamment isolé pour le croire un système Linux autonome.

Les frameworks de conteneur vont résumer les détails de la configuration des espaces de noms loin de l'utilisateur, mais chaque cadre a une emphase différente. Docker est le plus populaire et est conçu pour exécuter plusieurs copies identiques conteneurs à l'échelle. LXC / LXD est conçu pour créer facilement des conteneurs qui imiter des distributions Linux particulières. En fait, les versions antérieures de LXC inclus une collection de scripts qui ont créé les systèmes de fichiers de populaires distributions. Une troisième option est le pilote lxc de libvirt. Contrairement à comment cela peut paraître, libvirt-lxc n’utilise pas du tout LXC / LXD. Au lieu de cela, le Le pilote libvirt-lxc manipule directement les espaces de noms du noyau. libvirt-lxc s'intègre également à d'autres outils de la suite libvirt, de sorte que le la configuration des conteneurs libvirt-lxc ressemble à celle des machines virtuelles exécuter dans d’autres pilotes libvirt au lieu d’un conteneur natif LXC / LXD. Il est facile à apprendre, même si l’image de marque est déroutante.

J'ai choisi libvirt-lxc pour ce tutoriel pour plusieurs raisons. dans le En première place, Docker et LXC / LXD ont déjà publié des guides pour GNOME Shell dans un conteneur. Je suis incapable de localiser similaire documentation pour libvirt-lxc. Deuxièmement, libvirt est le cadre idéal pour les conteneurs en cours à côté des machines virtuelles traditionnelles, car ils sont à la fois géré par le même ensemble d'outils. Troisièmement, configurer un conteneur en libvirt-lxc fournit une bonne leçon sur les compromis impliqués dans la conteneurisation.

La plus grande décision à prendre est de savoir si vous voulez exécuter un programme privilégié ou non privilégié. récipient. Un conteneur privilégié utilise l’espace de noms d’utilisateur, et il a UIDS identiques à l'intérieur du conteneur comme à l'extérieur. Comme un En conséquence, les applications conteneurisées exécutées par un utilisateur avec des tâches administratives. privilèges pourraient causer des dommages importants si une faille de sécurité le permettait. sortir du conteneur. Compte tenu de cela, exécuter un conteneur non privilégié peut sembler un choix évident. Cependant, un conteneur non privilégié ne sera pas pouvoir accéder aux fonctions d'accélération du GPU. En fonction de la le but du conteneur – retouche photo, par exemple – qui peut ne pas être utile. Il y a un argument à faire pour ne lancer que les logiciels de confiance dans un conteneur, tout en laissant un logiciel non fiable pour l’isolation plus lourde d’un bonne machine virtuelle. Bien que je considère le bureau GNOME comme étant digne de confiance, je démontre la création d’un conteneur non privilégié ici de sorte que le processus peut être appliqué en cas de besoin.

La prochaine chose à décider est d'utiliser ou non un protocole d'affichage à distance, comme les épices ou VNC, ou de laisser le conteneur rendre son contenu dans l'un des les terminaux virtuels de l'hôte. L'utilisation d'un protocole d'affichage permet d'accéder à le conteneur de n'importe où et augmente son isolation. D'autre part, le conteneur accédant à l'hôte ne présente probablement aucun risque supplémentaire matériel que de deux processus différents s'exécutant en dehors d'un espace de noms. Encore une fois, si le logiciel que vous utilisez n’est pas digne de confiance, utilisez un logiciel virtuel complet. machine à la place. J'utilise la dernière option de libvirt-lxc pour accéder à l'hôte matériel dans cet article.

La dernière considération est un peu plus petite. Tout d'abord, libvirt-lxc ne sera pas share / run / udev / data jusqu'au conteneur, ce qui empêche libinput de en cours d'exécution à l'intérieur (il est possible de monter / exécuter, mais cela cause d'autres problèmes). Vous devrez écrire un bref xorg.conf pour utiliser les périphériques d’entrée. Par conséquent. La disposition des nœuds sous l'hôte Le répertoire / dev / input change constamment, la configuration du conteneur et xorg.conf fichier devra être ajusté en conséquence. Avec tout cela réglé, commencer.

Préparer l'hôte conteneur Une installation de base de Fedora 29 Workstation inclut libvirt, mais quelques des composants supplémentaires sont nécessaires. Le pilote libvirt-lxc lui-même doit être installée. Utilisons le virt-manager et outils virt-bootstrap pour accélérer la création du conteneur. Il y a aussi quelques auxiliaires utilitaires dont vous aurez besoin pour plus tard. Ils ne sont pas nécessaires, mais ils aideront vous surveillez l'utilisation des ressources du conteneur. Reportez-vous à votre colis la documentation du gestionnaire, mais j'ai couru ceci:

sudo dnf installer libvirt-daemon-driver-lxc virt-manager  ↪virt-bootstrap virt-top evtest iotop

Remarque: libvirt-lxc était obsolète en tant que conteneur de Red Hat Enterprise Linux. cadre dans la version 7.1. Il est encore en cours de développement en amont et disponible pour être installé dans la famille de distributions RHEL / Fedora.

Avant de créer le conteneur, vous devez également modifier /etc/systemd/logind.conf pour s’assurer que getty ne démarre pas sur le serveur virtuel terminal que vous souhaitez transmettre au conteneur. Ne commentez pas le NautoVTs ligne et mettez-le à 3, de sorte qu'il ne démarre que ttys sur les trois premiers terminaux. Ensemble ReserveVT à 3 pour qu'il réserve le troisième vt au lieu du sixième. Vous devrez redémarrer l'ordinateur après avoir modifié ce fichier. Après le redémarrage, vérifiez que getty n’est actif que sur ttys 1 à 3. Modifiez ces paramètres selon les besoins de votre configuration. Le modifié Les lignes de mon fichier logind.conf ressemblent à ceci:

AutoVT = 3 ReserveVT = 3

Préparer le système de fichiers conteneur Vous pouvez créer le système de fichiers du conteneur directement via virt-manager, mais quelques ajustements sur la ligne de commande sont nécessaires, alors, exécutons virt-bootstrap également. virt-bootstrap est un excellent outil libvirt qui télécharge des images de base à partir de Docker. Ça te donne un puits système de fichiers maintenu pour la distribution que vous souhaitez exécuter dans le récipient. J'ai trouvé que sur Fedora 29, je devais éteindre SELinux pour obtenir virt-bootstrap pour fonctionner correctement. Des paquets supplémentaires devront être ajoutés à l’image de base de Docker (telle que x.org et gnome-shell) et à certains fichiers systemd. les services devront être démasqués:

sudo setenforce 0 conteneur mkdir docker virt-bootstrap: // fedora / chemin / vers / conteneur sudo dnf --installroot / path / to / container install xorg-x11-server-Xorg xorg-x11-drv-evdev xorg-x11-drv-fbdev gnome-session-xsession xterm net-tools iputils dhcp-client mot de passe sudo sudo chroot / chemin / vers / conteneur passwd root #unmask les services getty et logind cd / etc / systemd / service rm getty.target rm systemd-logind.service rm console-getty.service sortie # assurez-vous que tous les fichiers du conteneur sont accessibles sudo chown -R utilisateur: utilisateur / chemin / vers / conteneur sudo setenforce 1

Remarque: il existe plusieurs manières de créer le système de fichiers du système d'exploitation. De nombreux gestionnaires de paquets ont des options permettant aux paquets d'être installé dans un répertoire local. Dans DNF, c'est le installer option. Dans apt-get, c'est le -o Racine = option. Il existe également un autre outil qui fonctionne comme virt-bootstrap appelé distrobuilder.

Créer le conteneur Lorsque vous ouvrez virt-manager, vous verrez que l'hyperviseur lxc est manquant. Vous ajoutez en sélectionnant Fichier dans le menu puis Ajouter une connexion. Sélectionnez "LXC (Conteneurs Linux) "dans la liste déroulante, puis cliquez sur Connecter. Ensuite, retournez au menu Fichier et cliquez sur Nouvel ordinateur virtuel.

Figure 1. Ajoutez le pilote libvirt-lxc à virt-manager.

La première étape pour créer un nouveau conteneur / machine virtuelle dans virt-manager est la suivante: pour sélectionner l'hyperviseur sous lequel il sera exécuté. Sélectionnez "LXC" et l'option pour un conteneur de système d'exploitation. Cliquez sur Suivant.

Figure 2. Assurez-vous d'avoir sélectionné Conteneur du système d'exploitation.

virt-bootstrap a déjà été exécuté, alors donnez à virt-manager l'emplacement de le système de fichiers du conteneur. Cliquez sur Suivant.

Donnez au conteneur la quantité de CPU et de mémoire nécessaire à son utilisation. Pour ce conteneur, laissez les valeurs par défaut. Cliquez sur Suivant.

À la dernière étape, cliquez sur "Personnaliser la configuration avant l’installation", et cliquez sur Terminer.

Une fenêtre s'ouvrira vous permettant de personnaliser le conteneur configuration. Avec l'option Aperçu sélectionnée, développez la zone qui dit "Espace de noms d'utilisateur". Cliquez sur "Activer l'espace de noms d'utilisateur" et tapez 65336 dans le champ Nombre pour l'ID utilisateur et l'ID groupe. Cliquez sur Appliquer, puis cliquez sur "Commencer l'installation". virt-manager lancera le conteneur. Vous ne sont pas tout à fait prêts à partir, fermez le conteneur et sortez-le. de libvirt.

Figure 3. L'activation de l'espace de noms d'utilisateur permet au conteneur être exécuté sans privilèges.

Vous devez modifier la configuration du conteneur afin de partager le les périphériques de l'hôte. Plus précisément, le tty cible (tty6), le tty de bouclage (tty0), la souris, le clavier et le framebuffer (/ dev / fb0) ont besoin d’entrées créé dans la configuration. Identifiez rapidement quels éléments sous / dev / input sont la souris et le clavier en exécutant sudo evtest et en appuyant sur Ctrl-c après il a énuméré les périphériques. De la sortie, je pouvais voir que ma souris est à / dev / input / event3, et mon clavier est / dev / input / event6.

Figure 4. Liste des périphériques d'entrée sur mon poste de travail

Vous ne pouvez pas accéder au dossier / etc / libvirt simplement en utilisant le sudo commander. Entrez une session root bash en exécutant sudo bashet changez le répertoire en / etc / libvirt / lxc. Ouvrez la configuration du conteneur et faites défiler jusqu'à la section de l'appareil. Vous devez ajouter hostdev étiquettes pour chaque appareil que vous venez identifiés. Utilisez la disposition suivante:

/ dev / mydevice

Pour mon conteneur, j'ai ajouté les tags suivants:

/ dev / tty0

/ dev / tty6

/ dev / input / event3

/ dev / input / event6

/ dev / fb0

Exécuter le conteneur Il est temps de commencer le conteneur! Ouvrez-le dans virt-manger et cliquez sur le bouton Bouton Start. Une fois qu'un conteneur a la possibilité d'utiliser le terminal de l'hôte, il n’est pas rare qu’il présente l’invite de connexion uniquement sur ce terminal. Alors appuyez sur Ctrl-Alt-F6 pour basculer sur tty6 et vous connecter au conteneur. Comme je mentionné ci-dessus, vous devez écrire un xorg.conf avec une section d’entrée. Pour votre référence, voici celle que j'ai écrite:

Section "ServerFlags" Option "AutoAddDevices" "False" EndSection Section "InputDevice" Identifiant "event3" Option "Périphérique" "/ dev / input / event3" Option "AutoServerLayout" "true" Pilote "evdev" EndSection Section "InputDevice" Identifiant "event6" Option "Périphérique" "/ dev / input / event6" Option "AutoServerLayout" "true" Pilote "evdev" EndSection

Ne négligez pas d’effectuer l’entretien courant d’un nouveau système Linux nécessite avec le conteneur. Les étapes que vous suivrez dépendront de la la distribution que vous exécutez à l'intérieur du conteneur, mais à tout le moins, assurez-vous vous créez un utilisateur distinct et l'ajoutez au groupe de roues et configurez le interface réseau du conteneur. Avec cela en dehors, courez début à lancez GNOME Shell.

Figure 5. Shell GNOME en cours d'exécution dans le conteneur

Maintenant que GNOME est en cours d’exécution, vérifiez si le conteneur utilise le système Ressources. Des outils comme Haut ne sont pas sensibles au conteneur. Afin d'obtenir un vrai impression de l'utilisation de la mémoire du conteneur, utilisation virt-top au lieu. Relier virt-top au pilote libvirt-lxc en lançant virt-top -c lxc: /// à l'extérieur du conteneur. Ensuite, lancez machinectl pour obtenir l'interne nom du conteneur:

[adam@localhost ~]$ machinectl

ADRESSES DE VERSION OS DE CLASSES MACHINES

conteneur contenant nom libvirt-lxc - - -

Courir statut machinectl -l nom de contenu pour imprimer le processus du conteneur arbre. Au tout début de la sortie de la commande, remarquez le PID du processus racine est répertorié en tant que leader. Pour voir combien de mémoire le conteneur consomme au total, vous pouvez passer le PID du leader dans Haut par fonctionnement top -p leaderpid:

[adam@localhost ~]$ top -p leaderpid lxc-5016-fedora (c198368a58c54ab5990df62d6cbcffed)

Depuis: lun. 2018-12-17 22:03:24 HNE; Il y a 19min

Leader: 5017 (systemd)

Service: libvirt-lxc; conteneur de classe

Unité: machine-lxc x2d5016 x2dfedora.scope

[adam@localhost ~]$ top -p 5017

top - 22:43:11 jusqu'à 1:11, 1 utilisateur, charge moyenne: 1.57, 1.26, 0.95

Tâches: 1 total, 0 en cours d'exécution, 1 en sommeil, 0 arrêté, 0 zombie

% Cpu (s): 1.4 us, 0.3 sy, 0.0 ni, id 98.2, 0.0 wa, 0.1 hi,  0.0 si, 0.0 st

Mémoire MiB: 15853.3 au total, 11622.5 gratuit, 2363.5 utilisé, 1867.4  Uffbuff / cache

MiB Swap: 7992.0 total, 7992.0 gratuit, 0.0 utilisé. 12906.4 disponible Mem

UTILISATEUR PID NI VIRT RES SHR S% CPU% MEM TIME + COMMAND

5017 racine 20 0 163,9 m 10,5 m 8,5 m S 0,0 0,1 0: 00,22 système

Le conteneur utilise 163 Mo de mémoire virtuelle, ce qui est plutôt maigre par rapport à les ressources utilisées par une machine virtuelle complète! Vous pouvez surveiller les E / S dans un manière similaire en exécutant sudo iotop -p leaderpid. Vous pouvez calculer la taille du disque du conteneur avec du -h / chemin / vers / conteneur. Mon pleinement conteneur approvisionné pesait à 1,4 Go.

Ces chiffres augmenteront évidemment à mesure que des logiciels et des charges de travail supplémentaires sont donnés au conteneur. J'aime avoir un environnement séparé à installer construire des dépendances, et mon utilisation la plus courante pour ces conteneurs est en cours d'exécution gnome-builder. J'ai aussi parfois mis en place un conteneur privilégié pour Exécuter darktable pour la retouche photo. J'édite des photos assez rarement pour que n'a pas de sens de garder darktable installé à l'extérieur d'un conteneur, et je trouve la notion que je pourrais tarer le système de fichiers conteneur et recréez-le sur un autre ordinateur si je voulais être rassurant. Si tu trouves vous êtes à court d'argent et avez besoin de tirer le meilleur parti de votre hôte, Pensez à utiliser un conteneur au lieu d'une machine virtuelle.

Ressources

Click to rate this post! [Total: 0 Average: 0]

Topics and keywords

Themes: Serveur d'impression

License & attribution

License: CC BY-ND 4.0.

Attribution required: yes.

Manifest: https://tutos-gameserver.fr/llm-endpoints-manifest.json

LLM Endpoints plugin version 1.1.2.