解說如何在ARM64(Aarch64)的Android手機,透過Termux proot-distro,模擬執行x86_64架構的Ubuntu系統。
1. 說明#
你說,大部分Android裝置都是ARM64架構啊?為什麼不裝ARM版本的Ubuntu就好?有的程式就是很機車,沒有編譯給ARM使用。
那麼在硬跑x86架構程式的路子上,我們就有三種選擇:
- 跑ARM64的系統,安裝 Box64轉譯器
- 透過qemu-system,開一個完整的x86_64模擬機,如 Ubuntu x86_64 + QEMU虛擬機
- 透過qemu-user,模擬執行x86_64的系統。
qemu-system跑的是虛擬機,模擬完整硬體設備,讓Linux可以像跑在真的電腦上一樣。當然十分吃資源。
而qemu-user是userspace的模擬器,能夠在ARM64的裝置模擬執行x86執行檔,卻又不需要用到整個虛擬機的資源。
QEMU支援模擬多種架構,除了x86_64外,模擬32位元x86、RISC-V等架構也是有可能的。
在Termux中,我們只要有rootfs就能讓一個Linux系統跑起來,不需要用到qemu-system的虛擬機模擬。
proot-distro工具內建qemu支援。本文討論的便是用proot-distro工具,搭配qemu-user,跑一個x86_64的系統。
因為是模擬的,程式執行的速度當然比原生的慢,加上proot效能損耗,更慢了。文末我們會比較Proot原生 vs Box64 vs qemu-user的速度。
2. 測試環境#
- 手機:Sony Xperia 10 V,Android 13
- Linux核心版本:5.4
- Termux版本:0.118.0
- qemu-user版本:8.1.0
- Ubuntu版本:20.04(Ubuntu 22.04會遇到apt pub_key無法匯入的問題)
3. 建立x86_64架構的proot Ubuntu#
- 參考
proot-distro新增自訂rootfs,新增
Ubuntu 20.04_x86_64.sh
的指令稿。但這裡要改一下內容。
vim $PREFIX/etc/proot-distro/ubuntu20.04_x86_64.sh
- 修改如下
# 指定架構為x86_64
DISTRO_ARCH=x86_64
DISTRO_NAME="Ubuntu20.04 x86_64"
DISTRO_COMMENT="Ubuntu 20.04 Focal x86_64"
TARBALL_STRIP_OPT=0
# 下載x86_64架構的Ubuntu base
TARBALL_URL['x86_64']="https://cdimage.ubuntu.com/ubuntu-base/focal/daily/current/focal-base-amd64.tar.gz"
TARBALL_SHA256['x86_64']="16c831cc71b8ab79e5156451558df4a025783ba335047f6343518e7225416929"
- 安裝
qemu-user-x86-64
pkg install qemu-user-x86-64
- 安裝Ubuntu
proot-distro install ubuntu20.04_x86_64
- 登入Ubuntu,proot-distro會自動使用QEMU執行。
proot-distro login ubuntu20.04_x86_64
透過
uname -a
指令可看到架構是為x86_64,而不會出現Exec format error
。如果在安裝套件的時候出現
signal 11 Segmentfault
錯誤,跑一次dpkg --configure -a
即可。
4. 比較原生與模擬執行的速度#
說明:下表的qemu-user指的是本文方法
native代表的是proot Ubuntu安裝的arm64架構的執行檔
Box64表示在proot Ubuntu使用box64
指令,轉譯執行x86_64架構的執行檔
使用7z解壓縮一個133MB的zip檔案,用time測要多久時間完成。
方法 | qemu-user | native | Box64 |
---|---|---|---|
完成時間(秒) | 5.895 | 2.064 | 2.141 |
從上面的結果來看,速度上native > Box64 > qemu-user
5. 結論#
qemu-user仍然比Box64慢。
使用qemu-user的好處在於,整個Linux系統都是模擬的,卻不用像qemu-system那樣吃資源
若是使用Box64的方案,使用者無法從APT安裝x86_64架構的套件,而qemu-user可以。並且qemu-user較少有unknown system call的錯誤出現。
ARM64架構的系統搭配Box64的作法適合偶爾跑x86_64程式,該程式還不可以依賴太多libc或者特定的函式庫(Box64得一一實作system call)。
qemu-user基本上不會有這個問題,適合專門模擬x86程式的情況。
可是qemu-user仍然會不時出現Segmentfault的錯誤,致使圖形環境的套件裝不起來。