Gowstream
Autres actions
LXC Debian
Prérequis
- LXC avec Privilèges et Nesting
Installation
Virtual devices support
Depuis le serveur :
# vi /etc/udev/rules.d/85-wolf-virtual-inputs.rules
# Allows Wolf to acces /dev/uinput (only needed for joypad support)
KERNEL=="uinput", SUBSYSTEM=="misc", MODE="0660", GROUP="input", OPTIONS+="static_node=uinput", TAG+="uaccess"
# Allows Wolf to access /dev/uhid (only needed for DualSense emulation)
KERNEL=="uhid", GROUP="input", MODE="0660", TAG+="uaccess"
# Joypads
KERNEL=="hidraw*", ATTRS{name}=="Wolf PS5 (virtual) pad", GROUP="input", MODE="0660", ENV{ID_SEAT}="seat9"
SUBSYSTEMS=="input", ATTRS{name}=="Wolf X-Box One (virtual) pad", MODE="0660", ENV{ID_SEAT}="seat9"
SUBSYSTEMS=="input", ATTRS{name}=="Wolf PS5 (virtual) pad", MODE="0660", ENV{ID_SEAT}="seat9"
SUBSYSTEMS=="input", ATTRS{name}=="Wolf gamepad (virtual) motion sensors", MODE="0660", ENV{ID_SEAT}="seat9"
SUBSYSTEMS=="input", ATTRS{name}=="Wolf Nintendo (virtual) pad", MODE="0660", ENV{ID_SEAT}="seat9"
On redémarre le serveur ou l'on charge la configuration avec la commande :
# udevadm control --reload-rules && udevadm trigger
NVidia
Après création du conteneur, depuis le serveur :
# vi /etc/pve/lxc/100.conf
... dev0: /dev/uinput dev1: /dev/uhid dev2: /dev/nvidia0 dev3: /dev/nvidiactl dev4: /dev/nvidia-modeset dev5: /dev/nvidia-uvm dev6: /dev/nvidia-uvm-tools dev7: /dev/nvidia-caps/nvidia-cap1 dev8: /dev/nvidia-caps/nvidia-cap2 lxc.cgroup2.devices.allow: a lxc.cap.drop: lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir lxc.mount.entry: /run/udev mnt/udev none bind,optional,create=dir lxc.mount.entry: /dev mnt/dev none bind,optional,create=dir
On démarre le LXC, ensuite depuis le LXC :
# apt update && apt upgrade
On installe le pilote NVidia (référence), exemple :
# bash /opt/nvidia-driver/NVIDIA-Linux-x86_64-590.48.01.run --no-kernel-module # bash /opt/nvidia-driver/nvidia-patch/patch.sh # bash /opt/nvidia-driver/nvidia-patch/patch-fbc.sh
On installe docker et docker-compose :
# apt install docker.io docker-compose-plugin curl
On install le docker NVidia :
# cd /opt/ # curl https://raw.githubusercontent.com/games-on-whales/gow/master/images/nvidia-driver/Dockerfile | docker build -t gow/nvidia-driver:latest -f - --build-arg NV_VERSION=$(cat /sys/module/nvidia/version) . # docker create --rm --mount source=nvidia-driver-vol,destination=/usr/nvidia gow/nvidia-driver:latest sh
On installe le conteneur de GOW :
# mkdir /opt/gow # cd /opt/gow/ # vi docker-compose.yml
version: "3"
services:
wolf:
image: ghcr.io/games-on-whales/wolf:stable
environment:
- NVIDIA_DRIVER_VOLUME_NAME=nvidia-driver-vol
#- WOLF_RENDER_NODE=/dev/dri/renderD12X ##pour multiGPU
volumes:
- /etc/wolf/:/etc/wolf:rw
- /var/run/docker.sock:/var/run/docker.sock:rw
- /mnt/udev:/run/udev:rw
- /mnt/dev:/dev:rw
- nvidia-driver-vol:/usr/nvidia:rw
devices:
- /dev/dri
- /dev/uinput
- /dev/uhid
- /dev/nvidia-uvm
- /dev/nvidia-uvm-tools
- /dev/nvidia-caps/nvidia-cap1
- /dev/nvidia-caps/nvidia-cap2
- /dev/nvidiactl
- /dev/nvidia0
- /dev/nvidia-modeset
device_cgroup_rules:
- 'c 13:* rmw'
network_mode: host
restart: unless-stopped
volumes:
nvidia-driver-vol:
external: true
# docker compose up -d
Autoriser client
Lors de la première tentative de connexion d'un client il faut rentrer le pin dans un lien web pour l'autoriser, depuis le LXC :
# docker ps
Exemple :
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c5e43d2fc724 ghcr.io/games-on-whales/pulseaudio:master "/entrypoint.sh" 29 minutes ago Up 29 minutes 4713/tcp WolfPulseAudio c581ab5d8827 ghcr.io/games-on-whales/wolf:stable "/entrypoint.sh" 29 minutes ago Up 29 minutes opt-wolf-1
# docker logs opt-wolf-1
... ... Insert pin at http://192.168.1.123:47989/pin/#EXEMPLE ...
Configuration
Par défaut :
WOLF_CFG_FILE=/etc/wolf/cfg/config.toml
# vi /etc/wolf/cfg/config.toml
Monter un dossier dans une app
Exemple avec Pegasus : (source)
# vi /etc/wolf/cfg/config.toml
Modifier :
[[profiles.apps]]
icon_png_path = 'https://games-on-whales.github.io/wildlife/apps/pegasus/assets/icon.png'
start_virtual_compositor = true
title = 'Pegasus'
[profiles.apps.runner]
base_create_json = {
"HostConfig": {
"IpcMode": "host",
"CapAdd": ["NET_RAW", "MKNOD", "NET_ADMIN", "SYS_ADMIN", "SYS_NICE"],
"Privileged": false,
"DeviceCgroupRules": ["c 13:* rmw", "c 244:* rmw"]
}
}
devices = []
env = [ 'RUN_SWAY=1', 'GOW_REQUIRED_DEVICES=/dev/input/event* /dev/dri/* /dev/nvidia*' ]
image = 'ghcr.io/games-on-whales/pegasus:edge'
mounts = []
name = 'WolfPegasus'
ports = []
type = 'docker'
Par, exemple :
...
devices = []
env = [ 'RUN_SWAY=1', 'GOW_REQUIRED_DEVICES=/dev/input/event* /dev/dri/* /dev/nvidia*' ]
image = 'ghcr.io/games-on-whales/pegasus:edge'
mounts = [
"/mnt/Emulation/resources:/assets/romm/resources:ro",# exemple de compatibilite avec assets ROMM
"/mnt/Emulation/bios/retroarchbioses:/home/retro/bioses:ro",# pack de bios pour retroarch
"/mnt/Emulation/roms:/ROMs:ro"# roms dans le dossier par default, a ajouter dans le menu de Pegasus pour certains dossiers..
]
name = 'WolfPegasus'
ports = []
...
On redémarre le conteneur :
# docker restart opt-wolf-1
Montage utile pour Pegasus
Installer des bin d'émulateur :
"/opt/emulator:/opt/emulator:rw",
Artwork pour Game and Watch (mame) ( exemple avec "/mnt/Emulation/bios/retroarchbioses:/home/retro/bioses:ro") :
# mkdir -p /mnt/Emulation/bios/retroarchbioses/mame # ln -s /mnt/Emulation/roms/g-and-w_artwork /mnt/Emulation/bios/retroarchbioses/mame/artwork
Importer un thème dans Pegasus
# cd /etc/wolf/profile-data/user/WolfPegasus/.config/pegasus-frontend/themes/
Exemple avec "gameOS" (normalement déjà présent..) :
# wget https://github.com/PlayingKarrde/gameOS/archive/master.zip # unzip master.zip
convertir les gamelist.xml en metadata.txt
Voir ce lien
Games on Whales / Wolf : recréer le volume NVIDIA après mise à jour du pilote
Après une mise à jour du pilote NVIDIA sur l’hôte, Games on Whales / Wolf peut ne plus produire de vidéo dans Moonlight, avec un symptôme du type :
No video received from host
La cause fréquente est un décalage entre :
- la version du pilote NVIDIA chargée sur l’hôte ;
- les bibliothèques NVIDIA stockées dans le volume Docker
nvidia-driver-volutilisé par Wolf.
Il ne suffit pas toujours de reconstruire l’image gow/nvidia-driver:latest. Il faut aussi supprimer les anciens conteneurs qui utilisent encore le volume, puis recréer le volume proprement.
Vérifier la version du pilote NVIDIA
Sur l’hôte ou dans le LXC qui exécute Docker :
# cat /sys/module/nvidia/version # nvidia-smi
La version affichée doit correspondre au pilote NVIDIA actuellement chargé.
Arrêter Games on Whales / Wolf
Se placer dans le dossier contenant le fichier docker-compose.yml :
# cd /opt/gow
Arrêter les conteneurs du projet Compose :
# docker compose down
Supprimer les conteneurs utilisant l’ancien volume
Supprimer tous les conteneurs qui utilisent nvidia-driver-vol :
# docker rm -f $(docker ps -aq --filter volume=nvidia-driver-vol)
Supprimer l’ancien volume NVIDIA
Supprimer le volume obsolète :
# docker volume rm -f nvidia-driver-vol
Vérifier qu’il n’existe plus :
# docker volume ls | grep nvidia-driver
Si aucune ligne n’est retournée, le volume a bien été supprimé.
Reconstruire l’image NVIDIA driver
Reconstruire l’image gow/nvidia-driver:latest avec la version actuelle du pilote NVIDIA :
# cd /opt
# curl https://raw.githubusercontent.com/games-on-whales/gow/master/images/nvidia-driver/Dockerfile \
| docker build \
-t gow/nvidia-driver:latest \
-f - \
--build-arg NV_VERSION=$(cat /sys/module/nvidia/version) .
Recréer le volume NVIDIA
Recréer le volume nvidia-driver-vol :
# docker create --rm \ --mount source=nvidia-driver-vol,destination=/usr/nvidia \ gow/nvidia-driver:latest sh
Vérifier que le volume existe :
# docker volume ls | grep nvidia-driver
Optionnellement, vérifier son contenu :
# docker run --rm \ --mount source=nvidia-driver-vol,destination=/usr/nvidia \ debian:bookworm \ ls -la /usr/nvidia
Redémarrer Games on Whales / Wolf
Retourner dans le dossier du fichier Compose :
# cd /opt/gow
Relancer Wolf :
# docker compose up -d
Ou, si le projet Compose utilise le nom opt :
# docker compose -p opt up -d