介紹如何在Android手機/平板安裝完整的Linux系統虛擬機,免root。
Termux可以利用QEMU模擬執行Linux虛擬機,補充 proot-distro環境的不足。
為什麼要用QEMU呢?proot-distro提供的Linux環境類似於chroot,然而還是有一些套件不能跑,例如Podman、Docker、Snap、Flatpak,還有依賴Systemd的程式,所以虛擬機就有其必要。
QEMU能夠讓你模擬x86或者ARM架構的虛擬機,執行完整的Linux桌面系統。下圖為Android手機跑Xubuntu系統的畫面。
這樣幾乎所有軟體都能跑了,圖片為Podman執行結果。
順帶一提,QEMU即 Limbo PC Emulator背後使用的模擬器,在Limbo停止更新之後,你依然可以用Termux的QEMU套件跑虛擬機。
請注意: 大部分Android手機都沒有KVM核心模組(僅Pixel手機Root後可使用pKVM),所以Termux的QEMU無法像電腦Linux一樣使用KVM加速虛擬機執行。沒有KVM的情況下,QEMU虛擬機執行速度非常的慢,虛擬機裡面程式執行速度大約是Termux原生套件的五分之一不到,跑純文字的程式勉強還行,但文書處理體驗不佳,遑論玩遊戲了。
考慮到這種執行速度,你可以不要跑圖形介面,而是直接SSH進去執行程式。
1. 環境#
- 手機:Sony Xperia 5 II
- 系統版本:Android 14
- 處理器:Qualcomm Snapdragon 865
- RAM:8GB
- Linux虛擬機系統:Ubuntu 24.04 x86_64 (Xubuntu)
跑QEMU的手機,得使用旗艦處理器,並且RAM 8GB以上的機型。
Linux發行版使用Ubuntu,但是GNOME有點太重了,這裡選擇輕量的Xubuntu,搭載XFCE桌面。如果不要圖形介面的話,選用Ubuntu Server也是可以的。Ubuntu以外還有更輕量的選擇,那就是針對嵌入式系統設計的Alpine Linux,開機速度更快。(參見: Termux跑headless Alpine Linux QEMU虛擬機)
因為沒有KVM加速,所以模擬x86還是ARM架構的虛擬機都沒有太大差別。
提示:你可以在Linux電腦上跑QEMU(有KVM速度比較快),做個已經安裝系統的qcow2映像檔,再放到手機上開機,節省系統安裝時間。
2. 安裝前置依賴套件#
pkg install wget
wget https://ftp.ubuntu-tw.net/mirror/ubuntu-cdimage/xubuntu/releases/24.04/release/xubuntu-24.04-desktop-amd64.iso
- 然後,安裝QEMU和SSH套件
pkg install qemu-system-x86_64 qemu-utils qemu-common openssh vim
3. 安裝Linux虛擬機#
安裝指令跟 Linux電腦跑QEMU類似,但因為Android沒有KVM所以略做修改。
- 新增32GB的虛擬硬碟
qemu-img create -f qcow2 xubuntu.qcow2 32G
- 新增開機指令稿
vim startubuntu.sh
- 輸入以下內容
qemu-system-x86_64 -machine q35 \
-drive if=pflash,format=raw,read-only,file=$PREFIX/share/qemu/edk2-x86_64-code.fd \
-m 4096 \
-accel tcg,thread=multi \
-smp sockets=1,cores=4,threads=1 \
-cpu qemu64 \
-vga std \
-netdev user,id=n1,hostfwd=tcp::2222-:22 -device virtio-net,netdev=n1 \
-device intel-hda \
-usbdevice tablet \
-boot menu=on -drive file=xubuntu.qcow2 \
-vnc :0 \
-cdrom xubuntu-24.04-desktop-amd64.iso
- 指令解釋:
#執行x86_64的虛擬機
qemu-system-x86_64 -machine q35 \
#啟用UEFI開機
-drive if=pflash,format=raw,read-only,file=$PREFIX/share/qemu/edk2-x86_64-code.fd \
#分配4GB RAM
-m 4096 \
#沒有KVM所以只能用TCG加速
-accel tcg,thread=multi \
#CPU分配1插座4核1執行緒
-smp sockets=1,cores=4,threads=1 \
-cpu qemu64 \
#虛擬顯示卡
-vga std \
#使用virtio網路卡,重新導向虛擬機的SSH通訊埠供外部存取
-netdev user,id=n1,hostfwd=tcp::2222-:22 -device virtio-net,netdev=n1 \
#音效卡
-device intel-hda \
#滑鼠鍵盤
-usbdevice tablet \
# 虛擬硬碟
-boot menu=on -drive file=xubuntu.qcow2 \
#啟動VNC伺服器
-vnc :0 \
# 開機ISO
-cdrom xubuntu-24.04-desktop-amd64.iso
- 開機啟動
chmod +x startubuntu.sh
./startubuntu.sh
開啟AVNC APP,輸入IP:
localhost:5900
,連線到Xubuntu桌面等到進入開機介面,安裝Xubuntu,之後關機。
編輯指令稿
vim startubuntu.sh
- 移除cdrom選項
qemu-system-x86_64 -machine q35 \
-drive if=pflash,format=raw,read-only,file=$PREFIX/share/qemu/edk2-x86_64-code.fd \
-m 4096 \
-accel tcg,thread=multi \
-smp sockets=1,cores=4,threads=1 \
-cpu qemu64 \
-vga std \
-netdev user,id=n1,hostfwd=tcp::2222-:22 -device virtio-net,netdev=n1 \
-device intel-hda \
-usbdevice tablet \
-boot menu=on -drive file=xubuntu.qcow2 \
-vnc :0
- 之後再用該指令稿開機,測試能否進入系統
4. SSH到虛擬機#
- 在Xubuntu開啟終端機,啟用SSH服務
sudo apt install openssh-server
sudo systemctl enable --now ssh
- 於Termux左邊滑出來,開一個新session,嘗試SSH進去。
ssh user@localhost -p 2222
- SSH操作應該會比圖形界面順暢許多,畢竟只有文字。
5. 實際使用體驗#
開機進入Xubuntu桌面至少10分鐘。
Firefox光開啟就花了五分鐘,載入Google首頁再花五分鐘,GPU加速不要妄想了。(備註:不要用Snap安裝,太慢啦)
podman run hello-world
指令的執行時間…大概要30秒。
總結,跑圖形界面不實用,跑純文字程式還是有價值的。