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

目錄
本文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 4
為例,作業系統為Raspberry Pi OS Bullseye 64-bit
。
Box86/Box64專案處在積極開發的階段,儘管已經有第三方儲存庫提供編譯好的deb套件,仍建議從原始碼編譯安裝。如果只要跑64位元的x86程式,編譯Box64就夠了。
但是Box64不含任何32位元的轉譯程式,如果要跑32位元的x86程式,您還是得裝Box86。
2.1. Box64 #
- 安裝編譯依賴套件
sudo apt install build-essential mono-runtime git cmake
sudo apt install libgl1 libasound2 libc6 libglib2.0-0 libgphoto2-6 libgphoto2-port12 libgstreamer-plugins-base1.0-0 libgstreamer1.0-0 libpcap0.8 libpulse0 libsane1 libudev1 libunwind8 libusb-1.0-0 libx11-6 libxext6 ocl-icd-libopencl1 libasound2-plugins libncurses6 libcap2-bin libcups2 libdbus-1-3 libfontconfig1 libfreetype6 libglu1-mesa libgnutls30 libgssapi-krb5-2 libkrb5-3 libodbc1 libosmesa6 libsdl2-2.0-0 libv4l-0 libxcomposite1 libxcursor1 libxfixes3 libxi6 libxinerama1 libxrandr2 libxrender1 libxxf86vm1
- 編譯安裝Box64
cd ~
git clone https://github.com/ptitSeb/box64
cd box64
mkdir build; cd build; cmake .. -DRPI4ARM64=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
make -j4
sudo make install
sudo systemctl restart systemd-binfmt
cd ~ && rm -r ~/box64
2.2. Box86 #
- 啟用32位元儲存庫(armhf)支援,安裝編譯依賴套件
sudo dpkg --add-architecture armhf
sudo apt update
sudo apt install gcc-arm-linux-gnueabihf
sudo apt install libgl1:armhf libasound2:armhf libc6:armhf libglib2.0-0:armhf libgphoto2-6:armhf libgphoto2-port12:armhf libgstreamer-plugins-base1.0-0:armhf libgstreamer1.0-0:armhf libpcap0.8:armhf libpulse0:armhf libsane1:armhf libudev1:armhf libusb-1.0-0:armhf libx11-6:armhf libxext6:armhf ocl-icd-libopencl1:armhf libasound2-plugins:armhf libncurses6:armhf libcap2-bin:armhf libcups2:armhf libdbus-1-3:armhf libfontconfig1:armhf libfreetype6:armhf libglu1-mesa:armhf libgnutls30:armhf libgssapi-krb5-2:armhf libkrb5-3:armhf libodbc1:armhf libosmesa6:armhf libsdl2-2.0-0:armhf libv4l-0:armhf libxcomposite1:armhf libxcursor1:armhf libxfixes3:armhf libxi6:armhf libxinerama1:armhf libxrandr2:armhf libxrender1:armhf libxxf86vm1:armhf
- 編譯安裝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
重要的環境變數:
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
4. Box86/Box64配合Wine跑Windows exe #
Wine是讓Linux跑Windows exe程式的轉譯技術,然而其支援的Windows程式大多只有x86版本。
以APT的架構而言,請不要嘗試直接用APT硬裝x86版Wine的deb套件,在此,我們使用Box86開發者推薦的的方式,用符號連接將Wine執行檔硬塞到系統裡面。
- 取得 Kron4ek編譯的Wine執行檔,以符號連結安裝
cd ~
wget https://github.com/Kron4ek/Wine-Builds/releases/download/8.12/wine-8.12-amd64.tar.xz
tar -xvf wine-8.12-amd64.tar.xz
mv ~/wine-8.12-amd64/ ~/wine
rm -rf wine-8.12-amd64.tar.xz
sudo ln -s ~/wine/bin/wine64 /usr/local/bin/wine64
sudo ln -s ~/wine/bin/wine /usr/local/bin/wine
sudo ln -s ~/wine/bin/wineboot /usr/local/bin/wineboot
sudo ln -s ~/wine/bin/winecfg /usr/local/bin/winecfg
sudo ln -s ~/wine/bin/wineserver /usr/local/bin/wineserver
wget https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks
sudo mv winetricks /usr/local/bin/
sudo chmod +x /usr/local/bin/wine /usr/local/bin/wineboot /usr/local/bin/winecfg /usr/local/bin/wineserver
- 安裝圖形相關套件。由於我會用符號連結的方式安裝Wine,如果要用Wine執行遊戲類的x86架構圖形應用程式,就得手動裝以下依賴套件。
sudo apt install libx11-dev libgl-dev libvulkan-dev libtcmalloc-minimal4 libnm0 zenity alsamixergui libsdl2-dev unzip libgles-dev libx11-dev:arm64 libvulkan-dev:arm64 libsdl2-dev:arm64 libgl-dev:arm64 libc6-dev:arm64 libgles-dev:arm64 libsdl2-dev
裝好後就可以用以下組合,啟動Windows exe。啟動前需注意exe是32位元還是64位元。
box64 wine64 <Windows exe執行檔>
box86 wine <Windows exe執行檔>
注意Box86/Box64的3D繪圖圖形指令尚有部份未實作,Winetricks也不太穩定,建議先從簡單的小遊戲開始測試。
如果要區分32位元與64位元環境,可以用WINEPREFIX隔開不同程式的設定檔目錄
# 設定檔位於~/.wine64
WINEPREFIX=~/.wine64 box64 wine64 <Windows exe執行檔>
# 設定檔位於~/.wine,指定32位元
WINEPREFIX=~/.wine WINEARCH=win32 box86 wine <Windows exe執行檔>
同理,Winetricks執行前,最好也先指定要裝到哪個Wine環境:
WINEPREFIX=~/.wine64 box64 winetricks
5. 其他Box86/Box64使用例 #
參考資料 #
- Box86 - Linux Userspace x86 Emulator with a twist, targeted at ARM Linux devices - Github
- Box64 - Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices - Github
- Box86/Box64 vs QEMU vs FEX (vs Rosetta2) - box86.org
- Wine - ArchWiki
- How to Install Box86, Box64 and Wine on Raspberry Pi OS Bullseye 64-bit - medium