快轉到主要內容

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

Linux系統 虛擬機與容器技術 Box86 Box64 Raspberry Pi
🗓️ 民國112年 癸卯年
✍ 切換正體/簡體字
目錄

本文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
#

  1. 安裝編譯依賴套件
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
  1. 編譯安裝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
#

  1. 啟用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
  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

重要的環境變數:

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

4. Box86/Box64配合Wine跑Windows exe
#

Wine是讓Linux跑Windows exe程式的轉譯技術,然而其支援的Windows程式大多只有x86版本。

以APT的架構而言,請不要嘗試直接用APT硬裝x86版Wine的deb套件,在此,我們使用Box86開發者推薦的的方式,用符號連接將Wine執行檔硬塞到系統裡面。

  1. 取得 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
  1. 安裝圖形相關套件。由於我會用符號連結的方式安裝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使用例
#

參考資料
#

相關文章

如何用QEMU在x86電腦模擬ARM版樹莓派系統,虛擬機跑Raspberry Pi OS
Linux系統 虛擬機與容器技術 QEMU Raspberry Pi
QEMU/KVM虛擬機設定靜態IP + 透過SSHFS與Host OS共享資料夾
Linux系統 虛擬機與容器技術 QEMU
Linux系統Intel內顯直通給QEMU/KVM虛擬機的方法,不採用GVT-g
Linux系統 虛擬機與容器技術 GPU Passthrough Arch Linux QEMU

留言板

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

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

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