Steam n'utilise pas de sandbox. Par exemple, sous Windows, les jeux Steam enregistrent généralement leurs données dans Mes documents, Appdata, leur propre dossier d'installation ou le dossier Steam Cloud de Steam (qui se synchronise avec le service de stockage en ligne pour vos sauvegardes, configurations et autres données utilisateur). Certains installent même d'autres programmes, comme la bibliothèque d'un composant multijoueur (par exemple :Games for Windows - LIVE).
Valve, cependant, a mis en place certaines restrictions pour éviter les comportements indésirables, comme un jeu installant le marché des jeux d'un éditeur sans demander. La seule chose qui se rapproche le plus de cela est uPlay d'Ubisoft, qu'Ubisoft voulait utiliser pour mettre à jour ses jeux, donc au lieu d'expédier le client complet, chaque jeu est livré avec une mini version qui n'a pas le marché et ne peut être démarrée que lorsque vous démarrez son jeu associé .
Les jeux sur Steam sont pour la plupart les mêmes que leurs homologues vendus au détail, légèrement modifiés pour utiliser le DRM d'authentification de Steam et rendus téléchargeables via les serveurs de Steam.
Steam offre des services supplémentaires en retour, comme les mises à jour automatiques, la synchronisation dans le cloud des données des utilisateurs du jeu, les réalisations, les classements et d'autres données personnalisées (regardez les statistiques Team Fortress 2 d'un utilisateur pour un exemple) et plus encore.
Steam ne protège pas votre système contre les jeux non fiables ou contre lui-même.
Vous pourriez être intéressé par l'article de Stéphane Graber sur l'utilisation de LXC pour ce faire, et le projet steam-lxc qu'il a créé à 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 publié une série d'articles plus récents sur LXC 1.0 qui ont été très utiles. Entre ceux-ci et un peu d'expérimentation, j'ai fait 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 pourra normalement toujours accéder à votre écran, votre souris et votre clavier via le protocole X. Certaines extensions X existent pour atténuer ce problème, mais je n'ai pas encore essayé d'exécuter Steam en tant que client X non approuvé. Un moyen simple de limiter cette exposition consiste à créer un compte d'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 à des jeux et à basculer entre cette session de bureau et votre session de bureau normale. comme requis. Étant donné que cette approche utilise une session de serveur X distincte pour Steam, le reniflage du protocole X ne devrait pas être possible, bien que le GPU et ses pilotes puissent toujours être exploitables sur 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 de 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
Ceci est uniquement destiné à vous aider à démarrer. 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. S'il vous plaît, ne me demandez pas de dépanner votre système.
J'utilise Ubuntu avec une carte nVidia. Différentes distributions et cartes vidéo nécessiteront probablement quelques chemins, noms de fichiers de périphérique et numéros de périphérique différents.
Notez que je n'ai pas défini lxc.cgroup.devices.deny = a
pourtant, 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 package de pilotes nVidia dans le conteneur que j'ai sur l'hôte. (Même une incompatibilité de numéro de version mineure 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 les logiciels espions de Valve me comptent parmi ceux qui utilisent un système d'exploitation moderne, dans l'espoir qu'ils commenceront à le prendre en charge plus tôt.
Une fois que j'ai fait travailler Steam dans le conteneur, j'ai configuré un script de lancement sur mon système hôte. Il s'appelle steam
et vit dans mon PATH
, donc les lignes de commande Steam fonctionnent à 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" "[email protected]"
}
# 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 "[email protected]"
}
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 "[email protected]"
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 un bogue Steam qui empêche le mode Big Picture de détecter les contrôleurs de jeu sur un système Ubuntu Trusty. Vous pouvez probablement supprimer ces parties du script si votre conteneur exécute Ubuntu Precise ou si vous n'utilisez pas le mode Big Picture.
Avec 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 faire apparaître le jeu dans mon menu d'applications. (En général, je copie également l'icône ou je modifie le fichier .desktop pour nommer une icône installée sur mon hôte.)
cp /home/myusername/.local/share/lxc/steambox/rootfs/home/ubuntu/.local/share/applications/thegame.dekstop /home/myusername/.local/share/applications/
Bonne chance !