通过命令行(Proton)执行 Steam Play 游戏时出错

tat*_*tsu 9 command-line wine steam games

最近 Steam 发布了 Steam Play,它使用 Steam 托管的名为 Proton(GitHub)的 Wine 分支,让我们可以在 Linux 下玩我们完整的游戏库。它为您所有还没有 Linux 端口的游戏创建了 wineprefix,并且比 wine 好得多。

我正在尝试运行Supreme Commander - Forged Alliance(Steam 应用程序 ID:9420)并在其非官方多人游戏客户端 FAF 上播放。该游戏曾经可以与 Wine 一起使用,但现在有许多问题(例如,全屏无法运行,并且在窗口中很容易出现黑屏)。但它确实适用于 Proton。

我在这里要做的是通过终端运行这个特定的 Steam 游戏,而不是通过 Steam 的 GUI。

我的意图不是规避 Steam DRM,它通过终端运行游戏可能无论如何都无法完成,而是使用动态参数运行它。这将允许设置多人比赛。这将在未来应用于其他游戏。


但是我在终端中运行时遇到了麻烦:

cd ~/.local/share/Steam/steamapps/common/Proton*
STEAM_COMPAT_DATA_PATH=/home/t/.local/share/Steam/steamapps/compatdata/9420 ./proton run /home/t/.local/share/Steam/steamapps/common/Supreme\ Commander\ Forged\ Alliance/bin/SupremeCommander.exe
Run Code Online (Sandbox Code Playgroud)

我收到一个错误窗口:“应用程序加载错误 P:0000065615”,关闭它只会让我回到终端,没有额外的输出。我已经尝试过其他游戏:

  1. 帝国时代 2 HD失败了,但有一个更详细的错误消息窗口,说明 Steam 必须正在运行,但我当时正在运行 Steam(如果我点击 Steam 中的播放按钮,它就会运行)。

  2. Bannerman:根本没有消息,甚至没有终端冗长。

  3. Shadow Complex Remastered获取游戏的实际加载器屏幕,运行大约两秒钟然后崩溃并出现错误:

    CAppInfoCacheReadFromDiskThread took 3 milliseconds to initialize
    CApplicationManagerPopulateThread took 7 milliseconds to initialize (will have waited on CAppInfoCacheReadFromDiskThread)
    
    Run Code Online (Sandbox Code Playgroud)

所以似乎没有游戏通过这种方法成功运行。


也许这里 有一些潜力UPDATE 3/10/2018

CAppInfoCacheReadFromDiskThread took 3 milliseconds to initialize
CApplicationManagerPopulateThread took 7 milliseconds to initialize (will have waited on CAppInfoCacheReadFromDiskThread)
Run Code Online (Sandbox Code Playgroud)

但是此方法在带有此错误窗口的最后一个命令中失败:

应用加载错误 P:0000065434

以及一些终端输出:

001f:err:module:load_builtin_dll failed to load .so lib for builtin L"winebus.sys": libudev.so.0: cannot open shared object file: No such file or directory
001f:err:ntoskrnl:ZwLoadDriver failed to create driver L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\WineBus": c0000142
001f:err:winedevice:create_driver failed to create driver L"WineBus": c0000142
0013:err:service:process_send_command service protocol error - failed to write pipe!
000d:fixme:service:scmdatabase_autostart_services Auto-start service L"WineBus" failed to start: 1114
0009:err:module:load_library somehow failed to load steamclient
Run Code Online (Sandbox Code Playgroud)

所以现在我们对这个问题有了更多的了解。似乎尽管蒸汽正在运行,并且采取一切措施让它知道蒸汽在哪里,但它没有找到蒸汽。

我也从质子文件夹中尝试了同样的事情,结果相同。


这里有一些新的潜力UPDATE 3/10/2018

他提到的技巧是创建一个小的python脚本protonRunner.py

WINEPREFIX="/home/t/fa-wineprefix/":"/home/t/.local/share/Steam/steamapps/common/Proton 3.7/dist/lib/wine winecfg"
PATH="/home/t/.local/share/Steam/steamapps/common/Proton 3.7/dist/bin/:$PATH"  
export WINEDLLPATH="/home/t/.local/share/Steam/steamapps/common/Proton 3.7/dist/lib64/wine:/home/t/.local/share/Steam/steamapps/common/Proton 3.7/dist/lib/wine"  
export LD_LIBRARY_PATH="/home/t/.local/share/Steam/steamapps/common/Proton 3.7/dist/lib64:/path/to/steam/steamapps/common/Proton 3.7/dist/lib:/usr/lib/steam:/usr/lib32/steam"
WINEPREFIX="/home/t/fa-wineprefix/"  "/home/t/.local/share/Steam/steamapps/common/Proton 3.7/dist/bin/./wine"   "/home/t/.local/share/Steam/steamapps/common/Supreme Commander Forged Alliance/bin/SupremeCommander.exe"
Run Code Online (Sandbox Code Playgroud)

supcomFA.desktop

[Desktop Entry]
Name=SupremeCommander
Exec=python $HOME/.local/share/Steam/steamapps/common/Proton\ 3.7/protonRunner.py
Icon=/home/t/.local/share/icons/supcom.png
Type=Application
Encoding=UTF-8
Version=1.0
Terminal=true
Run Code Online (Sandbox Code Playgroud)

这样做会完成相同的错误消息:

应用加载错误 P:0000065434


TL;DR:如何从终端运行 Windows Steam 游戏(设法在 Linux 上通过 Proton 运行)。

mur*_*uru 2

这里有一个实验可以帮助你找到答案。为了方便起见,我将您的默认 Steam 库位置称为$STEAM(默认为~/.local/share/Steam/)。Proton 默认安装为$STEAM/steamapps/common/Proton 3.7,我称之为$PROTON

因此,当我尝试运行《巫师》时,Steam 运行了以下命令:

"$PROTON/dist/bin/wine-preloader" "$PROTON/dist/bin/wine" "Z:\$STEAM\steamapps\common\The Witcher Enhanced Edition\System\witcher.exe"
Run Code Online (Sandbox Code Playgroud)

其中$STEAM有反斜杠而不是斜杠,因为它是 Windows 路径。此外,它还设置了大约 70 个环境变量(与 Wine、Steam、各种硬件/驱动程序、库等相关)。单个变量,WINESERVERSOCKET引用为此实例启动的 wine 服务器。如果我省略这个变量并使用其余的所有变量,我可以从命令行启动游戏。

脚步:

  1. 替换$PROTON/dist/bin/wine-preloader为将环境保存在某处的包装器脚本:

    PROTON="$HOME/.local/share/Steam/steamapps/common/Proton 3.7" # adjust to your settings
    mv "$PROTON/dist/bin/wine-preloader" "$PROTON/dist/bin/wine-preloader-orig"
    printf "%s\n" '#! /bin/sh' 'env --null | grep -vz WINESERVERSOCKET > ~/env' > "$PROTON/dist/bin/wine-preloader"
    printf 'exec %q "$@"\n' "$PROTON/dist/bin/wine-preloader-orig" >> "$PROTON/dist/bin/wine-preloader"
    chmod +x "$PROTON/dist/bin/wine-preloader"
    
    Run Code Online (Sandbox Code Playgroud)

    该脚本本质上是这样的:

    #! /bin/sh
    env --null | grep -vz WINESERVERSOCKET= > ~/env
    printf "%s\0" "$0"-orig "$@" > ~/cmd
    exec /home/user/.local/share/Steam/steamapps/common/Proton\ 3.7/dist/bin/wine-preloader-orig "$@"
    
    Run Code Online (Sandbox Code Playgroud)

    它保存环境,除了要运行的命令和参数之外,WINESERVERSOCKET并使用提供的参数运行实际文件。它使用 ASCII 空字符来分隔所有内容,因为实际的环境变量可能包含换行符。~/env~/cmd

    请注意,为了方便起见,我保存了添加的命令-orig

  2. 从 Steam GUI 运行游戏。包装器脚本将创建这些文件。

  3. 您可以加载环境并从这些文件运行命令。在bash中

    mapfile -d '' -t env < ~/env
    mapfile -d '' -t cmd < ~/cmd
    env "${env[@]}" "${cmd[@]}"
    
    Run Code Online (Sandbox Code Playgroud)

    -d ''这里告诉 bash 文件使用 ASCII 空字符作为分隔符。

这足以让巫师为我竞选。所有这些环境变量可能都不是必需的。我把它留给你来测试哪些不是。


当然,所有这些可能完全没有必要。查看 Steam 的命令行选项,我们有:

-applaunch <appID> [launch parameters]  Launches an Game or Application through Steam.
Run Code Online (Sandbox Code Playgroud)

当我跑的时候:

steam -applaunch 20900 foo bar
Run Code Online (Sandbox Code Playgroud)

Wine 命令是:

"$PROTON/dist/bin/wine" "Z:\$STEAM\steamapps\common\The Witcher Enhanced Edition\System\witcher.exe" foo bar
Run Code Online (Sandbox Code Playgroud)

所以Steam确实将fooandbar作为游戏的论据。这可能就是您所需要的。