用 steam 的 proton 執行 windows exe

偶爾會用 wine 在 linux 下跑 exe 玩遊戲,但相容性還是有些問題。 steam 之前為了推 steam linux, 在 wine 之上改良了一個 proton,相容性好很多,適合拿來玩遊戲。 我是裝 steam for linux 後,再用 steam 裝了 proton。 如果想不透過 steam 用 proton 跑 exe 檔案, 可以直接執行 proton 執行檔: "~/.steam/steam/steamapps/common/Proton 5.13/proton" run game.exe , 另外要再設一個環境變數 STEAM_COMPAT_DATA_PATH 指定 proton 存資料的資料夾。

wine 是在類 unix 下對 windows 程式的相容層, 簡單來說就是能在 linux 下執行 exe 檔的一支程式。 但 wine 還是有許多大大小小 bug, 不是每個程式都能順利執行, 可能執行時出狀況,或根本執行不了閃退, 有時也需要依程式調整不同的參數讓不同程式可以順利執行。

在電腦的一大需求 玩遊戲 中, 由於遊戲多半只會發布 windows 版本, wine 也常用來在 linux 下執行 windows 遊戲。 為了玩遊戲,人的潛能是無限的; PlayOnLinux 即是基於 wine, 提供了一套社群維護的對不同程式的設定參數, 讓在 linux 上玩遊戲可以更簡單。

proton 則是 steam 公司之前推 steam os linux 作業系統時, 希望能在 linux 上玩 windows 遊戲, 開發的 wine 分支,專注在遊戲的相容性。 使用上一般是在 steam for linux 中安裝 proton , 之後 steam 上原本只能在 windows 中執行的遊戲, 即可也在 linux 中以 proton 執行。

但啟動 steam 中的遊戲都是在 steam 介面進行, 所以我們不會知道遊戲執行檔放在哪, 或是 proton 如何參與執行遊戲的過程。 如果要繞過 steam,直接用 steam 裝好的 proton 執行 exe 檔案, 我在 reddit 上有找到一份回答 , 之後又自己修改了一下。

基本上就是先找到自己的 proton 路徑, 以我 debian 是 ~/.steam/steam/steamapps/common/Proton 5.13/proton 。 proton 是一支用 python 寫的包裝腳本, 有不同的子命令,要啟動遊戲要用 run 命令; 像 wine 啟動遊戲是 wine game.exe , proton 則是 proton run game.exe

此外直接執行多半會出錯, 因為還需要指定 proton 執行的函式庫和資料的路徑, 對 wine 來說就是 ~/.wine 裡的資料, 而 steam 的遊戲依不同的 id 存在 ~/.steam/steam/steamapps/compatdata 。 指定方式是用環境變數 STEAM_COMPAT_DATA_PATH 的傳遞。 另外如果是指定空目錄,proton 就會自己初始化該目錄。 遊戲執行時,所看到的 c 槽就是在該目錄裡,所以遊戲存檔也會在裡面。

我整理了一個 proton-auto 腳本 , 用法就是 proton-auto game.exe , 會使用名為 proton-compat-data 的目錄存資料。 此外也可以手動指定目錄 proton-auto my-compat-data game.exe

目前比較不滿意是每個遊戲都建立一份資料的話,其實蠻佔空間的, 一個 compat data 會佔 100MB 左右, 儘管內容多半是相同的 dll 函式庫或其它 exe, 反正就是 c 槽的基礎 windows 系統。 有一個想法是用 overlayfs 重覆使用同一個基礎 c 槽, 只記錄不同的部份就好。 基礎的 c 槽資料似乎是在 ~/.steam/steam/steamapps/common/Proton 5.13/dist/share/default_pfx/drive_c , 範例用法大概如下:

mkdir -p overlay/{write,work}
mkdir -p proton-compat-data/pfx
sudo mount -t overlay overlay -o lowerdir="$HOME/.steam/steam/steamapps/common/Proton 5.13/dist/share/default_pfx",upperdir=$PWD/overlay/write,workdir=$PWD/overlay/work proton-compat-data/pfx
proton-auto proton-compat-data game.exe
sudo umount proton-compat-data/pfx

有個問題是裡面的相對連結果會壞掉。 建立 pfx 時某些檔案是用相對符號連結做的,而不是真的複製。 所以用 overlayfs 把整個目錄掛載過來後,相對連結就會壞掉, 原本 .. 可以指到 proton 中上一層的內容, 現在就變成指到所在目錄的內容。

可能要做一個所有內容都是實際檔案的 c 槽當 overlayfs 的 base。 不然就是乾脆不要用 overlayfs, 因為既然已經有用不少符號連結,那佔用空間應該有減少很多了, (實際還是有 100MB。) 剩的可能是 steam 評估不適合用符號連結的檔案, 可能會被修改之類的;總之我只是瞎猜。