ARM64(Aarch64)のAndroidスマホで、Termux proot-distroを通してx86_64アーキテクチャのUbuntuシステムをエミュレート実行する方法を解説します。
1. 説明#
「Androidデバイスの大半はARM64アーキテクチャなのだから、ARM版Ubuntuを入れればいいのでは?」と思うかもしれません。しかし、世の中には厄介なプログラムもあり、ARM向けにコンパイルされていないものがあります。
そこでx86アーキテクチャのプログラムを無理やり動かす道として、選択肢は3つあります。
- ARM64のシステムを動かし、Box64トランスレーターをインストールする
- qemu-systemで完全なx86_64エミュレーターを起動する。例:Ubuntu x86_64 + QEMU仮想マシン
- qemu-userでx86_64のシステムをエミュレート実行する
qemu-systemが動かすのは仮想マシンで、完全なハードウェアデバイスをエミュレートし、Linuxを本物のPC上で動いているように実行できます。もちろん、かなりのリソースを消費します。
一方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ネイティブ、Box64、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_64uname -aコマンドで、アーキテクチャがx86_64になっていることを確認できます。Exec format errorは出ません。
パッケージのインストール時に
signal 11 Segmentfaultエラーが出た場合は、dpkg --configure -aを一度実行すればOKです。
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エラーが出るため、グラフィカル環境のパッケージをインストールできないことがあります。


