Linux - LXC; déployer des images avec le plus petit X11 possible

19

est-il actuellement possible de configurer des conteneurs LXC avec des capacités X11? J'attends avec impatience le conteneur X11 le plus léger disponible (en termes de mémoire), l'accélération matérielle un atout mais pas indispensable.

S'il n'est pas actuellement possible ou facilement disponible, sait-on quelles fonctionnalités doivent encore être mises en œuvre pour les prendre en charge?

lurscher
la source

Réponses:

15

oui, il est possible d'exécuter un environnement de bureau X11 complet dans un conteneur LXC.

En ce moment, je le fais sur Arch Linux. Je ne dirai pas que c'est "léger" car je ne suis pas allé aussi loin que d'essayer de supprimer des éléments de l'installation du gestionnaire de paquets standard, mais je peux confirmer que cela fonctionne très bien.

Vous devez installer tous les pilotes du noyau sur l'hôte ainsi que dans le conteneur. Des choses comme le pilote graphique (j'utilise nvidia). Vous devez rendre les nœuds de périphérique dans dev accessibles à l'intérieur du conteneur en configurant votre container.conf pour le permettre. Vous devez ensuite vous assurer que ces nœuds de périphérique sont créés à l'intérieur du conteneur (c'est-à-dire mknod).

Donc, pour répondre à votre question: OUI cela fonctionne. Si je peux vous aider davantage ou fournir plus de détails, veuillez me le faire savoir.

--- informations supplémentaires fournies ---

Dans mon conteneur ... / etc / inittab démarre au niveau d'exécution 5 et lance "slim" Slim est configuré pour utiliser vt09:

 # Path, X server and arguments (if needed)
 # Note: -xauth $authfile is automatically appended
 default_path        /bin:/usr/bin:/usr/local/bin
 default_xserver     /usr/bin/X
 xserver_arguments   -nolisten tcp vt09

Je n'utilise pas un deuxième affichage X sur mon vt actuel, mais complètement différent (je peux basculer entre plusieurs de ceux-ci en utilisant CTRL + ALT + Fn).

Si vous n'utilisez pas slim, vous pouvez utiliser une construction comme celle-ci pour démarrer X sur un autre vt:

 /usr/bin/startx -- :10 vt10

Cela démarrera X sur l'affichage: 10 et le mettra sur vt10 (CTRL + ALT + F10). Ceux-ci n'ont pas besoin de correspondre, mais je pense que c'est plus propre s'ils le font.

Vous avez besoin de votre configuration de conteneur pour rendre les périphériques appropriés disponibles, comme ceci:

 # XOrg Desktop
 lxc.cgroup.devices.allow = c 4:10 rwm    # /dev/tty10 X Desktop
 lxc.cgroup.devices.allow = c 195:* rwm  # /dev/nvidia Graphics card
 lxc.cgroup.devices.allow = c 13:* rwm   # /dev/input/* input devices

Et vous devez faire les appareils dans votre conteneur:

 # display vt device
 mknod -m 666 /dev/tty10 c 4 10

 # NVIDIA graphics card devices
 mknod -m 666 /dev/nvidia0 c 195 0
 mknod -m 666 /dev/nvidiactl c 195 255

 # input devices
 mkdir  /dev/input           # input devices
 chmod 755 /dev/input
 mknod -m 666 /dev/input/mice c 13 63 # mice

J'ai également configuré manuellement les périphériques d'entrée (car nous n'avons pas udev dans le conteneur)

 Section "ServerFlags"
         Option "AutoAddDevices" "False"
 EndSection

 Section "ServerLayout"
     Identifier     "Desktop"
     InputDevice    "Mouse0" "CorePointer"
     InputDevice    "Keyboard0" "CoreKeyboard"
 EndSection

 Section "InputDevice"
     Identifier "Keyboard0"
     Driver "kbd"
     Option "XkbLayout" "gb"
 EndSection

 Section "InputDevice"
     Identifier "Mouse0"
     Driver "mouse"
     Option "Protocol" "auto"
     Option "Device" "/dev/input/mice"
     Option "ZAxisMapping" "4 5 6 7"
 EndSection

Ce qui précède va dans un fichier /etc/X11/xorg.conf.d/10-input.conf

Je ne sais pas si cela vous aidera, mais bonne chance!

étoilé
la source
Je n'ai pas pu faire fonctionner cela avec nouveau, ou avec nouveau + vesa. Des indices? Dois-je utiliser le pilote propriétaire?
Robin Green
J'utilise le pilote propriétaire. Je n'ai rien essayé d'autre. Êtes-vous sur ArchLinux? J'ai installé xorg-xserver et nvidia sur l'hôte et également à l'intérieur du conteneur. Je peux ensuite installer, disons, xterm et twm à l'intérieur du conteneur pour le tester. Mon bureau quotidien est configuré autour d'OpenBox et réside à l'intérieur d'un conteneur.
starfry le
Je suis sur Fedora. Comment le testez-vous? Ce que j'ai essayé, c'est d'exécuter un serveur X à l'intérieur du conteneur à l'écran: 1, ce qui a échoué de façon spectaculaire (l'hôte X est décédé).
Robin Green
Robin, j'ai mis à jour la réponse originale avec plus de détails pour vous.
Starfry le
2

Oui, tu peux faire ça. Vous pouvez également l'utiliser lxc.mount.entrypour ne pas avoir à exécuter le script d'initialisation à l'intérieur du conteneur avec toutes les mknodcommandes. La configuration du conteneur lxc devrait donc contenir quelque chose comme ceci:

lxc.cgroup.devices.allow = c 4:7 rwm
lxc.mount.entry = /dev/tty7 dev/tty7 none bind,optional,create=file
lxc.cgroup.devices.allow = c 4:8 rwm
lxc.mount.entry = /dev/tty8 dev/tty8 none bind,optional,create=file
lxc.cgroup.devices.allow = c 10:63 rwm
lxc.mount.entry = /dev/vga_arbiter dev/vga_arbiter none bind,optional,create=file
lxc.cgroup.devices.allow = c 13:* rwm
lxc.mount.entry = /dev/input dev/input none bind,optional,create=dir
lxc.cgroup.devices.allow = c 29:0 rwm
lxc.mount.entry = /dev/fb0 dev/fb0 none bind,optional,create=file
# /dev/dri/card0 AMD Graphics card
lxc.cgroup.devices.allow = c 226:0 rwm 
lxc.cgroup.devices.allow = c 226:64 rwm
lxc.cgroup.devices.allow = c 226:128 rwm
lxc.mount.entry = /dev/dri dev/dri none bind,optional,create=dir
#lxc.cgroup.devices.allow = c 195:* rwm  # /dev/nvidia Graphics card
#lxc.mount.entry = /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
#lxc.mount.entry = /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
#lxc.cgroup.devices.allow = c 116:* rwm
#lxc.mount.entry = /dev/snd dev/snd none bind,optional,create=dir

Pour configurer les périphériques d'entrée pour X, vous pouvez utiliser evdev, ce qui est particulièrement utile si vous ne pouvez pas utiliser le xf86-input-keyboardpilote. Étant donné que le nombre exact d' event*entrées dans le fichier de configuration (par exemple /usr/share/X11/xorg.conf.d/10-lxc-input.conf) dépendra de ce qui se trouve dans / dev / input / de votre conteneur, vous pouvez utiliser un script pour en générer un:

#!/bin/bash
cat >/usr/share/X11/xorg.conf.d/10-lxc-input.conf << _EOF_
Section "ServerFlags"
     Option "AutoAddDevices" "False"
EndSection
_EOF_

cd /dev/input
for input in event*
do
cat >> /usr/share/X11/xorg.conf.d/10-lxc-input.conf <<_EOF_
Section "InputDevice"
    Identifier "$input"
    Option "Device" "/dev/input/$input"
    Option "AutoServerLayout" "true"
    Driver "evdev"
EndSection
_EOF_
done

Cela devrait être suffisant pour que X fonctionne:

/usr/bin/startx -- :0 vt07

Vous pouvez également activer l'audio, soit en passant / dev / snd, soit en configurant pulseaudio via tcp ou une socket.

Mykola Dimura
la source