快轉到主要內容

用Termux qemu-user在ARM64架構的Android模擬執行x86_64的Ubuntu

智慧型手機 Termux教學 Proot-Distro QEMU User Mode
🗓️ 民國112年 癸卯年
✍ 切換正體/簡體字
目錄

解說如何在ARM64(Aarch64)的Android手機,透過Termux proot-distro,模擬執行x86_64架構的Ubuntu系統。

1. 說明
#

你說,大部分Android裝置都是ARM64架構啊?為什麼不裝ARM版本的Ubuntu就好?有的程式就是很機車,沒有編譯給ARM使用。

那麼在硬跑x86架構程式的路子上,我們就有三種選擇:

  1. 跑ARM64的系統,安裝 Box64轉譯器
  2. 透過qemu-system,開一個完整的x86_64模擬機,如 Alpine Linux x86 + QEMU
  3. 透過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
#

  1. 參考 proot-distro新增自訂rootfs,新增Ubuntu 20.04_x86_64.sh的指令稿。但這裡要改一下內容。
vim $PREFIX/etc/proot-distro/ubuntu20.04_x86_64.sh
  1. 修改如下
# 指定架構為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"
  1. 安裝qemu-user-x86-64
pkg install qemu-user-x86-64
  1. 安裝Ubuntu
proot-distro install ubuntu20.04_x86_64
  1. 登入Ubuntu,proot-distro會自動使用QEMU執行。
proot-distro login ubuntu20.04_x86_64
  1. 透過uname -a指令可看到架構是為x86_64,而不會出現Exec format error

  2. 如果在安裝套件的時候出現signal 11 Segmentfault錯誤,跑一次dpkg --configure -a即可。

4. 比較原生與模擬執行的速度
#

說明:下表的qemu-user指的是本文方法

native代表的是proot Ubuntu安裝的arm64架構的執行檔

Box64表示在proot Ubuntu使用box64指令,轉譯執行x86_64架構的執行檔

使用7z解壓縮一個133MB的zip檔案,用time測要多久時間完成。

方法qemu-usernativeBox64
完成時間(秒)5.8952.0642.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的錯誤,致使圖形環境的套件裝不起來。

6. 參考資料
#

相關文章

在Termux proot-distro使用自訂rootfs,建立Linux容器
智慧型手機 Termux教學 Proot-Distro
Android手機安裝Linux發行版:Termux proot-distro使用教學
智慧型手機 Termux教學 Proot-Distro
Android手機免Root安裝Ubuntu系統 (Termux圖形桌面+中文化+音訊+一鍵啟動指令稿)
智慧型手機 Termux教學 Proot-Distro Ubuntu

留言板

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

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

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