使用 systemd-nspawn 运行游戏

容器内运行游戏

时代确实变了,GNU/Linux 上现在甚至可以通过 proton 运行许多的 m$win 游戏了。m$win 世袭的独占的领域,我认为也离崩塌不远了

下面是翻译(原文是用英语瞎写的)


这个解决方案是我和 Gemini 之间对话的结果。它已经过测试,似乎是一个很好的方法。

我这样做是为了隔离游戏环境并提高安全性。

游戏在容器中运行,但在主机上显示。

步骤:

创建一个 systemd-nspawn 容器

请参考互联网上的指南。我建议您运行非特权容器(启用 PrivateUsers)并启用尽可能多的安全选项。

必须:

  • /dev/dri 绑定到容器中,并确保容器中的用户可以访问 dri 设备(可以通过 acl 来做到这一点)

  • 将另一个自定义路径绑定到容器中。我们需要从主机到容器共享 gamescope 文件,例如,在本主题中,我在主机和容器上都使用路径 /share-with-container/

提示:您可以在容器中运行无头桌面,例如:sway。

在容器中安装 proton 和游戏

你可以使用一些启动器来帮助你设置 proton 和游戏,我使用 Faugus。

运行

在主机上(请注意,我假设您已经在主机上运行桌面,其套接字为 /run/user/1000/wayland-1):


touch /share-with-container/tmp/.X{0..10}-lock

systemd-run --user --wait --pty -p "BindPaths=/share-with-container/tmp:/tmp" \
-E XDG_RUNTIME_DIR=/share-with-container/runtime \
-E WAYLAND_DISPLAY=/run/user/1000/wayland-1 \
gamescope \
--expose-wayland -W 2560 -H 1422 --borderless --force-windows-fullscreen -- sleep infinity

systemd-run --user --wait -p "BindPaths=/share-with-container/tmp:/tmp" \
-E DISPLAY=:11 \
xhost '+'

在容器中(将 … 部分替换为游戏启动命令):


systemd-run --user --wait -p "BindPaths=/share-with-container/tmp:/tmp" \
-E DISPLAY=:11 \
-E WAYLAND_DISPLAY=/share-with-container/runtime/gamescope-0 \
...

音频

我用的是 pipewire netjack2 来将容器内的声音转到宿主机播放


测试过的游戏

  • red alert 3
  • gta sa
  • ac 2

bwrap更适合GUI应用程序,你用-U要那么多用户也没啥用。

另外你有没有注意到一件事情:你用的命令根本没有用到nspawn。

你好,这篇文字假设用户已经掌握了 nspwan 容器的创建,维护的基本方法。叙述容器的使用超出了这篇主题的范围。有兴趣的用户可以在本帖下提出,我会视情况开专门的帖子简单讲述步骤。但是最详尽的资料,建议直接阅读 arch wiki, 和 man 手册,该知道的东西都在里面了

你用的命令根本没有用到nspaw

需要在容器内执行的命令,一楼都用“在容器中……”这种语言标注出来了

flatpak 很好,但是对我来说不够,隔离性是不如这种方案的,作为一个洁癖患者,我迫切地需要将 flatpak, docker, proton 等一堆东西隔离到另外一个环境中去


本帖方法实质上是在宿主机上运行一个合成器 gamescope, 然后让容器内的程序使用它进行显示,最终,成为宿主机上的一个窗口,供和用户交互

行吧,你的文章,你说什么就是什么吧。