Steam ne protège pas votre système contre les jeux non fiables, ni contre lui-même.
Vous pourriez être intéressé par le document de Stéphane Graber article sur l'utilisation de LXC pour ce faire et le projet steam-lxc qu'il a créée à cet effet.
Mise à jour de septembre 2014 :
J'ai finalement réussi à le mettre en place moi-même. Les liens ci-dessus sont un peu obsolètes, mais Stéphane a posté une série d'articles plus récents sur LXC 1.0 qui ont été très utiles. Grâce à cela et à un peu d'expérimentation, j'ai réussi à faire fonctionner Steam dans un conteneur non privilégié, et cela fonctionne plutôt bien.
Avertissement : Même si vous exécutez Steam (et ses jeux) dans un conteneur, il sera normalement toujours en mesure d'accéder à votre écran, à votre souris et à votre clavier. via le protocole X . Il existe des extensions X pour atténuer ce problème, mais je n'ai pas encore essayé de faire fonctionner Steam en tant que client X non fiable. Un moyen simple de limiter cette exposition consiste à créer un compte utilisateur linux distinct pour votre conteneur Steam, à utiliser la fonction "changer d'utilisateur" de votre environnement de bureau pour vous connecter en tant qu'utilisateur pour jouer, et à basculer entre cette session de bureau et votre session de bureau normale en fonction des besoins. Comme cette approche utilise une session de serveur X séparée pour Steam, le reniflage du protocole X ne devrait pas être possible, bien que le GPU et ses pilotes puissent toujours être exploitables à travers les serveurs X.
Ma ligne de commande pour créer le conteneur :
lxc-create -n steambox -t download -- -d ubuntu -r trusty -a amd64
J'ai modifié mon fichier de configuration du conteneur pour qu'il ressemble à ceci :
# Distribution configuration
lxc.include = /usr/share/lxc/config/ubuntu.common.conf
lxc.include = /usr/share/lxc/config/ubuntu.userns.conf
lxc.arch = x86_64
# Container specific configuration
lxc.id_map = u 0 100000 1000
lxc.id_map = g 0 100000 1000
lxc.id_map = u 1000 1000 1
lxc.id_map = g 1000 1000 1
lxc.id_map = u 1001 101001 64535
lxc.id_map = g 1001 101001 64535
lxc.rootfs = /home/myusername/.local/share/lxc/steambox/rootfs
lxc.utsname = steambox
# Network
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxcbr0
lxc.network.hwaddr = 00:16:3e:77:88:99
# Video
lxc.mount.entry = /tmp/.X11-unix tmp/.X11-unix none bind,optional,create=dir
lxc.mount.entry = /dev/dri dev/dri none bind,optional,create=dir
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.cgroup.devices.allow = c 195:* rwm
# video0 doesn't exist on my system.
#lxc.mount.entry = /dev/video0 dev/video0 none bind,optional,create=file
# Sound
lxc.mount.entry = /dev/snd dev/snd none bind,optional,create=dir
# Game Controllers
# Steam uses SDL for controller support; SDL uses udev and /dev/input/*
lxc.mount.entry = /dev/input dev/input none bind,optional,create=dir
#lxc.cgroup.devices.allow = c 13:* r
# uinput might be needed for gamepad support with streaming
#lxc.mount.entry = /dev/uinput dev/uinput none bind,optional,create=file
#lxc.cgroup.devices.allow = c 10:223 rwm
# for debugging
#lxc.aa_profile = unconfined
# EOF
Il ne s'agit que d'un point de départ. Vous devrez toujours configurer votre système hôte comme décrit dans les articles, et probablement le redémarrer, avant qu'il ne fonctionne. Ne me demandez pas de dépanner votre système.
Je fonctionne sous Ubuntu avec une carte nVidia. Des distributions et des cartes vidéo différentes nécessiteront probablement des chemins d'accès, des noms de fichiers de périphériques et des numéros de périphériques différents.
Notez que je n'ai pas mis lxc.cgroup.devices.deny = a
le conteneur n'est donc pas aussi verrouillé qu'il pourrait l'être. (Je changerai cela une fois que j'aurai fini d'expérimenter).
J'ai dû installer le même paquet de pilotes nVidia dans le conteneur que celui que j'ai sur l'hôte. (Même une différence mineure de numéro de version provoquait des erreurs lorsque Steam essayait d'utiliser le pilote).
J'ai délibérément utilisé l'architecture amd64 et la version Ubuntu Trusty pour mon conteneur, malgré le fait que Valve ne supporte que i386 et Precise. J'ai fait cela parce que je veux que le logiciel espion de Valve me compte parmi ceux qui utilisent un système d'exploitation moderne, dans l'espoir qu'ils commencent à le supporter plus tôt.
Une fois que steam a fonctionné dans le conteneur, j'ai mis en place un script de lancement sur mon système hôte. Il s'appelle steam
et vit dans mon PATH
Les lignes de commande de Steam fonctionnent donc à peu près comme si Steam était installé normalement. Voici le script :
#!/bin/sh
CONTAINER=steambox
RUNASUSER=ubuntu
STEAMCOMMAND=/usr/games/steam
# Execute a command in the container, with X display support
run_in_container() {
lxc-attach --clear-env -n $CONTAINER -- sudo -u $RUNASUSER -i \
env DISPLAY="$DISPLAY" "$@"
}
# Find joystick devices so we can tell Steam's old SDL library to use them
# https://github.com/ValveSoftware/steam-for-linux/issues/1894#issuecomment-25295972
enum_joysticks() {
local joyprop=ID_INPUT_JOYSTICK=1
for f in /dev/input/*; do
if [ ! -c "$f" ]; then
continue
elif udevadm info --query=property --name="$f" | grep --quiet $joyprop; then
echo "$f"
fi
done
}
# Use the first arg as a separator to join the remaining args
join() {
local IFS="$1"
shift
echo "$*"
}
# Use an environment variable to help Steam's old SDL version find gamepads
run_steam_with_joysticks() {
run_in_container SDL_JOYSTICK_DEVICE="$(join : $(enum_joysticks))" \
$STEAMCOMMAND "$@"
}
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
run_in_container xauth add $(xauth list | sed 's/^.*\///')
run_steam_with_joysticks "$@"
if [ "$STARTED" = "true" ]; then
lxc-stop -n $CONTAINER -t 10
fi
Le enum_joysticks
, join
et SDL_JOYSTICK_DEVICE=
Les pièces ne sont là que pour contourner une Bogue de vapeur qui empêche Big Picture Mode de détecter les manettes de jeu sur un système Ubuntu Trusty. Vous pouvez probablement supprimer ces parties du script si votre conteneur fonctionne sous Ubuntu Precise ou si vous n'utilisez pas Big Picture Mode.
Une fois ce script installé dans mon PATH
Je peux copier le fichier .desktop de chaque jeu de mon conteneur vers mon système hôte pour que le jeu apparaisse dans mon menu d'applications. (En général, je copie également l'icône ou j'édite le fichier .desktop pour nommer une icône installée sur mon système hôte).
cp /home/myusername/.local/share/lxc/steambox/rootfs/home/ubuntu/.local/share/applications/thegame.dekstop /home/myusername/.local/share/applications/
Bonne chance !