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

TermuxでpKVMを使いQEMU仮想マシンを高速化する

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

私はTermuxでQEMUを動かしてLinux仮想マシンをインストールするで、Androidスマホ上でTermuxを使って仮想マシンを動かす問題について書きました。結論は、とにかく遅いです。

KVMがない場合は、すべてソフトウェアエミュレーションに頼ることになります。その結果、20年前のWindows XPシステムくらいしか動かせず、現代的なOSは到底まともに動きません。

Google Tensorプロセッサを搭載したスマホでは、Android 15以降にpKVMが導入されました。これはAVFフレームワークの下層でサポートされている技術です。

現時点では、Android 16の実験的なDebian Linux Terminalを除き、一般のAPPはpKVMへアクセスできません。pKVMを有効化するにはRoot権限が必要です。

1. パッケージをインストールする
#

KVMアクセラレーションがあるなら、同じアーキテクチャの仮想マシンを実行するべきです。Termux開発者によると、このqemu-system-aarch64-headlessパッケージを使うことで、pKVMで高速化された仮想マシンを利用できます。

以下のパッケージをインストールします。ARMアーキテクチャのマシンでは、UEFIを有効にするのがよいです。

pkg install qemu-system-aarch64-headless qemu-utils qemu-common ovmf sudo

グラフィカル環境にはVirt Managerがなく、Libvirtサービスもおそらく動かないので、AVNCを使って仮想マシンの画面へアクセスするしかありません。

2. TermuxでLinux仮想マシンを作成する
#

  1. Ubuntu ARMのISOをダウンロードし、Termuxのホームディレクトリに置きます

  2. KVMが存在することを確認します

sudo ls /dev/kvm
  1. 仮想ディスクを作成します
qemu-img create -f qcow2 ubuntu.qcow2 32G
  1. UEFIを保存するファイルを作成します
truncate -s 64m varstore.img

truncate -s 64m efi.img

dd if=$PREFIX/share/qemu/edk2-aarch64-code.fd of=efi.img conv=notrunc
  1. 起動スクリプトを追加します
touch startubuntu.sh

chmod +x  startubuntu.sh

vim startubuntu.sh
  1. 内容は以下のとおりです
qemu-system-aarch64 -M virt \
-enable-kvm  \
-drive if=pflash,format=raw,file="efi.img",readonly \
-drive if=pflash,format=raw,file="varstore.img" \
-smp cpus=2 \
-m 1024 \
-cpu host \
-nographic \
-netdev user,id=n1,hostfwd=tcp::2222-:22 -device virtio-net,netdev=n1 \
-drive file=ubuntu.qcow2 \
-boot d \
-vnc :0 \
-cdrom ubuntu-24.04.3-live-server-arm64.iso
  1. 実行時にはsudoを付けます。
sudo ./startubuntu.sh

うまくいけば、AVNCでlocalhost:59000を開いて仮想マシンの画面を見られます。

奇妙なことに、KVMを有効にしなければ起動できますが、有効にするとqemu-system-aarch64: Failed to put registers after init: Invalid argumentエラーに遭遇します。

chrootに切り替えて、その中でKVMを動かせば、成功率が上がるかもしれません。

参考資料
#

関連記事


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