termux 是一个非常流行的,在安卓手机上免root加载linux的app,
网上全是它的使用方法,而我又比较好奇其实现原理,故而做个粗浅的分析。
都知道的事:
1). 它用 proot 加载的 linux rootfs ——用户态的 chroot ,基于 linux ptrace 函数。
2). 它的维护团队,编译了一堆(近千个)用于扩展 android console 的命令行工具,
包括 "安卓版的linux桌面环境" —— xfce(这不同于proot出来的linux中运行的xfce)
少有人研究的是:
1). 它自带的 proot ,默认会检查这两个环境变量:
export PROOT_LOADER=$home/proot_loader/loader
export PROOT_LOADER_32=$home/proot_loader/loader32
如果没设置,loader路径就固定为
/data/data/com.termux/files/usr/libexec/proot/loader32
/data/data/com.termux/files/usr/libexec/proot/loader
这个可以通过反编译 proot 或查看 proot 源码确认。
2). 它会生成假的 /proc ,供它加载的 guest linux 访问,不然 guest linux 用不了 ps、top 指令
这个可以通过读 /usr/bin/proot-distro 脚本确认,脚本里面的:setup_fake_proc() 处
3). 它会通过 apt-mark hold gvfs-daemons udisks2 这样的指令不让 apt 更新这两个库
这个可以通过读 /usr/etc/proot-distro/*linux*.sh 脚本确认,不然 guest linux 中装不了x11 server,
包括 xvnc、xfce
换句话说,termux 里面的 proot-distro 自带的 rootfs 中,已经有他们自己编译的 udisks2 了。
也可以说是需要对 rootfs 进行改造——添加特定的 udisks2 才能在proot出来的环境中安装xfce。
如果想自己在 proot 出来的 guest linux 中安装 udisks2 或 gvfs-daemons,会出现如下错误提示:
Setting up udisks2 (2.8.4-1ubuntu2) ... Failed to scan devices: Permission denied dpkg: error processing package udisks2 (--configure):
即装不上,而 x11vnc、xfce 又依赖于这两玩意,不太好玩,只能用他们的rootfs了,
不然就只能装 xfvb+dwm 这种比较简陋的X桌面环境
下面这个链接是目前最新版的 termux 在用的 ubuntu rootfs :
https://github.com/termux/proot-distro/releases/download/v3.0.1/ubuntu-aarch64-pd-v3.0.1.tar.xz
也就是 termux 的github仓库: