在 Firejail Chroot 中运行 Steam

前言

意义

上一篇文章《在 Firejail 中运行 Steam》讲述了如何让 Steam 在常规的 Firejail 容器中运行,现在咱来点不常规的。显然常规的 firejail 有一些劣势:需要在容器外配置 i386 库、隔离也不是十分彻底。

准备容器的环节将在 Root 下进行,但配置完成后不需要 Root 权限。

步骤

准备容器环境

无内鬼,来点 Debian

考虑到 Steam 官方支持的是 Ubuntu TLS,我们容器的基础选择 Debian。

sudo zypper in debootstrap
sudo mkdir -p /path/to/root/filesystem
sudo debootstrap --arch=amd64 stable /path/to/root/filesystem https://mirrors.ustc.edu.cn/debian/

当看到以下输出,说明 chroot 环境已经基本准备好了。

I: Base system installed successfully.

用户与软件包

sudo chroot /path/to/root/filesystem

使用 nano 编辑 /etc/apt/sources.list

deb https://mirrors.ustc.edu.cn/debian stable main contrib non-free
deb https://mirrors.ustc.edu.cn/debian stable-updates main contrib non-free
deb https://mirrors.ustc.edu.cn/debian-security/ stable/updates main non-free contrib
apt install mesa-vulkan-drivers libglx-mesa0:i386 mesa-vulkan-drivers:i386 libgl1-mesa-dri:i386 locales mesa-utils pulseaudio 
dpkg-reconfigure locales
tzselect
apt-get install steam 

事前配置

运行 PulseAudio 服务器

为了让 Steam 有声运行,我们需要在宿主的 PulseAudio 上开启网络监听功能。将以下内容保存为脚本,本例中保存的文件名是 paserver

#!/bin/sh

usage() {
  echo 'Usage: paserver <on|off>'
  exit 1
}

case "$1" in
  on )
    pactl load-module module-native-protocol-tcp \
        auth-ip-acl=127.0.0.1 auth-anonymous=1
    ;;
  off )
    pactl unload-module module-native-protocol-tcp
    ;;
  * )
    usage
    ;;
esac

在宿主端需要启动声音服务的时候,直接运行 paserver on,用完之后,运行 paserver off 就可以了,不需要每次都杀掉 pulseaudio 重新启动。

DBus?

没有。所以没有托盘图标。

运行 Steam

Firejail 默认会把一些环境变量传入容器,其中某个变量可能会影响运行。保险起见去掉环境变量。

firejail --noprofile --chroot=/path/to/root/filesystem bash -c "env -i bash" # 必须去掉环境变量
env PULSE_SERVER=localhost DISPLAY=:0 HOME=/home/<username> ./Steam/steam.sh

后记

从某种意义上讲,这是一个失败的配置,花了 24 个小时在 Steam 容器上显然不值得。

我最初在 Firejail 内运行 Steam,为的是方便。当时电脑上还有不少 32 位的库,所以简简单单,指定 profile 为 steam,直接在 Firejail 里执行就好。需要调整的地方属实不多。

重装系统后,我受到隔壁 Arch 用户的启发,尝试在容器内运行 Steam,依然选择 Firejail 作为容器的工具。这一选择有两方面的原因:如果用 systemd-nspawn 等常规容器技术,打开 Steam 还需要输入 root 密码或者让 policykit 出来遛弯,实属滥权;况且相比与其他工具,Firejail 会自动传递 Xorg,免去我手动配置的麻烦。

受难之路

我最先计划的容器基础是 Fedora,但是 Fedora 的车很灵。安装 mesa 后 glxgears 与 glxinfo 的二进制文件都找不见。然后我换到 openSUSE Leap,成功下载了 2GB 的桌面环境后,glxgears 依然提示找不到 buffer。最后切换到 Debian,直接成功。

在 Debian 内的 Steam 虽然成功启动了初期脚本并下载了依赖,启动时却在加载 SDL 库时出现段错误。我以为是 Debian 的锅,于是又安装了一个 Ubuntu 来排错。最后偶然证明问题不在系统,而在于 Firejail 传入的某个环境变量影响了 SDL 库。

因为缺失了托盘图标,实际使用体验还不如上一篇文章里的简单方式。为了排除一些 32 位库,多出 1GB 的空间使用,且损失托盘,实属不值得。

参考

PulseAudio 服务器: http://edyfox.codecarver.org/html/pulseaudio_tips.html

2赞