shinXdxd
Lt. Junior Grade
- Registriert
- Feb. 2018
- Beiträge
- 327
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
1. Motivation
2. Benötigte Software am Host
3. Einstellungen und Konfiguration des Hosts
4. Konfiguration für Container anpassen
5. prestartHook.sh
5.1 Wenn der Host kein Systemd hat
Damit man das ganze auch ohne Passwort ausführen kann fügt das noch in
6. Container erstellen
7 Container einrichten
7.2 Container testen und Gui konfigurieren
7.3 Container - Sound
7.4 Container - Nvidia Treiber
8. Start Scripts für Anwendungen
[IMG]https://www.computerbase.de/forum/file:///tmp/lu13876ow3ijr.tmp/lu13876ow3imp_tmp_9c78dfcb71a92c80.png[/IMG]
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.
Platzhalter1
Platzhalter2
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 nach
lxc.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 unte
r ~/.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:
- Ich konnte bekam mit alsa und steam keinen sound, daher empfehle ich pulseaudio
- 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 einrichtenDer 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]
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/
- Eine .wav Datei abspielen.
- Hierfür wird alsa-utils benötigt.
- Pulse über TCP:
PULSE_SERVER=eure_host_ip aplay song.wav
- Pulse ohne TCP:
aplay song.wav
- Pulse über TCP:
- Eine .mp3 Datei abspielen.
- Hierfür muss man mpg123 installieren
- Pulse über TCP:
PULSE_SERVER=eure_host_ip mpg123 song.mp3
- Pulse ohne TCP:
mpg123 song.mp3
- Installiert einen Browser (z.B. Firefox) und spielt ein Video ab.
- Falls ihr den Server über TCP, vergesst nicht den Browser via
PULSE_SERVER=eure_host_ip firefox
zu starten.
- Falls ihr den Server über TCP, vergesst nicht den Browser via
- Hierfür wird alsa-utils benötigt.
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
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.
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.
- &>/dev/null & könnt ihr euch sparen, einfach nur
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.
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.
Ergänzung ()
Platzhalter1
Ergänzung ()
Platzhalter2
Anhänge
-
1597099418000.png168,5 KB · Aufrufe: 472
-
1597099436200.png26,1 KB · Aufrufe: 463
-
1597099467100.png25,4 KB · Aufrufe: 457
-
1597099496200.png25,4 KB · Aufrufe: 427
-
1597099513100.png25,4 KB · Aufrufe: 438
-
1597099524400.png25,4 KB · Aufrufe: 421
-
1597099543900.png6,5 KB · Aufrufe: 410
-
1597099578400.png5 KB · Aufrufe: 415
-
1597099582900.png8,4 KB · Aufrufe: 400
-
1597099587300.png8,4 KB · Aufrufe: 399
-
1597100186800.png5 KB · Aufrufe: 410
-
1597100193400.png8,4 KB · Aufrufe: 390
Zuletzt bearbeitet: