Leserartikel [Guide] LXC Container mit GUI und Sound

shinXdxd

Lt. Junior Grade
Dabei seit
Feb. 2018
Beiträge
277
Da ich es nun endlich geschafft habe grafische Anwendungen in LXC Containern zum laufen zu bekommen möchte ich das gerne teilen. Bitte verwechselt nicht LXC und LXD Container.
Natürlich gab es genug Probleme bis es endlich funktionierte, hoffentlich hlift es um euch etwas Frust zu ersparen.

Ich bin sicherlich kein guter Verfasser von Texten, daher entschuldigt falls etwas nicht gut formuliert ist.


Vorwort
Auf meinem Host läuft Void Linux, somit gibt es hier kein Systemd und dadurch hat man etwas mehr Arbeit um Container, die Systemd verwenden zu starten.​
Der Guide basiert darauf, einen Container mit Debian einzurichten. Natürlich könnt ihr euer gewünschtes System im Container installieren, ich konnte allerdings unter Arch (und Sabayon) keine grafischen Programme zum starten bekommen. Die Fehlermeldung hier war immer: Could not open DISPLAY :0 . Damit ihr euch hier viel Ärger erspart würde ich euch raten, nicht Arch oder Sabayon im Container zu installieren.
Update: Habe es mit Arch geschafft​
Funktioniert haben Debian, Ubuntu und Opensuse.​
Alle nicht erwähnten Distributionen wurden nicht von mir getestet.​


1. Motivation
Warum sollte ich das überhaupt machen wollen?​
Ich persönlich möchte einfach (möglichst) keine proprietäre Software auf meinem Hauptsystem installiert haben. Leider lässt sich das nicht ganz vermeiden wenn man eine Nvidia Grafikkarte hat und die Nouveau-Treiber nicht ausreichend sind.​
Ich habe zum Beispiel Steam in einem Debian-sid Container installiert.​
Auch möchte ich Wine nicht auf meinem Host haben, da ich hier schon die Erfahrung gemacht habe, dass gerne Defaults geändert werden. Für mich ist es einfach nicht in Ordnung, wenn ich ein .gif öffne und plötzlich startet der Internet-Explorer.​
Natürlich wäre eine VM auch eine Option, hier müsste man allerdings entweder 2 GPUs verwenden oder aber den Host Headless laufen lassen, während man die VM verwendet. Außerdem gibt es weniger Leistungsverlust und weniger Resourcenverbrauch.​
Außerdem habe ich auch gerne einen "sauberen" Host und teile mir mein System in Container für z.b. Gaming, Arbeit, Programmieren etc. auf.​
Man kann es natürlich auch einfach nur verwenden, um Pakete zu installieren die bei der Host Distribution nicht vorhanden sind.​


2. Benötigte Software am Host
  • LXC
  • Text-Editor eurer Wahl (z.b. nano oder leafpad)
  • optional? Pulseaudio (ich habe es nicht mit alsa getestet)
  • optional: Virt-Manager
Hinweis: Ich verwende das Network-interface von Virt-Manager (virbr0) anstatt der Lxc-Bridge lxcbr0.​
Dies hat 2 Gründe:​
1. Ich möchte nicht zig Netzwerk-Interfaces haben.​
2. Ich habe es nicht geschafft eine Internetverbindung der Container mit lxcbr0 herzustellen.​
Es sollte ausreichend sein LXC zu installieren, der Package Manager installiert alle benötigen Abhängigkeiten.​
Unter Debian und Derivaten wäre das ein​
sudo apt install lxc
und für den virt-manager​
sudo apt install virt-manager


3. Einstellungen und Konfiguration des Hosts


Als erstes aktivieren wir unprivilegierte Container.​
Dazu müssen wir folgende Zeile​
session optional pam_cgfs.so -c freezer,memory,name=systemd,unified
in der Datei /etc/pam.d/system-login einfügen.​
Das könnt ihr mit einem Text-Editor oder mit folgendem Befehl machen:​
Code:
echo "session   optional   pam_cgfs.so -c freezer,memory,name=systemd,unified" | sudo tee -a /etc/pam.d/system-login
(ich bin mir nicht 100% sicher ob diese Zeile notwendig ist, ihr könnt es sonst ja einfach ohne testen)​
Als nächstes müssen wir noch die 2 Dateien /etc/subgid und /etc/subuid editieren.​
Mit den Standard-Einstellungen sehen diese beiden Dateien z.b. so aus:​
root:100000:65536
Im Terminal könnt ihr einfach cat /etc/subuid und der Inhalt der Datei wird ausgegeben, natürlich könnt ihr die Datei auch mit eurem beliebigen Texteditor bearbeiten.​

Wir müssen nun eine Zeile für unseren Benutzer in beiden Dateien hinzufügen.​
Dazu verwenden wir die 2 Befehle​
echo "$(whoami):10000:65536" | sudo tee -a /etc/subgid
echo "$(whoami):10000:65536" | sudo tee -a /etc/subuid
In meinem Fall sehen beide Dateien nun so aus:​
Bash:
shanks3042:100000:65536
root:100000:65536
Hinweis: Ihr könnt auch anderen Zahlen als 100000 nehmen. Eine kurze Erklärung: Der Root im Container erscheint am Host in diesem Beispiel als 100000. Das ist sozusagen eure "Start-Id" der Container.​
Wenn ihr in den Ordner eures Containers wechselt, so wird hier angezeigt und ls -la ausführt, so wird angezeigt, dass die Ordner der Id 100000 gehören Bsp: drwxr-xr-x 1 100000 100000 1164 10. Aug 07:27 bin
Die zweite Zahl gibt an, wie viele Id's es im Container geben kann. Mit 65536 Id's hat man hier wohl ausreichend Platz für einzelne User.​
Wählt diese Zahl allerdings nicht zu niedrig, damit auch für "System"-User und Gruppen noch genügend Platz vorhanden ist, falls ihr sie niedriger wählt.​


4. Konfiguration für Container anpassen
Wie vorhin bereits erwähnt, verwende ich als Netzwerk"brücke" virbr0.
Falls die Datei noch nicht vorhanden ist, dann erstelt eine Datei in Eurem Home-Ordner​
nano ~/.config/lxc/default.conf
Bash:
#configure which network interface to use
lxc.net.0.type = veth
lxc.net.0.link = virbr0
lxc.net.0.flags = up


lxc.mount.entry = /dev/dri dev/dri none bind,optional,create=dir
lxc.mount.entry = /dev/snd dev/snd none bind,optional,create=dir

#input devices will be detected inside container. required if you want to use xbox-controller
lxc.mount.entry = /dev/input dev/input none bind,optional,create=dir

lxc.mount.entry = /tmp/.X11-unix tmp/.X11-unix none bind,optional,create=dir


#bind-mounts for nvidia proprietary driver
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.mount.entry = /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file
lxc.mount.entry = /dev/nvidia-modeset dev/nvidia-modeset none bind,optional,create=file


lxc.idmap = u 0 100000 1000
lxc.idmap = g 0 100000 1000


lxc.idmap = u 1000 1000 1
lxc.idmap = g 1000 1000 1


lxc.idmap = u 1001 101001 64535
lxc.idmap = g 1001 101001 64535


lxc.hook.pre-start=~/.config/lxc/preStartHook.sh
Die letzte Zeile könnt ihr auch ändern in /home/YOUR_USER/... statt ~/
Als erstes geben wir an, welches Netzwerkinterface die Container verwenden sollen.​
Mit ip link könnt ihr nachsehen, Welche auf eurem System vorhanden sind.​
Bash:
...
3: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
   link/ether 52:5...
...
Solltet ihr keine Nvidia Grafikkarte haben, könnt euch den Teil mit den Nvidia-Treibern natürlich sparen.​
Zur idmap:​
Hier wird definiert, dass die Id's 0 bis 999 im Container auf dem Host zu 100000 bis 100999 gemappt werden.​
Um die Dinge zu erleichtern, mappen wir die id 1000 im Container auf die id 1000 im Container. Das ist Standardmäßig der 1. User unter Linux, manche Distributionen starten hier mit anderen Werten.​
Am Host könnt ihr die Id eures Users herausfinden, indem ihr id ins terminal tippt.​
Gegebenfalls müsst ihr hier die Zeilen anpassen.​
Die 1. Zahl gibt die Start-Id im Container an, die 2. Zahl gibt die Id des Container-Users am Host an, die 3. Zahl gibt an wie viele Id's (der Reihe nach) gemappt werden sollen.​
Da wir 65536 User im Container erstellen können (siehe subuid/subgid) müssen wir auch die restlichen Id's mappen.​
Hier kommt also etwas Rechenarbeit ins Spiel.​
die Id's 0 bis 1000 sind bereits gemappt, da wir bei 0 zu zählen beginnen sind also bereits 1001 Id's gemappt.​
Also Rechnen wir nun 65536 - 1001 = 64535
Also starten wir nun bei Id 1001 (im Container), das wäre somit 101001am Host. Es müssen alle Id's im Container gemappt werden.​
Bash:
lxc.mount.entry = /dev/dri dev/dri none bind,optional,create=dir
lxc.mount.entry = /dev/snd dev/snd none bind,optional,create=dir
lxc.mount.entry = /tmp/.X11-unix tmp/.X11-unix none bind,optional,create=dir


Wenn ihr noch eine Webcam einbinden wollt, dann fügt noch lxc.mount.entry = /dev/video0 dev/video0 none bind,optional,create=file ein.​
Diese Befehle sind dazu da, dass der Container die Treiber, den X-Server und den Sound-Server des Hosts verwenden kann. (korrigiert mich wenn ich mich hier irre).​
Für Arch Container:
Fügt als ersten mount entry direkt nachlxc.net.0.flags = up folgendes hinzu:​
lxc.mount.entry = tmpfs tmp tmpfs defaults


5. prestartHook.sh


Damit die Container starten, und auch der Sound funktioniert, müssen wir das beim Container-Start noch einrichten.​
Das erledigt das Script für uns.​
Wo ihr dieses Script abspeichert und wie ihr es nenn ist euch überlassen, aus meiner Sicht gehört es zur Konfiguration der Container, deshalb liegt es bei mir unter ~/.config/lxc/prestartHook.sh
Für den Sound gibt es nun 2 Möglichkeiten.​
Bei mir hat Variante 1 leider nicht Funktioniert.​
Variante 1:​
Bash:
#!/bin/sh
PULSE_PATH=$LXC_ROOTFS_PATH/home/USERNAME_IM_CONTAINER/.pulse_socket
if [ ! -e "$PULSE_PATH" ] || [ -z "$(lsof -n $PULSE_PATH 2>&1)" ]; then
  pactl load-module module-native-protocol-unix auth-anonymous=1  socket=$PULSE_PATH
fi

Der Pfad muss noch angepasst werden, je nachdem wie ihr euren Benutzer im Container nennt. (Der fett markierte Teil)​
Damit sollte der Sound im Container funktionieren.​
Variante 2:​
Sollte Variante 1 bei euch genau so wenig funktionieren wie bei mir, werden wir den sound via PulseAudio-TCP Modul schicken​
Seht als erstes via ip addr nach, welche Ip's eure Container bekommen.​
Code:
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:... brd ff:ff:...
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
Uns interessiert hier nur der fett markierte Teil, 192.168.122.1/24
Bash:
#!/bin/sh

PULSE_PATH=$LXC_ROOTFS_PATH/home/USERNAME_IM_CONTAINER/.pulse_socket

#if module is already loaded
if [ $(pactl list | grep -c "module-native-protocol-tcp") -ge 1 ]; then
echo "module already loaded, exit"
exit
fi

#only allow connections from local host and lxc bridge
#echo "loading module"
pactl load-module module-native-protocol-tcp auth-ip-acl="127.0.0.1;192.168.122.0/24"
Auch hier müsst ihr den Pfad wie in Variante 1 anpassen.​
Ändert hier die letzte Zeile, so dass ihr die Ip eurer "Bridge" habt, allerdings müsst ihr es auf ....0./24 ändern.​
Zu guter letzt müssen wir es noch erlauben, dass das Skript ausführbar ist. Das erreichen wir mit chmod +x ~/.config/lxc/prestartHook.sh


5.1 Wenn der Host kein Systemd hat
In diesem Fall muss man noch etwas mehr in das prestartHook.sh packen.​
Es gibt auch die Möglichkeit das mit cgmanager zu lösen, hat bei mir aber nicht funktioniert. Es sind auch nur ein paar Zeilen bash-code.​
Bash:
mountpoint -q "/sys/fs/cgroup/systemd" \
   || (sudo mkdir -p /sys/fs/cgroup/systemd && sudo mount -t cgroup cgroup -o none,name=systemd /sys/fs/cgroup/systemd)


  for d in /sys/fs/cgroup/*; do
    f=$(basename $d)
    if [ "$f" = "unified" ]; then
        continue
    elif [ "$f" = "cpuset" ]; then
        echo 1 | sudo tee -a $d/cgroup.clone_children;
    elif [ "$f" = "memory" ]; then
        echo 1 | sudo tee -a $d/memory.use_hierarchy;
    fi
    sudo mkdir -p $d/$USER
    sudo chown -R $USER $d/$USER
    echo $PPID > $d/$USER/tasks
  done

Damit man das ganze auch ohne Passwort ausführen kann fügt das noch in /etc/sudoers ein:
Code:
Cmnd_Alias CGRP_MKDIR = /bin/mkdir -p /sys/fs/cgroup/*/shanks3042
Cmnd_Alias CG_TEE = /usr/bin/tee -a /sys/fs/cgroup/*
Cmnd_Alias CG_CHOWN = /bin/chown -R k /sys/fs/cgroup/*/shanks3042
Cmnd_Alias CG_MAKE_SYSTEMD_DIR = /bin/mkdir -p /sys/fs/cgroup/systemd
Cmnd_Alias CG_SYSTEMD_MOUNT = /bin/mount -t cgroup cgroup -o none\,name\=systemd /sys/fs/cgroup/systemd

shanks3042 ALL=(ALL) NOPASSWD: CGRP_MKDIR, CG_TEE, CG_CHOWN, CG_MAKE_SYSTEMD_DIR, CG_SYSTEMD_MOUNT




6. Container erstellen
Ich bin kein Freund von Fixed-Releases, daher werde ich mir für den Container ein System mit Rolling-Release aussuchen.
Welches ihr nehmt bleibt euch überlassen, bedenkt jedoch dass ich im Vorwort erwähnt habe, dass es z.B. bei Arch und Sabayon zu Problemen kommen kann.
Den Namen des Containers bestimmt man mit -n NAME[SIZE=3]. Es kann etwas dauern, bis alle templates geladen sind.[/SIZE]​
Wir erstellen nun den Container via
lxc-create -t download -n sid1
Ihr werdet nun nach eurer gewünschten Distribution, dem Release und der Architektur gefragt. Bestätigt mit enter.​
Bei mir wäre das nun​
Code:
Distribution:
debian
Release:
sid
Architecture:
amd64
Möchtet ihr den Container wieder könnt ihr das einerseits via lxc-destroy container-name. In dem Beispiel wäre das nun also lxc-destroy sid1. Andererseits könnt ihr den Container auch via rm -Rf löschen.​
Standardmäßig liegen unprivilegierte Container unter ~/.local/share/lxc/. Ihr könnt den Container also auch via rm -Rf ~/.local/share/lxc/sid1 löschen.​
Ergänzung ()

7 Container einrichten
Benötigte Anwendungen im Container:​
  • Pulseaudio oder ALSA
    • Ich konnte bekam mit alsa und steam keinen sound, daher empfehle ich pulseaudio

      Optionale Pakete im Container:
  • Nvidia Treiber (Installtion siehe weiter unten, benötigt man natürlich nicht mit einer AMD-Grafikkarte [IMG]https://www.computerbase.de/forum/file:///tmp/lu13876ow3ijr.tmp/lu13876ow3imp_tmp_f1264a5d130172ba.gif[/IMG] )
    • nano
    • x11-apps (verwende ich gerne zum testen, ob das einrichten funktioniert hat)
    • sudo
Wir starten jetzt den Container mit lxc-start sid1 und begeben uns in die shell des Containers mit lxc-attach sid1.​
Als erstes ändern wir das root-passwort via passwd root. (Optional)​
Um Bash als Standard root-shell zu verwenden, ändern wir diese noch chsh -s /bin/bash root (Optional)​
Jetzt installieren wir ein paar der benötigten Pakete.​
apt update && apt install sudo nano x11-apps pulseaudio bash-completion
7.1 Container - User einrichten


Der nächste Schritt ist das Erstellen eines users im Container.​
In einigen Distributionen gibt es die Gruppe sudo nicht, hier tauscht ihr sudo einfach gegen wheel oder ihr lasst es weg.​
Je nach Bedarf könnt ihr eurem User natürlich noch weitere Gruppen zuordnen (z.b. games,cdrom,video,users ... )​
useradd -m -G pulse,pulse-access,audio,sudo shanks3042
Ein Passwort für den User muss noch gesetzt werden, das machen wir wieder mit passwd shanks3042
Optional: Die shell des users auf bash ändern chsh -s /bin/bash shanks3042


7.2 Container testen und Gui konfigurieren
Als erstes müsst ihr herausfinden, welches "Display" euer Host verwendet, das ist standardmäßig 0.​
Gebt hierfür einfach echo $DISPLAY im Terminal ein.​
Der user ist erstellt, also loggen wir uns jetzt mit dem user ein. Dazu gehen wir erst aus der Container-Shell mit exit
Wir loggen uns nun in der shell des Containers mit unserem neu erstellten Benutzer ein.​
lxc-console sid1
Code:
sid1 login: shanks3042
Password:
Linux sid1 5.7.12_1 #1 SMP Sat Aug 1 07:52:51 UTC 2020 x86_64
Wenn wir uns nun mit dem user eingeloggt haben, testen wir als erstes ob die Gui-Applikationen funktionieren. Wenn ihr vorhin xcalc installiert habt, dann könnt ihr nun DISPLAY=:0 xcalc eintippen.​
Ihr werdet nun entweder sehen, wie sich xcalc öffnet oder ihr bekommt die Nachricht Error: Can't open display: :0.​
Die Lösung für das Problem: Gebt am Host xhost +local:$(whoami) ein. (Tauscht hier shanks3042 gegen euren usernamen aus). Somit können alle User mit der gleichen Id (nur die Id am Host zählt) den X-Server verwenden. Wenn ihr allen Container-usern das Verwenden eures X-Servers erlauben wollt, dann könnt ihr auch einfach nur xhost +local: eingeben.​
Soweit ich weiß, ist es sicherheitstechnisch zu bevorzugen, wenn man xhost + nicht verwendet, warum weiß ich aber leider auch (noch) nicht.​
[IMG]https://www.computerbase.de/forum/file:///tmp/lu13876ow3ijr.tmp/lu13876ow3imp_tmp_d14ed958a0773bfc.png[/IMG]​
1597099625600.png
Um das ganze im Container zu automatisieren fügen wir noch in unser .bashrc export DISPLAY=:0 ein.​
echo "export DISPLAY=:0" >> ~/.bashrc
Damit wir nicht jedes mal am Host xhost +local: ausführen müssen, fügen wir diese Zeile in unser .bash_profile ein.​
echo "xhost +local:$(whoami)" >> ~/.bash_profile
Damit die Änderungen übernommen werden, müsst ihr euch neu einloggen. Einfach exit, und dann Benutzername + Passwort erneut eingeben.​


7.3 Container - Sound
Solltet ihr die Variante 1 für den Sound gewählt haben, so sollte dieser bereits funktionieren.​
Für Variante 2 müssen wir den PULSE_SERVER des Containers ähnlich wie das Display exportieren.​
Hierzu benötigt ihr die Ip eures Hosts.​
Um den Sound zu testen habt ihr mehrere Möglichkeiten.​
Kopiert die Audio-Datei für Variante 1 und 2 in ~/.local/lxc/sid1/rootfs/home/shanks3042/​
  1. Eine .wav Datei abspielen.
    1. Hierfür wird alsa-utils benötigt.
      1. Pulse über TCP: PULSE_SERVER=eure_host_ip aplay song.wav
      2. Pulse ohne TCP: aplay song.wav

    2. Eine .mp3 Datei abspielen.
      1. Hierfür muss man mpg123 installieren
      2. Pulse über TCP: PULSE_SERVER=eure_host_ip mpg123 song.mp3
      3. Pulse ohne TCP: mpg123 song.mp3

    3. Installiert einen Browser (z.B. Firefox) und spielt ein Video ab.
      1. Falls ihr den Server über TCP, vergesst nicht den Browser via PULSE_SERVER=eure_host_ip firefox zu starten.
Da wir natürlich nicht jedes Programm so umständlich starten wollen, fügen wir diese 1 Zeile wieder in unser ~/.bashrc​
echo "export PULSE_SERVER=eure_host_ip" >> ~/.bashrc
Damit die Änderungen übernommen werden, müsst ihr euch neu einloggen. Einfach exit, und dann Benutzername + Passwort erneut eingeben.​


7.4 Container - Nvidia Treiber


Damit es später keine unerwarteten Probleme mit 32-Bit Anwendungen gibt, aktivieren wir als 1. den 32-Bit support (z.B. Steam)​
sudo dpkg --add-architecture i386
Wir benötigen auch noch ein paar Pakete, damit die Treiber sich installieren lassen.​
sudo apt install kmod pkg-config libglvnd0 libglvnd-dev
DEn Treiber für den Container sollte man manuell installieren und nicht über die Paketverwaltung des Containers.​
Es ist wichtig, dass der Host und der Container die gleiche Treiberversion haben.​
Ihr könnt eure Version z.b. mit nvidia-settings --version herausfinden. Ladet den Treiber also von der Nvidia- Seite herunter. (LInux-64bit)​
Eure Dateiname kann sich je nach Treiberversion unterscheiden.​
Kopiert/verschiebt die Datei NVIDIA-Linux-x86_64-450.57.run in das Home Verzeichnis eures Container-Users ~/.local/share/lxc/sid1/rootfs/home/shanks3042
Die Installation starten wir mit sudo ./NVIDIA-Linux-x86_64-450.57.run --no-kernel-module
1.png
2.png
3.png
4.png
5.png
Nvidia wird eine "Warnung" anzeigen, dass das Kernel-Modul nicht installiert wird. Wenn ihr Anwendungen wie Steam benötigt, dann müsst ihr auch die 32-bit Treiber installieren.​
Ein paar Warnungen könnt ihr ignorieren. Darunter folgende:​
Code:
WARNING: You specified the '--no-kernel-module' command line option, nvidia-installer will not install a kernel module as part of this driver installation, and it will not remove existing NVIDIA kernel modules not part of an earlier
NVIDIA driver installation. Please ensure that an NVIDIA kernel module matching this driver version is installed separately.
Code:
WARNING: nvidia-installer was forced to guess the X library path '/usr/lib' and X module path '/usr/lib/xorg/modules'; these paths were not queryable from the system.  If X fails to find the NVIDIA X driver module, please install the `pkg-config` utility and the X.Org SDK/development package for your distribution and reinstall the driver.
Sollten Warnungen erscheinen, dass Pakete fehlen, lest euch diese Warnung durch, kopiert sie euch, brecht mit STRG+C ab und installiert diese Pakete nach. Danach startet ihr die Installation einfach neu.​
Falls ihr z.B. steam installiert habt, testet mit steam ob das Programm startet.​




8. Start Scripts für Anwendungen
Da wir nicht jedes mal den Container starten wollen, und unsere Anwendungen via Terminal starten wollen, erstellen wir uns Start-Scripts um diese mit 1 Klick zu starten.​
Dazu erstellen wir am besten im gleichen Ordner, wo sich das rootfs und die config Datei des Containers befinden unsere Scripts.​
(~/.local/share/lxc/sid1/)​
Wenn ihr z.b. Steam installiert habt, dann erstellen wir nun ein Script (ihr könnt den Namen frei wählen).​
Da ich nun nicht mehr im Container, sondern am Host arbeite werde ich jetzt Kate als Editor verwenden, da auf meinem Host Plasma als DE läuft, und das der Standard-Editor ist. Auch benötigt man jetzt keine Root-Rechte mehr.​
[IMG]https://www.computerbase.de/forum/file:///tmp/lu13876ow3ijr.tmp/lu13876ow3imp_tmp_eb03f7584b098cdc.png[/IMG] [IMG]https://www.computerbase.de/forum/file:///tmp/lu13876ow3ijr.tmp/lu13876ow3imp_tmp_eb03f7584b098cdc.png[/IMG]​
Vergesst nicht, dass das Script ausführbar sein muss. Entweder via chmod +x oder über die Gui eures File-Managers.​
1597099536500.png
[IMG]https://www.computerbase.de/forum/file:///tmp/lu13876ow3ijr.tmp/lu13876ow3imp_tmp_9c78dfcb71a92c80.png[/IMG]​
Bash:
#!/bin/sh
CONTAINER=sid
user=shanks3042
CMD_LINE="steam &>/dev/null &"


STARTED=false


if ! lxc-wait -n $CONTAINER -s RUNNING -t 0; then
    lxc-start -n $CONTAINER -d
    lxc-wait -n $CONTAINER -s RUNNING
    STARTED=true
fi


#PULSE_SOCKET=/home/$user/.pulse_socket


lxc-attach --clear-env -n $CONTAINER -- sudo -u $user -i  $CMD_LINE


if [ "$STARTED" = "true" ]; then
    lxc-stop -n $CONTAINER -t 10
fi
Ändert die ersten 3 Zeilen, so dass der​
  • CONTAER=Containername,
    • user= username im Container
    • CMD_LINE= Programm welches gestartet werden soll.
      • &>/dev/null & könnt ihr euch sparen, einfach nur steam ist ausreichend.
Es kann sein, dass ihr die Zeile​
lxc-attach --clear-env -n $CONTAINER -- sudo -u $user -i $CMD_LINE
noch anpassen müsst auf:​
lxc-attach --clear-env -n $CONTAINER -- sudo -u $user -i env DISPLAY=$DISPLAY PULSE_SERVER=deine_host_ip $CMD_LINE
Nun fehlt nur noch eine .desktop file unter ~/.local/share/applications​
[IMG]https://www.computerbase.de/forum/file:///tmp/lu13876ow3ijr.tmp/lu13876ow3imp_tmp_f59f0b55ccbc4c4f.png[/IMG]​
Code:
[Desktop Entry]
Version=1.0
Name=Steam
Comment=Access Steam
Exec=/home/shanks3042k/.local/share/lxc/sid/steam.sh %U
Icon=/home/shanks3042k/.local/share/lxc/sid/rootfs/usr/share/icons/hicolor/256x256/apps/steam.png
Type=Application
Categories=Game;
hier müsst ihr eintragen:​
  • Name der Desktop File ist (Dieser wird unter eurem Startmenü angezeigt.)
    • Comment=Kommentar/Beschreibung - kann man auch leer lassen
    • Exec=Script, welches ausgeführt werden soll
    • Icon= Das Logo, welches man verwenden soll
    • Type=Application
    • Categories= Alle Kategorien, zu denen das Programm gehören Soll (z.B. Game,Network,...)
Nun solltet ihr euer Programm in eurem Startmenü / Launcher finden und mit 1 Klick starten können.​
1597681737400.png
Achtung: Bei steam bekommt ihr leider kein Tray-Icon.​

Quellen:
[1] Gentoo Wiki
[2] Arch Wiki
[3] Stephane Graber's Blog

Leider war der Beitrag etwas zu lang, so dass ich ihn in 2 Beiträge aufteilen musste, ich hoffe die Formatierung passt trotzdem noch.
Viel Spaß beim austesten, ich hoffe das ganze verständlich erklärt zu haben.
Konstruktive Kritik nehme ich gerne an, destruktive Kritik könnt ihr euch sparen.
Sofern ihr hier auf den Originalbeitrag verlinkt könnt ihr ihn gerne teilen - auch mit Änderungen.
:daumen:
Ergänzung ()

Platzhalter1
Ergänzung ()

Platzhalter2
 

Anhänge

  • 1597099418000.png
    1597099418000.png
    168,5 KB · Aufrufe: 135
  • 1597099436200.png
    1597099436200.png
    26,1 KB · Aufrufe: 132
  • 1597099467100.png
    1597099467100.png
    25,4 KB · Aufrufe: 125
  • 1597099496200.png
    1597099496200.png
    25,4 KB · Aufrufe: 103
  • 1597099513100.png
    1597099513100.png
    25,4 KB · Aufrufe: 111
  • 1597099524400.png
    1597099524400.png
    25,4 KB · Aufrufe: 102
  • 1597099543900.png
    1597099543900.png
    6,5 KB · Aufrufe: 94
  • 1597099578400.png
    1597099578400.png
    5 KB · Aufrufe: 92
  • 1597099582900.png
    1597099582900.png
    8,4 KB · Aufrufe: 92
  • 1597099587300.png
    1597099587300.png
    8,4 KB · Aufrufe: 90
  • 1597100186800.png
    1597100186800.png
    5 KB · Aufrufe: 84
  • 1597100193400.png
    1597100193400.png
    8,4 KB · Aufrufe: 79
Zuletzt bearbeitet:

Rassnahr

Lt. Commander
Dabei seit
Dez. 2010
Beiträge
1.163
Ich habe mal soetwas ähnliches mit docker bzw. x11docker umgesetzt aber einige steam spiele sind damit nicht klar gekommen, lutris funktioniert dagegen ganz gut.
 

shinXdxd

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Feb. 2018
Beiträge
277
@Uridium Den User zu wechseln fände ich da ziemlich nervig,
außerdem müsste man dann aber zum vollständigen entfernen suchen wo Dateien angelegt wurden. Da kann man sich auch zum mal schnell einen Container erstellen.
Jedem/r das seine/ihre.
Den Container kann ich auch einfach auf einen 2. Rechner übertragen.
Mein Host ist relativ minimal mit KDE Base, Firefox,Thunderbird, LXC, Virt-Manager.

Ich habe mal soetwas ähnliches mit docker bzw. x11docker umgesetzt aber einige steam spiele sind damit nicht klar gekommen, lutris funktioniert dagegen ganz gut.

Weißt du noch welche das waren? Falls dir noch eines einfällt und ich das Spiel auch besitze würde ich das testen.
 
Zuletzt bearbeitet:

SirBerserk

Lt. Junior Grade
Dabei seit
Mai 2014
Beiträge
501
könnte man sich mit den containern ein besser laufendes qubes os basteln? oder bin ich da auf dem holzweg?^^
 

Telvanis

Lt. Junior Grade
Dabei seit
Dez. 2015
Beiträge
306
Danke für diesen interessanten Beitrag. Hatte mit Containern bis jetzt nur auf CMD-Basis zu tun, das ganze mit ner grafischen Oberfläche auszuprobieren, ist natürlich nochmal ne ganze Ecke interessanter ^^
 

sc0repi0

Lt. Junior Grade
Dabei seit
Mai 2008
Beiträge
401
Super Guide, danke dafür, auch wenn "abgetrenntes" GUI ein absoluter Sonderfall wäre, zumindest bei mir. Aber gut zu wissen, dass es geht, wenn man komplett frei auch mal unfrei sein möchte :daumen:

Das Anwendungsgebiet für LXC ist halt in meinen Augen für jailen besser als Docker oder irre ich mich? Ich würde Nginx rein vom Gefühl her lieber in einem LXC starten, als ein Docker-Image irgendwo runterzuziehen.

Jedesmal wenn ich einen Docker-Container starte, meine ich zu hören, dass irgendwo ein Security-Spezialist einen Herzinfarkt bekommt.
 

shinXdxd

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Feb. 2018
Beiträge
277
@sc0repi0 schwieriges Thema, ich kann das auch schwer beantworten da ich nicht viel Ahnung von Docker habe.
Soweit es mir bekannt ist, ist der große Unterschied: Docker ist für einzelne Anwendungen gedacht, LXC für ganze Systeme.
Für einen Server würde ich allerdings zu LXD greifen, das basiert auf LXC und ist auch von den gleichen Leuten. Hier hat man den Vorteil das Import/Export, Snapshots, etc. von Containern möglich ist.
Seit dem neusten Update kann LXD auch VMs erstellen.

Mit Nginx hatte ich auch noch nichts zu tun. Falls man sich da direkt mit dem Netzwerk verbinden muss (wird z.B. benötigt um sich mit einem VPN im Container zu verbinden):

Bash:
lxc.mount.entry = /dev/net dev/net none bind,create=dir
lxc.cgroup.devices.allow = c 10:200 rwm

Falls der Container noch eine statische Ip haben soll:

lxc.net.0.ipv4.address = 192.168.122.160
 

Rassnahr

Lt. Commander
Dabei seit
Dez. 2010
Beiträge
1.163
@sc0repi0 sowohl docker als auch LXC verwenden die gleichen kernel features, von daher macht das keinen großen Unterschied. Natürlich sollst du nicht ein x beliebiges docker image von docker hub oder einer anderen docker registry ausführen, ohne der Quelle zu vertrauen, aber das gilt ja wohl für alle quellen aus dem Internet.

Davon abgesehen wird docker vor allem auf Servern eingesetzt (bei uns im Unternehmen und allen Partnern z.B.), du kannst bei docker auch einfach dein eigenes Image bauen allerdings gibt es auf docker hub viele offizielle docker images z.B. auch von nginx.

@shinXdxd
Also mit x11docker haben bei mir folgende spiele nicht funktioniert
ich habe allerdings auch nicht wirklich versucht diese spiele zum Laufen zu bekommen.

  • Divinity original sin 2
  • Civilization VI (funktioniert mit workaround vom arch wiki)
  • Dying Light
  • No Man`s Sky (kein sound)

Dagegen haben diese Spiele funktioniert:

  • Hitman 2
  • Deep Rock Galactic
  • The Long Dark
  • Pillars of Eternity ||
  • The Witcher 3
  • Darkest Dungeon
  • Metro Exodus
 
Zuletzt bearbeitet:
Top