メインコンテンツへスキップ

Termux qemu-userでARM64 Android上にx86_64 Ubuntuをエミュレート実行する

·
カテゴリー スマートフォン Termuxチュートリアル
タグ Proot-Distro QEMU User Mode
目次

ARM64(Aarch64)のAndroidスマホで、Termux proot-distroを通してx86_64アーキテクチャのUbuntuシステムをエミュレート実行する方法を解説します。

1. 説明
#

「Androidデバイスの大半はARM64アーキテクチャなのだから、ARM版Ubuntuを入れればいいのでは?」と思うかもしれません。しかし、世の中には厄介なプログラムもあり、ARM向けにコンパイルされていないものがあります。

そこでx86アーキテクチャのプログラムを無理やり動かす道として、選択肢は3つあります。

  1. ARM64のシステムを動かし、Box64トランスレーターをインストールする
  2. qemu-systemで完全なx86_64エミュレーターを起動する。例:Ubuntu x86_64 + QEMU仮想マシン
  3. 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を作成する
#

  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を一度実行すればOKです。

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. 参考資料
#

関連記事


最後までお読みいただきありがとうございます。本サイトでは公開コメント欄を設けていません。私はソーシャルな反応やアクセス数を追い求めるためではなく、自分の考えを誠実に探求するために文章を書いています。記事を丁寧にお読みいただいたうえで、ご感想やご意見をお寄せいただければ幸いです。誤字・誤り・技術的な問題などを見つけた場合、またはフィードバックを共有したい場合は、Aboutページに記載しているメールアドレスまでお気軽にご連絡ください。