本文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那樣的專有軟體。並且Box86沒有限定樹莓派才能用,作者有針對各式各樣的ARM架構裝置最佳化,因此Rockchip、Allwinner、Phytium、Ampere、Qualcomm等廠商推出的裝置也可以裝Box86。
這個專案分為二個部分:Box86負責轉譯32位元的x86指令集;Box64則是轉譯64位元的x86指令集。
Box86/Box64在userspace執行,使用"Dynamic recompilation"提升轉譯效率。根據下圖開發者ptitSeb的跑分比較,Box86的效率比QEMU User和FEX-Emu的高很多,甚至可以比肩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專案處在積極開發的階段,如果只要跑64位元的x86程式,編譯Box64就夠了。但是Box64不含任何32位元的轉譯程式,如果要跑32位元的x86程式,您還是得裝Box86。
2.1. Box64#
註:不想手動編譯的可以加
ryanfortner/box64-debs套件庫,安裝事先編譯好的box64-rpi5arm64
套件。
- 安裝編譯依賴套件
sudo apt install build-essential mono-runtime git cmake
- 編譯安裝Box64。針對Raspberry Pi 5,需要啟用
-DRPI5ARM64=1
選項編譯
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
- Box64應該會自動向系統binfmt註冊,執行以下指令,查看註冊是否成功:
ls /etc/binfmt.d
2.2. Box86#
- 啟用32位元儲存庫(armhf)支援,安裝編譯依賴套件
sudo dpkg --add-architecture armhf
sudo apt update
sudo apt install gcc-arm-linux-gnueabihf
- 編譯安裝Box86。針對64位元的Raspberry Pi 5,需要啟用
-DRPI4ARM64=1
選項編譯
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
- Box86應該會自動向系統binfmt註冊,執行以下指令,查看註冊是否成功:
ls /etc/binfmt.d
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=1
或export 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使用例#
- 樹莓派安裝Box64與Wine,執行Windows exe
- 樹莓派玩Steam遊戲
- Android手機Termux+Box86+Wine跑Windows exe,免root
- 在Linux手機跑Steam Proton+遊戲