文章代号:androidinstallchroot
本教程部分内容来自[Root] 手機Termux建立chroot Ubuntu 22.04環境,免Linux Deploy | Ivon的部落格
前言
相信大家都知道Android是基于Linux内核的,那么可以用来跑Linux环境吗?
答案是可以的,我们所熟悉的Termux
就是利用了这点实现的。
但Termux
提供的类Ubuntu环境是十分残缺的,甚至可以说是残废的,只能运行一些简单的软件,相较于复杂的软件都无法运行,它的软件源也是缺斤少两。
于是,有人在Termux
中使用了软件包proot-distro
来勉强地运行原始Linux发行版,可是这个软件包也并不是原生地让容器中的Linux直接操纵根目录的文件,如/dev
和/proc
,并且它也是寄生于Termux
中,在用户空间内运行,效率就十分的低下,它唯一的好处可能就是可以免Root运行和输入exit
就能一键关闭容器内跑的所有软件了。
那么,有什么东西可以解决proot-distro
的缺点呢,有!就是Chroot
。在Root环境下,我们可以原生地在系统空间内运行Chroot
,而不寄生于Termux
,这就是为什么Chroot
可以提高运行效率,也不会被轻易地杀后台(因为Chroot
容器内运行的的每个软件的进程是分开的,你甚至可以在Scene
的进程管理中直接搜到这个软件,如nginx
、xmrig
)
这个教程我将教大家如何运行。
前提条件
手机需要Root
系统版本大于等于Android6.0
配置不能太烂,否则很容易黑屏死机(我的山寨平板就这样)
Linux内核版本最好大于等于3.x
有一个GitHub账号
有魔法上网能力(可选)
正式部分
安装并配置Termux
下载安装Termux
点击这里进入Termux
的官方开源地址
从Releases
中下载apk包,这里要根据你手机的架构选择apk包,如何你不清楚就下载带有universal
字样的全架构apk包
安装之后,弹窗授权框全允许,你将看到这个界面:
更换软件源
输入并回车:
1 | termux-change-repo |
然后你就会看到一个窗口,因为Termux是终端纯文本输出,所以我可以直接用把窗口放上来:
┌───────────termux-change-repo─────────────┐
│ Which repositories do you want to edit? │
│ Select with space. │
│ ┌──────────────────────────────────────┐ │
│ │ [*] Main repository termux-packages │ │
│ │ │ │
│ │ │ │
│ └──────────────────────────────────────┘ │
├──────────────────────────────────────────┤
│ < OK > <Cancel> │
└──────────────────────────────────────────┘
直接点击回车,然后你会看到下一个窗口:
┌─────────────────termux-change-repo────────────────────┐
│ Which mirror do you want to use? │
│ ┌───────────────────────────────────────────────────┐ │
│ │(*) Default repositories Default host │ │
│ │( ) Default repositories Default host with CloudFla│ │
│ │( ) GH Mirrors by KcubeteHosted on Github Release │ │
│ │( ) Mirrors by A1batross Hosted on termux.mentality│ │
│ │( ) Mirrors by Astra ISP Hosted on termux.astra.in.│ │
│ │( ) Mirrors by Bardia MosHosted on mirror.bardia.te│ │
│ │( ) Mirrors by Grimler Hosted on grimler.se │ │
│ │( ) Mirrors by Librehat Hosted on termux.librehat.│ │
│ │( ) Mirrors by Tsinghua UHosted on mirrors.tuna.tsi│ │
│ │( ) Mirrors by BFSU Hosted on mirrors.bfsu.edu│ │
│ │( ) Mirrors by NJU Hosted on mirror.nju.edu.c│ │
│ │( ) Mirrors by USTC Hosted on mirrors.ustc.edu│ │
│ │ │ │
│ │ │ │
│ │ │ │
│ └───────────────────────────────────────────────────┘ │
├───────────────────────────────────────────────────────┤
│ < OK > <Cancel> │
└───────────────────────────────────────────────────────┘
使用底部小键盘的↑
和↓
按键,将光标移到
│( ) Mirrors by BFSU Hosted on mirrors.bfsu.edu│
这个是北外源,如果你想要用清华源就移到
│( ) Mirrors by Tsinghua UHosted on mirrors.tuna.tsi│
将光标移到你想要的软件源,点击一下空格,*
就会移到你选中的软件源上:
┌─────────────────termux-change-repo────────────────────┐
│ Which mirror do you want to use? │
│ ┌───────────────────────────────────────────────────┐ │
│ │( ) Default repositories Default host │ │
│ │( ) Default repositories Default host with CloudFla│ │
│ │( ) GH Mirrors by KcubeteHosted on Github Release │ │
│ │( ) Mirrors by A1batross Hosted on termux.mentality│ │
│ │( ) Mirrors by Astra ISP Hosted on termux.astra.in.│ │
│ │( ) Mirrors by Bardia MosHosted on mirror.bardia.te│ │
│ │( ) Mirrors by Grimler Hosted on grimler.se │ │
│ │( ) Mirrors by Librehat Hosted on termux.librehat.│ │
│ │( ) Mirrors by Tsinghua UHosted on mirrors.tuna.tsi│ │
│ │(*) Mirrors by BFSU Hosted on mirrors.bfsu.edu│ │
│ │( ) Mirrors by NJU Hosted on mirror.nju.edu.c│ │
│ │( ) Mirrors by USTC Hosted on mirrors.ustc.edu│ │
│ │ │ │
│ │ │ │
│ │ │ │
│ └───────────────────────────────────────────────────┘ │
├───────────────────────────────────────────────────────┤
│ < OK > <Cancel> │
└───────────────────────────────────────────────────────┘
然后点击回车,代其跑完命令就代表成功换源。
更新全部软件包:
1 | pkg upgrade -y |
中间如果有什么要让你选的直接回车不用管
更新完之后要再换一次软件源,输入termux-change-repo
后界面变成这个样子:
┌─────────────────termux-change-repo────────────────────┐
│ Do you want to choose a mirror group or a single │
│ mirror? Select with space. │
│ ┌───────────────────────────────────────────────────┐ │
│ │(*) Mirror group Rotate between several mirrors (re│ │
│ │( ) Single mirrorChoose a single mirror to use │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ └───────────────────────────────────────────────────┘ │
├───────────────────────────────────────────────────────┤
│ < OK > <Cancel> │
└───────────────────────────────────────────────────────┘
选择第二项Single mirror
,还是一样用空格选中,然后回车
┌─────────────────termux-change-repo────────────────────┐
│ Which mirror do you want to use? Select with space. │
│ ┌───────────────────────────────────────────────────┐ │
│ │(*) default Cached (by cloudflare) variant of│ │
│ │( ) packages.termuTermux's origin repo, hosted in F│ │
│ │( ) mirror.bardia.Mirror by Bardia Moshiri, hosted │ │
│ │( ) mirrors.cbrx.iMirror by cyberrex0, hosted in Ja│ │
│ │( ) mirror.textcorMirror by Dev-Nergis, hosted in R│ │
│ │( ) mirror.albony.Mirror by Albonycal, hosted in In│ │
│ │( ) mirror.nevacloMirror by Nevacloud, hosted in In│ │
│ │( ) linux.domainesMirror by DomaiNesia, hosted in I│ │
│ │( ) mirror.sjtu.edMirror by SJTUG, Shanghai Jiao To│ │
│ │( ) mirrors.bfsu.eMirror by Beijing Foreign Studies│ │
│ │( ) mirrors.njupt.Mirror by Nanjing University of P│ │
│ │( ) mirror.nyist.eMirror by Nanyang Institute of Te│ │
│ │( ) mirrors.zju.edMirror by Information Technology │ │
│ │( ) mirrors.nju.edMirror by eScience Center, Nanjin│ │
│ │( ) mirrors.pku.edMirror by Peking University │ │
│ │( ) mirrors.sustecMirror by Southern University of │ │
│ │( ) mirrors.cqupt.Mirror by CQUPT - Chongqing Unive│ │
│ │( ) mirrors.hit.edMirror by Harbin Institute of Tec│ │
│ │( ) mirrors.dgut.eMirror by Dongguan University of │ │
│ │( ) mirror.iscas.aMirror by ISCAS - Institute of So│ │
│ │( ) mirrors.tuna.tMirror by Tsinghua University TUN│ │
│ │( ) mirrors.sdu.edMirror by Shandong University │ │
│ │( ) mirrors.ustc.eMirror by University of Science a│ │
│ │( ) mirrors.aliyunMirror by Alibaba Open Source Mir│ │
│ │( ) mirrors.scau.eMirror by South China Agricultura│ │
│ │( ) ftp.fau.de Mirror by FAU, Hosted in Erlange.│ │
│ └────↓(+)───────────────────────────────────53%─────┘ │
├───────────────────────────────────────────────────────┤
│ < OK > <Cancel> │
└───────────────────────────────────────────────────────┘
找到mirrors.bfsu.edu.cn
(北外源)或mirrors.tuna.tsinghua.edu.cn
(清华源),空格选中,回车
软件源就更新完了
安装必要软件
安装以下软件包,等会会用,执行:
1 | pkg install vim tsu busybox mount-utils -y |
如果你等会要安装桌面环境,还需要安装以下软件包。执行:
1 | pkg install x11-repo -y |
在安装x11-repo
时有可能报错403 Forbidden
,不用管
赋予Termux文件读写权限
1 | termux-setup-storage |
接着会弹出系统的权限授予弹窗,允许即可
开启Termux的唤醒锁
此操作可以防止系统限制后台
打开系统通知栏,找到Termux的通知(MIUI系统要长按一下Termux通知)
点击Acquire wakelock
,会弹出系统的电源设置,以MIUI为例改成无限制即可
至此Termux配置完毕。
安装并配置Termux-x11
如果你不想安装桌面环境可以跳过这步
Termux-x11
是一个跑在手机上的x11
服务器,比起XSDL XServer
它有一个优势就是支持virgl
硬件加速
下载安装Termux-x11
登录你的GitHub账号,点击这里进入Termux-x11
的开源项目,然后找到并点击上方的Actions
点击最新的一次构建并进入
在Artifacts
中下载Termux-x11
apk包,也是根据你的手机架构选择,如果不清楚就下载带有universal
的全架构apk包(如果没有Artifacts
就点击上一次构建,直到进入了有Artifacts
的构建为止)
安装后授予弹出的全部权限,就可以看到这个界面:
配置Termux-x11
点击PREFERENCES
进入设置页面
怎么设置没有特定要求,这里可以参考我的:
(如果你想要原生触控就将Touchscreen input mode
改为Direct touch
)
安装Chroot环境
下载发行版的Rootfs
下面是一些发行版的Rootfs官方下载链接:
Ubuntu:cdimage.ubuntu.com
Debian:cloud.debian.org
注意要下载和你手机架构匹配的以tar.xz
或tar.gz
为后缀的文件,如ubuntu-base-23.04-base-arm64.tar.gz
你也可以直接在Termux中下载Rootfs,如:
1 | curl "https://cdimage.ubuntu.com/ubuntu-base/releases/23.04/release/ubuntu-base-23.04-base-arm64.tar.gz" --output ubuntu.tar.gz |
创建一个文件夹并解压
1 | mkdir ubuntu |
创建启动脚本
使用vim
创建建一个名为ubuntu.sh
的启动脚本
1 | vi ./ubuntu.sh |
填入以下内容:
UBUNTUPATH="./ubuntu"
mount --bind /dev $UBUNTUPATH/dev
mount --bind /sys $UBUNTUPATH/sys
mount --bind /proc $UBUNTUPATH/proc
mount -t devpts devpts $UBUNTUPATH/dev/pts
chroot $UBUNTUPATH /bin/su - root
umount $UBUNTUPATH/dev/pts
umount $UBUNTUPATH/dev
umount $UBUNTUPATH/proc
赋予可执行权限
1 | chmod +x ./ubuntu.sh |
配置Chroot环境
进入Chroot环境
1 | su |
出现root@localhost:~#
就说明已经进入了容器
前期配置
添加8.8.8.8为容器默认DNS:
1 | echo "nameserver 8.8.8.8" > /etc/resolv.conf |
将localhost解析为127.0.0.1:
1 | echo "127.0.0.1 localhost" > /etc/hosts |
然后解決”Download is performed unsandboxed as root”警告,并让root能使用Android的网络:
1 | groupadd -g 3003 aid_inet |
换源和更新软件包
然后在页面中的选项中关闭HTTPS,复制下方内容,然后将其替换进/etc/apt/sources.list
:
1 | echo "# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 |
接着更新APT存储库并安装apt-transport-https
和ca-certificates
1 | apt update |
然后开启页面中的HTTPS并重新替换一次/etc/apt/sources.list
1 | echo "# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 |
更新APT存储库并更新所有软件包
1 | apt update |
安装一些基础软件包
1 | apt install vim aptitude apt-file apt-utils command-not-found git -y |
设置中文和北京时间
先安装locales
和中文语言包
1 | apt install locales language-pack-zh-hans* -y |
设置中文环境
1 | dpkg-reconfigure locales |
接着它会出现一个列表,一路回车直到出现Locales to be generated:
,这个时候输入494
再输入3
,待其运行完毕,然后exit
退出容器再重进即可
接着来设置北京时间,先安装tzdata
1 | apt install tzdata -y |
在弹出的列表中输入Asia
前的序号,然后在下一个列表中输入Shanghai
前的序号
设置完毕后,输入date
来验证更改
2023年 10月 03日 星期二 14:22:19 CST
安装和配置桌面环境
如果你只是想运行服务器软件就不需要安装桌面环境了
安装VirGL
我们使用virglrenderer-android
来针对Android设备进行硬件加速
从左往右划拉一下呼出侧边栏(如果和全面屏手势冲突了就先在左侧先向下滑再向右滑),点击NEW SESSION
打开第二个终端,输入命令安装:
1 | pkg install virglrenderer-android -y |
安装Xfce4
切回Chroot的终端,执行
1 | apt install xfce4 xfce4-goodies gimp dbus-x11 -y |
挂载/tmp
为了让Chroot容器可以连接Termux-x11进程,需要将Termux的tmp目录挂载到容器的/tmp
输入两次exit
退出容器和su终端,然后编辑启动脚本
1 | vi ./ubuntu.sh |
在mount -t devpts devpts $UBUNTUPATH/dev/pts
的下一行插入
1 | mount --bind $UBUNTUPATH/tmp /data/data/com.termux/files/usr/tmp |
保存退出,重新进入容器,然后在~/.bashrc
的最后插入chmod 777 -R /tmp
来解决权限问题:
1 | echo "chmod 777 -R /tmp" >> ~/.bashrc |
执行此命令立即生效:
1 | . ~/.bashrc |
创建桌面环境启动脚本
在/usr/local/bin
中创建Chroot中的桌面环境启动脚本
1 | vi /usr/local/bin/xfce |
填入以下内容:
1 |
|
赋予可执行权限
1 | chmod +x /usr/local/bin/xfce |
然后切换到刚才创建的第二个终端,创建Termux中的桌面环境启动脚本
1 | vi $PREFIX/bin/xfce |
填入以下内容:
1 | virgl_test_server_android & |
赋予可执行权限
1 | chmod +x $PREFIX/bin/xfce |
设置SELinux为宽容模式
由于需要让su
进程访问Termux-x11
进程的网络端口,需要关闭SELinux强制模式
在Termux环境中输入以下命令:
1 | sudo setenforce 0 |
注意关闭了图形界面之后要设回强制模式,否则可能会有安全问题
1 | sudo setenforce 1 |
启动桌面环境
在Termux环境中直接输入xfce
并回车(如果看到有报错并且中间带有miui字样就不用管)
然后切到Chroot环境中也直接输入xfce
并回车,此时进入Termux-x11应用程序就能看到图形界面了!
调整DPI
有没有发现这个桌面环境字太小了,不过没关系,这是可以调的!
首先点一下左上角的Applications
,然后依次点击设置
,外观
,在弹出的窗口中点击Settings
选项卡,把Window Scaling
中的1x改为2x,改完就舒服多啦~