docker - como executar o x desktop em um contêiner?

10

Estou tentando configurar minha máquina Linux para executar vários sistemas operacionais convidados, um deles sendo uma VM do Windows e outro um contêiner do Linux. O objetivo aqui é impedir que eu atrapalhe o sistema host, enquanto estiver livre para operar o sistema operacional base e jogar com o hardware host. Eventualmente, além de executar minha área de trabalho no contêiner, espero executar simulações aceleradas por gráficos, etc. Como o Docker possui uma versão git agradável dos contêineres incorporada, pareceu uma boa idéia usá-lo. Talvez a libvirt faria o mesmo com o LXC, mas o modo privilegiado do docker facilita a configuração dos dispositivos no contêiner.

Eu fiz uma pequena pesquisa e já encontrei algumas respostas, mas estou tendo problemas para montar tudo.

Formação em LXC

A execução do X no LXC me ajudou a ver como eu posso configurar um contêiner com (ie):

lxc.cgroup.devices.allow = c 226:0 rwm

e usando

mknod -m 666 dri/card0 c 226 0

dentro do contêiner para conectar-se ao dispositivo host.

Docker

De cuda - Usando a GPU em um contêiner de docker , vi que a mesma configuração pode funcionar no Docker com o back-end do LXC.

Pareceu-me que, se um contêiner de docker for executado no modo privilegiado, ele poderá acessar a GPU normalmente sem essa configuração extra. Então, iniciei um sistema básico, instalei drivers gráficos, xorg-server, xorg-xinit e um gerenciador de janelas para testá-lo.

Primeira tentativa

# startx
Cannot run from a console (or some message like that)

Ok, eu pensei que estava no tty2.

# tty
/dev/console

Não era o que eu esperava.

# chvt 2
# tty
/dev/tty2

Bem, parece que isso funcionou. Vamos tentar de # startxnovo. Iniciou o gerenciador de janelas, com o cursor no centro. Nenhuma resposta do mouse. Sem resposta do teclado. Vamos tentar mudar o tty com Ctrl-Alt+F3. Sem resposta. Bem, parece que vou ter que reiniciar a frio.

Segunda tentativa

# tty
/dev/console
# chvt 2
# tty
/dev/console

O que? Eu não posso mudar isso agora?

Contínuo

Depois de tentar outra vez, consegui alterar tty e o startx congelou o computador novamente.

E agora?

Então, agora estou em um impass. Eu realmente quero poder usar um contêiner - o Docker preferido, o LXC com libvirt também é aceitável - para executar como meu sistema operacional diário, mantendo um SO host enxuto.

É melhor usar o Docker com modo privilegiado aqui ou usar o back-end explícito do LXC e tentar as opções listadas acima?

Já estou pensando em usar a libvirt (possivelmente no vagrant-libvirt) para gerenciar meu Windows vm, então seria o mesmo para mim usar libvirt ou vagrant-LXC nesse caso?

Edit: lendo LXC vs. Docker , tenho a sensação de que, como os contêineres Docker e Docker são destinados a ambientes de aplicativo único, talvez seja melhor usar o LXC em vez do Docker para executar como meu sistema operacional diário. Pensamentos?

Edit: Eu descobri que, como o docker, existe um comando lxc-device que me permite ignorar as etapas cgroups e mknod. Enquanto antes eu era capaz de obter x para iniciar e congelar o meu sistema, apenas erros agora. Talvez eu possa descobrir isso eventualmente, já que ninguém parece estar lá fora.

Atualização: Eu tenho o mouse funcionando. No convidado, instalei o xf86-input-mouse e o xf86-input-keyboard. No host, executei o seguinte:

# lxc-device -n g1 add /dev/input/mice
# lxc-device -n g1 add /dev/dri/card0
# lxc-device -n g1 add /dev/dri/controlD64
# lxc-device -n g1 add /dev/dri/renderD128
# lxc-device -n g1 add /dev/fb0
# lxc-device -n g1 add /dev/tty2

Trabalho!

Paulo
fonte
Estou bastante convencido de que o LXC é o que preciso usar, e não o Docker. Infelizmente, é muito difícil encontrar documentação atualizada sobre a ligação de um tty específico a um contêiner, para que eu possa executar o X. Tanto o host quanto o convidado usam o systemd, enquanto toda a documentação existente é relacionada ao / etc / inittab. Alguém sabe como trabalhar com contêineres LXC corretamente para que eles "possuam" um tty no host?
Paul
Quando eu dei LXC seu próprio tty, e placas de vídeo atribuir a ele, eu tentei startxcom exec twm, mas a coisa toda foi congelado da minha perspectiva. Nenhuma resposta ao teclado ou mouse.
Paul
O unix.stackexchange.com/questions/18003/linux-lxc-deploying-images-with-tinyest-possible-x11 parece ter uma resposta relevante. Eu acho que preciso encaminhar a cadeia / dev / input. Eu vou tentar isso.
Paul
Bem, eu pensei que tinha o teclado resolvido. Mas agora não funciona novamente.
Paul

Respostas:

1

Esta pergunta teve a resposta que eu precisava. Claro, eu usei em lxc-devicevez de definições de cgroup no arquivo de configuração. No entanto, no meu caso, só consegui que o teclado funcionasse no X se o iniciar em um tty diferente.

Paulo
fonte