快轉到主要內容

FEX-Emu安裝:樹莓派玩Steam Windows遊戲,Linux ARM平台的x86模擬器

· 民國113年甲辰年
·
切換繁體/簡體
分類 Linux系統 Linux玩遊戲
標籤 Box86 Box64 Raspberry Pi
目錄

「FEX-Emu」是一款開源軟體,它能夠在ARM架構的Linux系統轉譯x86架構的程式,進而執行Steam上的Windows遊戲。

圖例:在ARM架構的Raspberry Pi 5玩Steam的3D遊戲《Alpaca Stacka》

Screenshot_20241013_112825.webp

本文討論FEX-Emu的安裝與用法。

1. Fex-Emu簡介
#

FEX-Emu啟動時會掛載自身的RootFS,並將x86程式轉譯為arm64的行程,目前僅支援arm64 (aarch64) 的系統,不支援armhf 32位元。不過32位元x86架構的程式依然能夠轉譯執行。

討論這個專案的時候,常常會跟Box64/Box86專案一同提及吧。根據Box64作者ptitSeb在2022年做的測試,FEX-Emu執行速度比QEMU User快,但是比Box64慢。

benchmark.webp

我自己測試的時候也是這種感覺,雖然FEX-Emu不斷的在更新,但是到了2024年,樹莓派上的FEX-Emu遊戲玩起來還是比Box64要卡。

即使如此,FEX-Emu還是有它的優勢在。

Fex-Emu原理圖如下:

fex-diagram.webp

相較Box64,FEX-Emu有RootFS,提供更完整的Linux環境,不用像Box64那樣得裝一堆額外套件補驅動。

論FEX-Emu比較有名的應用案例,就是Asahi Linux了。

讓Apple M1平台能跑Steam大型遊戲的功臣,Fex-Emu就是其中一個組件。AAA gaming on Asahi Linux

Screenshot_20241013_013926.webp

FEX-Emu作者在Qualcomm Snapdragon 8cx平台演示了玩《GTA 5》的可能性。

從2025年Valve開發者的訪談中得知,Valve一直有在贊助FEX-Emu專案的開發,為未來ARM架構的Steam Deck鋪路。參見:Steam Machine today, Steam Phones tomorrow - The Verge

此外,既然Box64能移植到Android Termux proot執行,FEX-Emu或許能在Android跑?GitHub已經有一些試驗的專案了。但是FEX-Emu Wiki直接明說了:現階段不可能支援Android,主要還是以Linux為主。

2. 測試環境
#

  • Raspberry Pi 5
  • Raspberry Pi OS 12 Bookworm
  • FEX-Emu 2410

執行前請用指令vulkaninfo --summary,檢查Raspberry Pi的GPU加速有無正常運作。

3. 安裝FEX-Emu
#

  1. FEX-Emu目前僅支援4K Page的系統,Raspberry Pi 5使用16K Page,故需要調整系統開機參數,改回4K Page。
echo '# 4k pages
kernel=kernel8.img
'| sudo tee -a /boot/firmware/config.txt

2.重開機套用變更。執行指令確認已經啟用4K Page

getconf PAGESIZE
  1. FEX-Emu作者有提供Python安裝指令稿,裡面有套件庫可以下載編譯好的套件,但是僅支援Ubuntu,Debian不行。得參考Wiki手動編譯FEX-Emu,安裝以下依賴套件:
sudo apt install git cmake ninja-build pkgconf ccache clang llvm lld binfmt-support libssl-dev python3-setuptools g++-x86-64-linux-gnu libgcc-12-dev-i386-cross libgcc-12-dev-amd64-cross nasm python3-clang libstdc++-12-dev-i386-cross libstdc++-12-dev-amd64-cross libstdc++-12-dev-arm64-cross squashfs-tools squashfuse libc-bin libc6-dev-i386-amd64-cross lib32stdc++-12-dev-amd64-cross qtdeclarative5-dev qml-module-qtquick-controls qml-module-qtquick-controls2 qml-module-qtquick-dialogs pkg-config libclang-dev libdrm-dev libxcb-present-dev libxcb-dri2-0-dev libxcb-dri3-dev libxcb-glx0-dev libxcb-shm0-dev libxshmfence-dev
  1. 複製FEX-Emu原始碼,編譯FEX-Emu
git clone --recurse-submodules https://github.com/FEX-Emu/FEX.git

cd FEX

mkdir Build

cd Build

CC=clang CXX=clang++ cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DUSE_LINKER=lld -DENABLE_LTO=True -DBUILD_TESTS=False -DENABLE_ASSERTIONS=False -G Ninja ..

ninja
  1. 安裝FEX-Emu
sudo make install
  1. FEX-Emu可能會跟box64與qemu-user-static衝突,若有的話必須將/etc/binfmt.d//usr/lib/binfmt.d/的檔案移除。
update-binfmts --display
  1. 向Linux的binfmt服務註冊FEX-Emu,讓系統自動將x86程式交給FEX-Emu轉譯
sudo ninja binfmt_misc

sudo systemctl status systemd-binfmt

4. 設定FEX-Emu的RootFS
#

  1. 執行FEXRootFSFetcher,下載最新Ubuntu x86_64的RootFS到~/.fex-emu,選取Extract選項,解壓縮
./FEXRootFSFetcher
  1. RootFS裡面的套件將作為FEX-Emu轉譯程式時的依賴,也就是說執行x86架構程式的時候會先從RootFS裡面去找相關的函式庫,但有些檔案並沒有預先安裝。此時可用~/.fex-emu/RootFS的指令稿,chroot進去RootFS,補足中文字體、AppImage libfuse等套件:
cd ~/.fex-emu/RootFS/Ubuntu_24_04

# 進入chroot
sudo ./unbreak_chroot.sh

# 安裝想要的套件
apt update
apt install fonts-noto-cjk libfuse2

# 退出chroot
exit
sudo ./break_chroot.sh
  1. 接著執行FEXConfig圖形程式,將Ubuntu的RootFS設定為預設。
    Screenshot_20241013_012351.webp

5. 執行x86架構的Linux程式
#

Wiki寫得不清不楚的…我是看NicoD的影片才知道個大概。

這裡執行的僅限x86架構的Linux二進位檔,Wine我們下一節再談。

將要執行的程式放到任意目錄,例如我使用Firefox x86_64的二進位執行檔,下載後將tar.bz檔案解壓縮。

開啟終端機,用FEXLoader執行,它會進行轉譯,並把x86_64的程式轉化為arm64的行程

FEXLoader ./firefox-bin

如果有註冊binfmt,那麼直接執行x86程式,系統應該也會自動交給FEX-Emu轉譯

./firefox-bin

至於FEXBash是用來執行x86程式的封裝指令稿之用的。

這裡有個問題:既然有RootFS了,我們就chroot進去裝x86版本的程式就好了啊,為何要獨立執行呢?嗯,這就是FEX-Emu設計上讓人困惑的地方,程式究竟該裝在宿主機目錄呢,還是RootFS內呢?我是覺得,單一x86執行檔就放在RootFS外面執行,需要依賴套件管理器的x86程式再用RootFS內部的APT裝。

6. 用Wine執行Windows程式
#

雖然Debian系發行版支援Multiarch,我們也不要在ARM的宿主機用APT硬裝x86的Wine套件,因為容易遇到依賴地獄問題,且不是所有Linux發行版都能像Debian這樣幹。

Box64執行Wine的方式是手動下載Wine的二進位執行檔,而非透過APT安裝。然而這種安裝方法十分麻煩,也不利於Winetricks執行。

那麼,就在Ubuntu的RootFS裡面裝x86版的Wine吧!FEX-Emu作者已經幫我們裝好了,可以直接用。

不信?執行FEXBash winecfg,Wine界面這不就出來了嗎!

Screenshot_20241012_232839.webp

雖然Wine是裝在RootFS內部的,但WINEPREFIX卻是位於~/.wine

DXVK似乎沒有安裝的樣子,我們得手動下載安裝DXVK放到對應位置。

如果要用Wine執行exe:

FEXBash

wine "exe路徑"

7. 執行Steam遊戲
#

關於Steam安裝,FEX-Emu Wiki寫要裝在宿主機,不是RootFS,還說這是一個很複雜的程式,啟動很容易出問題。

  1. 在宿主機,給Debian啟用i386架構支援:
sudo dpkg --add-architecture i386 && sudo apt update
  1. 從Steam官網下載deb套件,在宿主機安裝:
wget https://cdn.cloudflare.steamstatic.com/client/installer/steam.deb

sudo apt install ./steam.deb
  1. Steam的執行檔其實是一個封裝指令稿,故使用FEXBash執行:
FEXBash steam
  1. 等待依賴裝完。若Steam Client WebHelper崩潰,嘗試停用GPU加速。

  2. 只要Steam開起來後面就不用煩惱了,Steam會自動給Windows遊戲下載Proton。

  3. 如果Steam一直崩潰,嘗試停用steamwebhelper的GPU加速,或者改用SteamCMD下載遊戲。

  4. Steam成功開啟之後,Fex-Emu在轉譯執行遊戲的時候會吃掉大量的RAM,8GB RAM都不夠用,可能需要提高SWAP免得程式被系統殺掉。

8. 測試FEX-Emu的3D加速
#

通過FEXBash執行Wine,確認能使用3D加速。

比較下二者結果,確認GPU有沒有跑起來

glxinfo | grep OpenGL → 讀到Broadcom的GPU

FEXBash glxinfo | grep OpenGL → 讀到llvmpipe

FEXBash wine "exe路徑" → 讀到Broadcom的GPU

若FEX的RootFS內部無法使用3D加速,可能得使用ThunkLib

參考資料
#

相關文章


此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。

(留言板載入中)這是Giscus留言板,需要Github帳號才能留言。支援Markdown語法,若要上傳圖片請善用外部圖床。您的留言會在Github Discussions向所有人公開。

Click here to edit your comments.

(留言板載入中)這是Disqus留言板,您可能會看到Disqus強制投放的廣告。為防止垃圾內容,有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請善用外部圖床網站。