安卓手机在Termux基于chroot运行Ubuntu的rootfs

安装Ubuntu chroot环境

1 开启Termux,开启后安装tsu和pulseaudio
pkg update
pkg install tsu pulseaudio
2 切换到su,进入Android shell
su
3 选择/data/local/tmp这个目录比较不会有权限问题。首先新增存放档案系统的目录:
mkdir /data/local/tmp/chrootubuntu
cd /data/local/tmp/chrootubuntu
4 下载最新Ubuntu 22.04 base档案系统。您可以到 Ubuntu官网查看每日建置的最新版本。
wget https://cdimage.ubuntu.com/ubuntu-base/releases/22.04/release/ubuntu-base-22.04-base-arm64.tar.gz
5 解压缩,再新增一个当作內部储存空间掛载点的sdcard目录,並新增/dev/shm装置目录。
tar xpvf ubuntu-base-22.04-base-arm64.tar.gz --numeric-owner
mkdir sdcard
mkdir dev/shm
cd ../
6 新增启动chroot的脚本 startubuntu.sh
#!/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

# Electron APPS需要/dev/shm
busybox mount -t tmpfs -o size=256M tmpfs $UBUNTUPATH/dev/shm

# 掛载內部储存空间
busybox mount --bind /sdcard $UBUNTUPATH/sdcard

# chroot至Ubuntu
busybox chroot $UBUNTUPATH /bin/su - root

# 退出shell后取消掛载,因为后面要装图形环境所以这里是註解状態。若没有要装图形环境再將以下指令取消註解。
#busybox umount $UBUNTUPATH/dev/shm
#busybox umount $UBUNTUPATH/dev/pts
#busybox umount $UBUNTUPATH/dev
#busybox umount $UBUNTUPATH/proc
#busybox umount $UBUNTUPATH/sys
#busybox umount $UBUNTUPATH/sdcard

7 赋予j脚本执行权限
chmod +x startubuntu.sh
8 进入chroot,这样就可以开始安装后续服务了。在终端机输入exit之后会自动取消掛载相关目录。如果退出后chroot行程没有中止,那么就强制停止Termux。
sh  startubuntu.sh
9 在下载套件前,先修正DNS和新增本機名稱:
# 使用Google的DNS
echo "nameserver 8.8.8.8" > /etc/resolv.conf
echo "127.0.0.1 localhost" > /etc/hosts
10 然後解決Download is performed unsandboxed as root警告,並讓root能存取Android的网络:
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
11 再來更新APT存储库:
apt update
apt upgrade
12 安裝常用工具:
apt install vim net-tools sudo git

新增一般使用者、中文化、设定输入法

1 设定时区为上海
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
2 修改root密码
passwd root
3 新增一般使用者並设定密码
groupadd storage
groupadd wheel
useradd -m -g users -G wheel,audio,video,storage,aid_inet -s /bin/bash user
passwd user
4 编辑:vim /etc/sudoers,在root ALL=(ALL) ALL的下一行加入以下內容:
user    ALL=(ALL:ALL) ALL
5 切换到一般使用者
su user
6 安装locales套件並產生正体中文:
sudo apt install locales
sudo locale-gen zh_TW.UTF-8
7 安装Fcitx5输入法
sudo apt install fcitx5*
8 用vim编辑/etc/environment,加入以下內容。
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx
SDL_IM_MODULE=fcitx
GLFW_IM_MODULE=ibus
9 Fcitx5输入法可以用fcitx5 &指令启动,或是点选应用程式列表的Fcitx5图示。

安装桌面环境

二择一。XFCE4轻量简朴,KDE重型华丽。

GNOME目前无法启动。

XFCE4

1 安装XFCE4(Xubuntu的配置)。出现keyboard layout的问题的时候输入1,並选取使用lighdm
sudo apt install xubuntu-desktop
2 设定预设终端机模擬器,输入xfce4-terminal的编號
sudo update-alternatives --config x-terminal-emulator

用dbus启动的指令是为startxfce4。下面会谈到。

KDE

1 安装KDE(Kubuntu的配置)
sudo apt install kubuntu-desktop
2 设定预设终端机模擬器,输入konsole的编號
sudo update-alternatives --config x-terminal-emulator

用dbus启动KDE的指令是为startplasma-x11。下面会谈到。

其他调整

设定SSH伺服器

如果您有从远端存取的需求就安装openSSH。
sudo apt install openssh-client openssh-server
手动启动SSH server daemon:
mkdir /run/sshd
/usr/sbin/sshd -D &
手机的IP位址可以用以下指令查看:
ifconfig

停用Snap

现在Ubuntu不论安装Firefox还是Chrmoium都会重新导向用Snap安装,偏偏chroot环境Snap又跑不起来,所以只好將它封锁了。

解除安装Snap:
sudo apt-get autopurge snapd
执行此指令防止以后自动安装Snap,请一次全复製然后执行:
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官方软体库安装:
sudo apt install software-properties-common
sudo add-apt-repository ppa:mozillateam/ppa
sudo apt-get update
sudo apt-get install firefox-esr

设定一键启动脚本

Termux本身有用PulseAudio → OpenGL ES发出音效的功能,接著用Termux X11充当X伺服器,用於显示Ubuntu桌面。

在此我们利用Termux Widget,新增从手机桌面启动chroot Ubuntu的捷径。

退出chroot环境
exit
安装 Termux Widget
开启手机系统设定,授予Termux「显示在其他应用程式上方」的权限。
强制停止Termux。再重新启动Termux。
编辑启动Ubuntu的指令稿
su -c "vi /data/local/tmp/startu.sh"
busybox chroot $UBUNTUPATH /bin/su - root这行改成登入userstartxfce4这个指令会自动启动XFCE4桌面环境
busybox chroot $UBUNTUPATH /bin/su - user -c "export DISPLAY=:0 PULSE_SERVER=tcp:127.0.0.1:4713 && dbus-launch --exit-with-session startxfce4"
新增捷径档案
touch .shortcuts/startchroot_ubuntu.sh
chmod +x .shortcuts/startchroot_ubuntu.sh
vim .shortcuts/startchroot_ubuntu.sh
填入以下內容:
#!/bin/sh

# 中止所有旧行程
killall -9 termux-x11 Xwayland pulseaudio virgl_test_server_android termux-wake-lock

## 启动Termux X11
am start --user 0 -n com.termux.x11/com.termux.x11.MainActivity

sudo busybox mount --bind $PREFIX/tmp /data/local/tmp/chrootubuntu/tmp

XDG_RUNTIME_DIR=${TMPDIR} termux-x11 :0 -ac &

sleep 3

# 启动Termux的Pulse Audio
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

# 启动virgl server
virgl_test_server_android &

# 执行chroot Ubuntu的指令稿
su -c "sh /data/local/tmp/startu.sh"

回到手机桌面,长按新增小工具,选取Termux Widget拖到桌面。刚刚写的指令稿应该就会显示在列表上了,按下Termux就会自动启动,並进入桌面环境。

要中止桌面还的话就是按Exit退出,或者强制停止Termux与Termux X11 APP

如何安全刪除chroot目录的资料

刪除chroot环境的资料要格外小心,首先要退出chroot,確认一切都已经取消掛载(没有resource is busy讯息),否则您可能会把sdcard资料也刪了。

最简单的方式是直接重开机,这样一切都会取消掛载。

然后刪除chroot目录:

su -c "rm -r /data/local/tmp/chrootubuntu"

安装:MySQL 8

linux运行环境搭建完成后即可安装常用的开发软件这里以mysql为例

1.下载mysql安装包解压到/usr/local/mysql 文件夹中

可以在mysql官网下载linux通用包(MySQL :: Download MySQL Community Server (Archived Versions))

cd /usr/local/
wget https://cdn.mysql.com/archives/mysql-8.4/mysql-8.4.0-linux-glibc2.17-aarch64.tar.xz
tar xvJf mysql-8.4.0-linux-glibc2.17-aarch64.tar.xz
mv mysql-8.4.0-linux-glibc2.17-aarch64 mysql

2.创建数据目录

cd /
mkdir -p /data
cd data
mkdir -p mysql

3.生成编辑配置文件

vim /etc/my.cnf

内容

[mysqld]
bind-address=0.0.0.0
port=3306
user=root
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/tmp/mysql.sock
log-error=/data/mysql/mysql.err
pid-file=/data/mysql/mysql.pid
#character config
character_set_server=utf8mb4
symbolic-links=0

4.初始化MYSQL

cd /usr/local/mysql/bin/
./mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql/ --datadir=/data/mysql/ --user=root --initialize

若报错则安装相关依赖(Ubuntu)

apt-cache search libaio
apt-get install libaio1

查看初始密码

cat /data/mysql/mysql.err

这个找到password那里,结尾一串字符就是密码

5.正式启动

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
/etc/init.d/mysql status
service mysql start

停止命令

service mysql stop

若报错有可能是没有安装相关依赖,或者是依赖版本不匹配

1.依赖安装

sudo apt install apt-file
sudo apt-file update
sudo apt-file find libncurses.so.5
sudo apt install libncurses5
sudo apt install libncurses*

2.若没有上述相关依赖,则可以试试创建相关依赖的软连接

# 查找相关依赖
find / -name 'libncurses*'
# 查找出来的相关依赖为libncurses.so.6,基于libncurses.so.6创建为libncurses.so.5的软连接
ln -s /usr/lib/aarch64-linux-gnu/libncurses.so.6 /usr/lib/aarch64-linux-gnu/libncurses.so.5

# 与上述同理
find / -name 'libtinfo.so*'
ln -s /usr/lib/aarch64-linux-gnu/libtinfo.so.6 /usr/lib/aarch64-linux-gnu/libtinfo.so.5

3.启动后的配置

若启动后执行命令报错You must reset your password using ALTER USER statement before executing this statement.

则需要改sql密码 ALTER USER USER() IDENTIFIED BY '123456'; ,这里的123456为密码。

人生不作安期生,醉入东海骑长鲸