Serveur d'impression

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

Par Titanfall , le 11 août 2019 - 15 minutes de lecture

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]

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.