« Gowstream » : différence entre les versions
Autres actions
| Ligne 184 : | Ligne 184 : | ||
# cp -a /etc/wolf/profile-data/<font color="blue">user</font>/WolfPegasus/.config/pegasus-frontend/. /etc/wolfpegasus/global/ | # cp -a /etc/wolf/profile-data/<font color="blue">user</font>/WolfPegasus/.config/pegasus-frontend/. /etc/wolfpegasus/global/ | ||
# chown -R 1000:1000 /etc/wolfpegasus/global | |||
On crée ensuite un dossier de configuration pour chaque utilisateur. Exemple avec <code>user2</code> : | On crée ensuite un dossier de configuration pour chaque utilisateur. Exemple avec <code>user2</code> : | ||
Version du 17 juin 2026 à 07:31
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 LXC, 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 crée le volume Docker qui contient une copie des bibliothèques 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/.config/retroarch/system: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/.config/retroarch/system:ro") :
# mkdir -p /mnt/Emulation/bios/retroarchbioses/mame # ln -s /mnt/Emulation/roms/g-and-w_artwork /mnt/Emulation/bios/retroarchbioses/mame/artwork
Pegasus : Configuration persistante multisession
On utilise un montage persistant pour le dossier de configuration de chaque profil, ainsi que pour la configuration de Pegasus. Cela permet de ne pas perdre les configurations et les sauvegardes des émulateurs lors des mises à jour du conteneur, tout en partageant la configuration de Pegasus entre les utilisateurs afin de conserver les mêmes dossiers de ROMs.
On crée un dossier de configuration global pour Pegasus :
# mkdir -p /etc/wolfpegasus/global # chown -R 1000:1000 /etc/wolfpegasus/global
Optionnellement, on récupère la configuration déjà faite pour un utilisateur :
# cp -a /etc/wolf/profile-data/user/WolfPegasus/.config/pegasus-frontend/. /etc/wolfpegasus/global/ # chown -R 1000:1000 /etc/wolfpegasus/global
On crée ensuite un dossier de configuration pour chaque utilisateur. Exemple avec user2 :
# mkdir -p /etc/wolfpegasus/user2 # chown -R 1000:1000 /etc/wolfpegasus/user2
Optionnellement, on peut récupérer les cores déjà installés pour Retroarch :
# mkdir -p /etc/wolfpegasus/user2/retroarch/cores # cp -a /etc/wolf/profile-data/user/WolfPegasus/.config/retroarch/cores/. /etc/wolfpegasus/user2/retroarch/cores/ # chown -R 1000:1000 /etc/wolfpegasus/user2
On ajoute ensuite les montages a l'utilisateur, exemple :
# vi /etc/wolf/cfg/config.toml
[[profiles]]
id = 'user2'
name = 'User2'
[[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 = [
'/mnt/Emulation/resources:/assets/romm/resources:ro',
'/opt/emulator:/opt/emulator:ro',
'/mnt/Emulation/bios/retroarchbioses:/home/retro/.config/retroarch/system:ro',
'/mnt/Emulation/roms:/ROMs:ro',
'/etc/wolfpegasus/user2:/home/retro/.config:rw',
'/etc/wolfpegasus/global:/home/retro/.config/pegasus-frontend:ro' # ro pour bloquer modification / rw pour modifier conf, exemple sur compte admin
]
name = 'WolfPegasus'
ports = []
type = 'docker'
Enfin, on redémarre GOW :
# docker restart opt-wolf-1
Personnalisation
Images personnalisées
Le paramètre icon_png_path indique l’icône qui sera affichée dans les clients Moonlight pour chaque application.
L’image doit être au format PNG, idéalement en 200x266 ou 628x888 pixels.
L’emplacement de l’image peut être indiqué de trois manières différentes :
- Une URL, par exemple :
"https://games-on-whales.github.io/wildlife/apps/steam/assets/icon.png"
- Un chemin relatif à HOST_APPS_STATE_FOLDER, par exemple :
"icons/icon.png"
- Un chemin absolu, par exemple :
"/mnt/path/to/files/icon.png"
Code PIN
Exemple :
[[profiles]] id = 'user' name = 'Random User' icon_png_path = 'http://192.168.1.155:8888/misc/guest.png' pin = [ 3, 2, 1, 4 ]
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
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.
- Arrêter Games on Whales / Wolf :
# cd /opt/gow # docker compose down
- Supprimer tous les conteneurs qui utilisent
nvidia-driver-vol:
# docker rm -f $(docker ps -aq --filter volume=nvidia-driver-vol)
- Supprimer le volume obsolète :
# docker volume rm -f nvidia-driver-vol
- Reconstruire l’image
gow/nvidia-driver:latestavec 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) . # docker create --rm --mount source=nvidia-driver-vol,destination=/usr/nvidia gow/nvidia-driver:latest sh
- Redémarrer Games on Whales / Wolf :
# cd /opt/gow # docker compose up -d