起因

闲着无聊在家想玩一直没玩完的《仙剑奇侠传》,因为我用的系统是 Archlinux,所以在 Steam 上需要用 Proton 来运行。 但是打开游戏的时候发现闪退了。(╯°Д°)╯ ┻━┻

Debug 过程

  1. 尝试运行其他 Windows 游戏,无果,暂时排除是游戏的原因
  2. 尝试换了几个版本的 Proton,还是闪退
  3. ProtonDB 查询的结果显示这些游戏都是完美运行的,猜测可能是本机驱动或者配置问题
  4. 检查 Nvidia 显卡驱动及 32 位版本正常安装 nvidia, nvidia-utils, lib32-nvidia, lib32-nvidia-utils
  5. 查看软件运行日志, 从终端运行 Steam
env STEAM_LINUX_RUNTIME_LOG=1 PROTON_LOG=1 steam-native

发现错误

ERROR: ld.so: object '/home/light4/.local/share/Steam/ubuntu12_32/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored.

一番查询,发现是正常日志,可以忽略。参考 https://wiki.archlinux.org/title/Steam/Troubleshooting

而且发现 PROTON_LOG 选项没有用,找不到相关日志。

  1. 更改软件启动项 Steam 游戏上右键 -> 属性 -> 启动选项,添加以下配置
PROTON_LOG_DIR=/home/light4/ PROTON_LOG=1 PROTON_USE_WINED3D=1 %command% &> /home/light4/mytest.log

发现除了上边的无关日志外还有一行

bwrap: Can't bind mount /oldroot/etc/resolv.conf on /newroot/etc/resolv.conf: Unable to mount source on destination: No such file or directory

开始怀疑是 bubblewrap 没有权限的问题,安装 bubblewrap-suid 替换 bubblewrap,发现问题依旧。 最终原因是我用到了 ss-tproxy 这个项目,它已经 mount 了 /etc/resolv.conf, 导致 bwrap 无法正常使用。

解决办法

既然知道了原因,办法也很简单:

  1. 换用很老版本的 Proton,这样没有用到 bwrap,也就没有冲突
  2. 暂时停用 ss-tproxy 或者等游戏起来之后再启动
  3. 修改 ss-tproxy,不要改 /etc/resolv.conf

启发

  1. 软件共享状态是不好的习惯