快轉到主要內容

如何在ARM架構樹莓派跑x86程式:Box86+Box64使用教學

分類   Linux系統 虛擬機與容器技術
標籤   Box86 Box64 Raspberry Pi
🗓️ 民國113年 甲辰年
✍ 切換正體/簡體字
目錄

本文Ivon介紹如何使用Box86/Box64轉譯技術,在ARM架構的Linux電腦跑x86架構的程式。

Box86/Box64對樹莓派開發板、ARM筆電、Android手機的用戶來說十分有用,可以執行更多程式,而不用受到架構不同的困擾。

*本文使用「x86」指稱架構名稱,與位元無關。另外在無特別說明下,「ARM」包含aarch64、arm64。

1. 為什麼要採用Box86/Box64
#

有時用ARM架構的電腦跑程式,會遇到部分程式只提供x86版本的情形,致使出現exec format error錯誤。

雖說用qemu-user-static模擬x86架構是個解法,例如有人做給Docker用的 qus-docker,然其效率低下。

此時,可以採用ptitSeb開發的「Box86/Box64」轉譯技術,更高效率地將x86指令轉譯成ARM指令。

該專案難能可貴的地方,在於它是開放原始碼的技術,而非Apple Rosseta2、華為ExaGear那樣的專有軟體。

其針對各種開發板和ARM處理器優化。分為二個部分:Box86負責轉譯32位元的x86指令集;Box64則是轉譯64位元的x86指令集。

Box86/Box64在userspace執行,使用"Dynamic recompilation"提升轉譯效率。根據下圖開發者ptitSeb的跑分比較,Box86的效率比QEMU和FEX的高很多,甚至可以比肩Apple的Rosetta2。

更棒的是,Box86/Box64還支援轉譯3D繪圖指令,所以它是可以玩遊戲的。目前已經可以在ARM架構的Linux裝置,配合x86版本的Wine,跑一些x86的Windows遊戲。(見文末使用例)

2. 編譯安裝Box86/Box64
#

官方Github說明有針對其他ARM開發板的編譯指示,此處以Raspberry Pi 5為例,作業系統為Raspberry Pi OS Bookworm 64-bit

Box86/Box64專案處在積極開發的階段,儘管已經有第三方儲存庫提供編譯好的deb套件,仍建議從原始碼編譯安裝。如果只要跑64位元的x86程式,編譯Box64就夠了。

但是Box64不含任何32位元的轉譯程式,如果要跑32位元的x86程式,您還是得裝Box86。

2.1. Box64
#

  1. 安裝編譯依賴套件
sudo apt install build-essential mono-runtime git cmake
  1. 編譯安裝Box64
cd ~

git clone https://github.com/ptitSeb/box64

cd box64

mkdir build; cd build; cmake .. -DRPI5ARM64=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo

make -j4

sudo make install

sudo systemctl restart systemd-binfmt

cd ~

rm -r ~/box64

2.2. Box86
#

  1. 啟用32位元儲存庫(armhf)支援,安裝編譯依賴套件
sudo dpkg --add-architecture armhf

sudo apt update

sudo apt install gcc-arm-linux-gnueabihf
  1. 編譯安裝Box86
cd ~

git clone https://github.com/ptitSeb/box86

cd box86

mkdir build; cd build; cmake .. -DRPI4ARM64=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo

make -j4

sudo make install

sudo systemctl restart systemd-binfmt

cd ~ && rm -r ~/box86

3. Box86/Box64基礎使用方式
#

Box86/Box64的基礎功能就是執行x86程式啦,當然該程式得是Linux原生的執行檔,AppImage或許也可以。

Box86語法跟Box64很類似,此處以Box64為主,出現64的地方代換成86即可。

如果要執行x86架構程式:

box64 <二進位執行檔路徑>

例如執行Minecraft基岩版伺服器:

wget https://minecraft.azureedge.net/bin-linux/bedrock-server-1.20.11.01.zip

unzip bedrock-server-1.20.11.01.zip

box64 LD_LIBRARY_PATH=. ./bedrock_server

不過因為Box64會自動向系統systemd-binfmt註冊的關係,所以大多數時候不需要在前面加上box64指令。系統一旦偵測到該執行檔為x86架構,就會自動交給Box64或Box86轉譯執行。

如果想執行x86架構的AppImage,需將其解出:

box64 <AppImage執行檔路徑> --appimage-extract

4. Box86/Box64重要的環境變數:
#

Box86/Box64執行會輸出除錯訊息,不想看到的話請使用環境變數export BOX64_NOBANNER=1export BOX86_NOBANNER=1

使用BOX64_LD_LIBRARY_PATH指定尋找動態連結檔的路徑,預設值為目前目錄下的lib,以及系統的/usr/lib/x86_64-linux-gnu/lib/x86_64-linux-gnu

BOX64_PATH指令要尋找x86執行檔的路徑,預設值為目前目錄下的bin

碰到需要以指令稿啟動的程式,可以用Box86作者提供的x86版Bash來啟動,例如:

wget https://raw.githubusercontent.com/ptitSeb/box86/master/tests/bash
chmod +x ./bash
box86 ./bash ./start.sh

5. 其他Box86/Box64使用例
#

參考資料
#

相關文章

如何用QEMU在x86電腦模擬ARM版樹莓派系統,虛擬機跑Raspberry Pi OS
分類   Linux系統 虛擬機與容器技術
標籤   QEMU Raspberry Pi
WSL跑Linux的X server圖形環境 + virglrenderer硬體加速(不使用WSLg)
分類   Linux系統 虛擬機與容器技術
標籤   Windows Subsystem for Linux VirGL
Windows 11用WSL跑Linux的Android容器「Waydroid」
分類   Linux系統 虛擬機與容器技術
標籤   Waydroid Windows Subsystem for Linux

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur連結。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。