Linux - LXC; implantar imagens com o menor X11 possível

19

atualmente é possível configurar contêineres LXC com recursos X11? Estou ansioso pelo contêiner X11 mais leve disponível (em memória), aceleração de hardware um plus, mas não essencial.

Se atualmente não é possível, ou está prontamente disponível, é conhecido que funcionalidade ainda precisa ser implementada para suportá-la?

lurscher
fonte

Respostas:

15

sim, é possível executar um ambiente de desktop X11 completo dentro de um contêiner LXC.

No momento, faço isso no Arch Linux. Não direi que é "leve", pois não tentei remover as coisas da instalação padrão do gerenciador de pacotes, mas posso confirmar que funciona muito bem.

Você precisa instalar quaisquer drivers de kernel no HOST e no contêiner. Coisas como o driver de gráficos (eu uso nvidia). Você precisa tornar os nós do dispositivo no dev acessíveis dentro do container, configurando o container.conf para permitir isso. Você precisa garantir que esses nós do dispositivo sejam criados dentro do contêiner (isto é, mknod).

Então, para responder à sua pergunta: SIM, ele funciona. Se eu puder ajudar mais ou fornecer mais detalhes, entre em contato.

--- informações adicionais fornecidas ---

No meu contêiner ... / etc / inittab inicia no nível 5 de execução e lança o "slim" Slim está configurado para usar o 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

Eu não estou usando um segundo monitor X no meu vt atual, mas um completamente diferente (posso alternar entre muitos deles usando CTRL + ALT + Fn).

Se você não estiver usando o slim, poderá usar uma construção como esta para iniciar o X em outra vt:

 /usr/bin/startx -- :10 vt10

Isso iniciará o X no display: 10 e o colocará no vt10 (CTRL + ALT + F10). Eles não precisam corresponder, mas acho que é melhor se o fizerem.

Você precisa da configuração do contêiner para disponibilizar os dispositivos relevantes, como este:

 # 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

E você precisa criar os dispositivos em seu contêiner:

 # 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

Também configurei dispositivos de entrada manualmente (já que não temos udev no contêiner)

 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

A descrição acima em um arquivo /etc/X11/xorg.conf.d/10-input.conf

Não tenho certeza se isso ajudará, mas boa sorte!

starfry
fonte
Não consegui fazer isso funcionar com o nouveau ou com o nouveau + vesa. Alguma pista? Preciso usar o driver proprietário?
Robin Green
Estou usando o driver proprietário. Eu não tentei mais nada. Você está no ArchLinux? Instalei o xorg-xserver e a nvidia no HOST e também dentro do contêiner. Posso instalar, digamos, xterm e twm dentro do contêiner para testá-lo. Minha área de trabalho todos os dias é configurada em torno do OpenBox e reside dentro de um contêiner.
starfry
Estou no Fedora. Como você está testando? O que eu tentei foi executar um servidor X dentro do contêiner na tela: 1, que falhou espetacularmente (o host X morreu).
Robin Green
Robin, atualizei a resposta original com mais detalhes para você.
starfry
2

Sim, você pode fazer isso. Você também pode usar lxc.mount.entrypara não precisar executar o script de inicialização dentro do contêiner com todos os mknodcomandos. Portanto, a configuração do lxc container deve conter algo como isto:

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

Para configurar dispositivos de entrada para o X, você pode usar evdev, o que é especialmente útil se você não puder usar o xf86-input-keyboarddriver. Como o número exato de event*entradas no arquivo de configuração (por exemplo /usr/share/X11/xorg.conf.d/10-lxc-input.conf) dependerá do conteúdo do / dev / input / do contêiner, você pode usar um script para gerar um:

#!/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

Isso deve ser suficiente para o X funcionar:

/usr/bin/startx -- :0 vt07

Você também pode ativar o áudio, passando / dev / snd, ou configurando o pulseaudio via tcp ou um soquete.

Mykola Dimura
fonte