🇺🇸 English version
緣由:Linux Deploy雖然介面直觀,但已經有點老舊,尤其是下載的發行版rootfs,還有預設下載指令稿寫的不好容易斷線,一些細部設定也不是讓人很滿意。
因此拋棄Linux Deploy,直接使用Termux手動建立chroot環境吧。下面以Ubuntu 22.04為範例,建立一個帶有XFCE桌面環境的chroot,用VNC連線。
手機為Android 12版本的Sony Xperia 5 II。

Busybox仍然是必備工具,因為Termux在切換到su之後就會無法使用自身的套件,得安裝Busybox補齊基本的Linux工具。
鑑於Android 11以後對system分區嚴苛的限制,最好的方法是用Magisk模塊安裝。
安裝這個新版本Magisk模塊管理器:FoxMagisk Module Manager
從裡面搜尋"Magisk Builtin Busybox",安裝Magisk模塊,重開機。
Linux Deploy預設是把檔案系統存放成映像檔掛載,但這裡我們直接把Ubuntu的檔案系統解壓縮到適當的位置。
- 開啟Termux,安裝tsu和pulseaudio:
1
2
| pkg update
pkg install tsu pulseaudio
|
- 切換到su,選擇
/data/local/tmp
這個目錄比較不會有權限問題。首先新增存放檔案系統的目錄:
1
2
3
| su
mkdir /data/local/tmp/chrootubuntu
cd /data/local/tmp/chrootubuntu
|
- 下載最新Ubuntu 22.04 base檔案系統。你可以到Ubuntu官網查看每日建置的最新版本。
1
| wget https://cdimage.ubuntu.com/ubuntu-base/releases/22.04/release/ubuntu-base-22.04-base-arm64.tar.gz
|
- 解壓縮,再新增一個當作內部儲存空間掛載點的sdcard目錄
1
2
3
| tar xpvf ubuntu-base-22.04-base-arm64.tar.gz --numeric-owner
mkdir sdcard
cd ../
|
- 新增啟動chroot的指令稿:
vi startu.sh
,填入以下內容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| #!/bin/sh
# Ubuntu檔案系統所在路徑
UBUNTUPATH="/data/local/tmp/chrootubuntu"
# 解決setuid問題
busybox mount -o remount,dev,suid /data
busybox mount --bind /dev $UBUNTUPATH/dev
busybox mount --bind /sys $UBUNTUPATH/sys
busybox mount --bind /proc $UBUNTUPATH/proc
busybox mount -t devpts devpts $UBUNTUPATH/dev/pts
# 掛載內部儲存空間
busybox mount --bind /sdcard $UBUNTUPATH/sdcard
# chroot至Ubuntu
busybox chroot $UBUNTUPATH /bin/su - root
# 退出後取消掛載
busybox umount $UBUNTUPATH/dev/pts
busybox umount $UBUNTUPATH/dev
busybox umount $UBUNTUPATH/proc
|
- 賦予指令稿執行權限
- 進入chroot,這樣就可以開始安裝VNC server和SSH等服務了。在輸入
exit
之後會自動取消掛載目錄。如果退出後chroot行程沒有中止,那麼就強制停止Termux。
在下載套件前,先修正DNS和新增本機名稱:
1
2
3
| # 使用Google的DNS
echo "nameserver 8.8.8.8" > /etc/resolv.conf
echo "127.0.0.1 localhost" > /etc/hosts
|
然後解決"Download is performed unsandboxed as root"警告,並讓root能存取Android的網路:
1
2
3
4
5
| groupadd -g 3003 aid_inet
groupadd -g 3004 aid_net_raw
groupadd -g 1003 aid_graphics
usermod -g 3003 -G 3003,3004 -a _apt
usermod -G 3003 -a root
|
再來更新APT儲存庫:
1
2
| apt update
apt upgrade
|
安裝常用工具:
1
| apt install vim net-tools sudo git
|
- 安裝openSSH:
1
| sudo apt install openssh-client openssh-server
|
- 修改root密碼
- 啟動SSH server daemon:
1
2
| mkdir /run/sshd
/usr/sbin/sshd -D &
|
- 手機的IP位址可以用以下指令查看:
- 安裝XFCE4:
1
2
3
| apt install xfce4 xfce4-goodies
# 輸入XFCE終端機的號碼設定預設終端機
update-alternatives --config x-terminal-emulator
|
- 安裝VNC server:
1
| apt install tigervnc-standalone-server tigervnc-xorg-extension
|
- 設定6位數字密碼:
- 用vim編輯
~/.vnc/xstartup
,設定VNC啟動腳本:
1
2
3
4
5
6
7
| #!/bin/bash
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADRESS
# 設定PulseAudio音效
export PULSE_SERVER=127.0.0.1 && pulseaudio --start --disable-shm=1 --exit-idle-time=-1
# 執行XFCE4
exec startxfce4
|
- 賦予執行權限
1
| chmod +x ~/.vnc/xstartup
|
- 執行VNC server(注意螢幕上顯示的埠號),再使用AVNC新增
localhost:5901
進行連線。此外也可以用電腦的VNC Viewer進行區域連線。
1
| vncserver -localhost no
|
- 如果終端機開不起來,試著重新掛載pts:
1
| mount -t devpts devpts /dev/pts
|
- VNC server斷線後要記得關閉:
Termux本身有用PulseAudio → OpenGL ES發出音效的功能。
如果啟動VNC server後沒聲音,Termux左邊滑出來,開第二個終端機,在Termux(非chroot)執行以下指令。
1
2
| pulseaudio --start --load="module-native-protocol-tcp auth-ip-acl=127.0.0.1 auth-anonymous=1" --exit-idle-time=-1
pacmd load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1 auth-anonymous=1
|
- 設定時區為台灣台北
1
| ln -sf /usr/share/zoneinfo/Asia/Taipei /etc/localtime
|
- 新增一般使用者並設定密碼
1
2
3
4
| groupadd storage
groupadd wheel
useradd -m -g users -G wheel,audio,video,storage -s /bin/bash user
passwd user
|
- 用vim編輯
/etc/sudoers
,在"root ALL=(ALL) ALL"的下一行加入以下內容:
一般使用者也要新增VNC server的設定檔,請參考上面root的設定方法。
安裝locales套件並產生正體中文:
1
2
| apt install locales
locale-gen zh_TW.UTF-8
|
- 編輯
/etc/environment
,加入以下內容。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| LANG=zh_TW.UTF-8
LC_CTYPE="zh_TW.UTF-8"
LC_NUMERIC="zh_TW.UTF-8"
LC_TIME="zh_TW.UTF-8"
LC_COLLATE="zh_TW.UTF-8"
LC_MONETARY="zh_TW.UTF-8"
LC_MESSAGES="zh_TW.UTF-8"
LC_PAPER="zh_TW.UTF-8"
LC_NAME="zh_TW.UTF-8"
LC_ADDRESS="zh_TW.UTF-8"
LC_TELEPHONE="zh_TW.UTF-8"
LC_MEASUREMENT="zh_TW.UTF-8"
LC_IDENTIFICATION="zh_TW.UTF-8"
LC_ALL=
|
- 之後使用
su user
登入一般使用者。或者修改chroot的啟動指令稿,將chroot . /bin/su - root
改成chroot . /bin/su - user
。
現在Ubuntu不論安裝Firefox還是Chrmoium都會重新導向到用Snap安裝,偏偏chroot環境Snap又跑不起來,所以只好將他封鎖了。
- 解除安裝Snap:
1
| apt-get autopurge snapd
|
- 執行此指令防止以後自動安裝Snap,請一次全複製然後執行:
1
2
3
4
5
6
7
8
| cat <<EOF | sudo tee /etc/apt/preferences.d/nosnap.pref
# To prevent repository packages from triggering the installation of Snap,
# this file forbids snapd from being installed by APT.
# For more information: https://linuxmint-user-guide.readthedocs.io/en/latest/snap.html
Package: snapd
Pin: release a=*
Pin-Priority: -10
EOF
|
- 移除Snap之後會有很多套件無法安裝,於是就只能額外取得deb檔來安裝。以Firefox來說,可以改從Mozilla官方軟體庫安裝:
1
2
3
| sudo add-apt-repository ppa:mozillateam/ppa
sudo apt-get update
sudo apt-get install firefox-esr
|
chroot啟動指令稿參考自mjuned47/Termux-Ubuntu
系統設定部份參考在Android 上创建GNU/Linux 容器- 约伊兹的萌狼乡手札
移除Snap參考How to remove Snap completely without losing Firefox? - AskUbuntu