Docker - Wie führe ich x Desktop in einem Container aus?

10

Ich versuche, meinen Linux-Computer so einzurichten, dass mehrere Gastbetriebssysteme ausgeführt werden, von denen eines eine Windows-VM und eines ein Linux-Container ist. Das Ziel hier ist es, zu verhindern, dass ich das Host-System durcheinander bringe, während ich das Basis-Betriebssystem bedienen und mit der Host-Hardware spielen kann. Zusätzlich zum Ausführen meines Desktops im Container hoffe ich, grafikbeschleunigte Simulationen usw. ausführen zu können. Da Docker über eine so nette git-ähnliche Versionierung von Containern verfügt, schien es eine gute Idee zu sein, diese zu verwenden. Vielleicht würde libvirt mit LXC genauso gut funktionieren, aber der privilegierte Modus von Docker macht es einfacher, keine Geräte für den Container konfigurieren zu müssen.

Ich habe ein wenig recherchiert und bereits ein paar Antworten gefunden, aber ich habe Probleme, alles zusammenzusetzen.

Hintergrund in LXC

Durch Ausführen von X von LXC konnte ich sehen, wie ich einen Container mit (dh) konfigurieren kann:

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

und mit

mknod -m 666 dri/card0 c 226 0

innerhalb des Containers, um eine Verbindung zum Host-Gerät herzustellen.

Docker

Von cuda - Mit der GPU aus einem Docker-Container habe ich gesehen, dass ich das gleiche Setup für Docker mit dem LXC-Backend erhalten kann.

Mir schien, wenn ein Docker-Container im privilegierten Modus ausgeführt wird, kann er ohne diese zusätzliche Konfiguration normal auf die GPU zugreifen. Also habe ich ein Basissystem gestartet, Grafiktreiber, xorg-server, xorg-xinit und einen Fenstermanager installiert, um es zu testen.

Erster Versuch

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

Okay, ich dachte ich wäre auf tty2.

# tty
/dev/console

Das habe ich nicht erwartet.

# chvt 2
# tty
/dev/tty2

Nun, es scheint, als ob das funktioniert hat. Versuchen wir es noch # startxeinmal. Es startete den Fenstermanager mit dem Cursor in der Mitte. Keine Mausantwort. Keine Tastaturantwort. Versuchen wir, das tty mit zu ändern Ctrl-Alt+F3. Keine Antwort. Nun, es sieht so aus, als müsste ich kalt neu starten.

Zweiter Versuch

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

Was? Ich kann es jetzt nicht ändern?

Fortsetzung

Nachdem ich es ein anderes Mal versucht hatte, ließ ich es tty ändern und startx fror den Computer erneut ein.

Was jetzt?

Also bin ich jetzt in einer Sackgasse. Ich möchte wirklich in der Lage sein, einen Container zu verwenden - Docker bevorzugt, LXC mit libvirt ist ebenfalls akzeptabel -, um als mein tägliches Betriebssystem ausgeführt zu werden und gleichzeitig ein schlankes Host-Betriebssystem beizubehalten.

Ist es am besten, Docker hier im privilegierten Modus zu verwenden oder das explizite LXC-Backend zu verwenden und die oben aufgeführten Optionen auszuprobieren?

Ich plane bereits, libvirt (möglicherweise unter vagrant-libvirt) zum Verwalten meiner Windows-VM zu verwenden. Wäre es in diesem Fall für mich ungefähr dasselbe, libvirt oder vagrant-LXC zu verwenden?

Bearbeiten: Beim Lesen von LXC vs. Docker habe ich das Gefühl, dass Docker- und Docker-Container für Umgebungen mit nur einer Anwendung gedacht sind. Daher ist es möglicherweise am besten, LXC anstelle von Docker als tägliches Betriebssystem zu verwenden. Gedanken?

Bearbeiten: Ich habe festgestellt, dass es wie bei Docker einen Befehl lxc-device gibt, mit dem ich die Schritte cgroups und mknod umgehen kann. Während ich x dazu bringen konnte, mein System zu starten und einzufrieren, ist es jetzt nur ein Fehler. Vielleicht kann ich das irgendwann herausfinden, da niemand da draußen zu sein scheint.

Update: Ich habe die Maus funktioniert. Auf dem Gast habe ich xf86-Eingabemaus und xf86-Eingabetastatur installiert. Auf dem Host habe ich Folgendes ausgeführt:

# 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

Funktioniert!

Paul
quelle
Ich bin ziemlich davon überzeugt, dass ich LXC verwenden muss und nicht Docker. Leider ist es ziemlich schwierig, eine aktuelle Dokumentation zum Binden eines bestimmten Tty an einen Container zu finden, damit ich X ausführen kann. Sowohl mein Host als auch mein Gast verwenden systemd, während die gesamte Dokumentation mit / etc / inittab zusammenhängt. Weiß jemand, wie man mit LXC-Containern richtig arbeitet, um sie dazu zu bringen, eine tty auf dem Host zu "besitzen"?
Paul
Als ich LXC seine eigene Tty gab und ihm Grafikkarten zuwies, versuchte ich es startxmit exec twm, aber das Ganze war aus meiner Sicht eingefroren. Keine Antwort auf Tastatur oder Maus.
Paul
unix.stackexchange.com/questions/18003/linux-lxc-deploying-images-with-tiniest-possible-x11 scheint eine relevante Antwort zu haben. Ich denke, dass ich die / dev / Input-Kette weiterleiten muss. Ich werde das versuchen.
Paul
Nun, ich dachte, ich hätte die Tastatur aussortiert. Aber jetzt funktioniert es nicht mehr.
Paul

Antworten:

1

Diese Frage hatte die Antwort, die ich brauchte. Natürlich habe ich lxc-deviceanstelle von cgroup-Definitionen in der Konfigurationsdatei verwendet. In meinem Fall habe ich die Tastatur jedoch nur dann in X zum Laufen gebracht, wenn ich sie auf einem anderen tty starte.

Paul
quelle