前言
意义
上一篇文章《在 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