【Root】Android使用Termux安装Chroot环境跑Linux容器和桌面环境
系统只因酱 Lv114514

文章代号: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的进程管理中直接搜到这个软件,如nginxxmrig

这个教程我将教大家如何运行。

前提条件

  • 手机需要Root

  • 系统版本大于等于Android6.0

  • 配置不能太烂,否则很容易黑屏死机(我的山寨平板就这样)

  • Linux内核版本最好大于等于3.x

  • 有一个GitHub账号

  • 有魔法上网能力(可选)

正式部分

安装并配置Termux

下载安装Termux

点击这里进入Termux的官方开源地址

Releases中下载apk包,这里要根据你手机的架构选择apk包,如何你不清楚就下载带有universal字样的全架构apk包

安装之后,弹窗授权框全允许,你将看到这个界面:

image

更换软件源

输入并回车:

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
2
pkg install x11-repo -y
pkg install termux-x11-nightly pulseaudio -y

在安装x11-repo时有可能报错403 Forbidden,不用管

赋予Termux文件读写权限

1
termux-setup-storage

接着会弹出系统的权限授予弹窗,允许即可

开启Termux的唤醒锁

此操作可以防止系统限制后台

打开系统通知栏,找到Termux的通知(MIUI系统要长按一下Termux通知)

image

点击Acquire wakelock,会弹出系统的电源设置,以MIUI为例改成无限制即可

至此Termux配置完毕。

安装并配置Termux-x11

如果你不想安装桌面环境可以跳过这步

Termux-x11是一个跑在手机上的x11服务器,比起XSDL XServer它有一个优势就是支持virgl硬件加速

下载安装Termux-x11

登录你的GitHub账号,点击这里进入Termux-x11的开源项目,然后找到并点击上方的Actions

点击最新的一次构建并进入

Artifacts中下载Termux-x11apk包,也是根据你的手机架构选择,如果不清楚就下载带有universal的全架构apk包(如果没有Artifacts就点击上一次构建,直到进入了有Artifacts的构建为止)

安装后授予弹出的全部权限,就可以看到这个界面:

image

配置Termux-x11

点击PREFERENCES进入设置页面

怎么设置没有特定要求,这里可以参考我的:

(如果你想要原生触控就将Touchscreen input mode改为Direct touch

image

安装Chroot环境

下载发行版的Rootfs

下面是一些发行版的Rootfs官方下载链接:

Ubuntu:cdimage.ubuntu.com

Debian:cloud.debian.org

注意要下载和你手机架构匹配的以tar.xztar.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
2
3
4
5
6
mkdir ubuntu
cd ubuntu
mv ../ubuntu.tar.gz .
tar xpvf ./ubuntu.tar.gz
rm ubuntu.tar.gz
cd ..

创建启动脚本

使用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
2
su
sh ./ubuntu.sh

出现root@localhost:~#就说明已经进入了容器

前期配置

添加8.8.8.8为容器默认DNS:

1
echo "nameserver 8.8.8.8" > /etc/resolv.conf

将localhost解析为127.0.0.1:

1
2
echo "127.0.0.1 localhost" > /etc/hosts
echo "::1 ip6-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

换源和更新软件包

进入镜像站的Ubuntu Ports页面:北外源 清华源

然后在页面中的选项中关闭HTTPS,复制下方内容,然后将其替换进/etc/apt/sources.list

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
echo "# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb http://mirrors.bfsu.edu.cn/ubuntu-ports/ lunar main restricted universe multiverse
# deb-src http://mirrors.bfsu.edu.cn/ubuntu-ports/ lunar main restricted universe multiverse
deb http://mirrors.bfsu.edu.cn/ubuntu-ports/ lunar-updates main restricted universe multiverse
# deb-src http://mirrors.bfsu.edu.cn/ubuntu-ports/ lunar-updates main restricted universe multiverse
deb http://mirrors.bfsu.edu.cn/ubuntu-ports/ lunar-backports main restricted universe multiverse
# deb-src http://mirrors.bfsu.edu.cn/ubuntu-ports/ lunar-backports main restricted universe multiverse

# deb http://mirrors.bfsu.edu.cn/ubuntu-ports/ lunar-security main restricted universe multiverse
# # deb-src http://mirrors.bfsu.edu.cn/ubuntu-ports/ lunar-security main restricted universe multiverse

deb http://ports.ubuntu.com/ubuntu-ports/ lunar-security main restricted universe multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports/ lunar-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb http://mirrors.bfsu.edu.cn/ubuntu-ports/ lunar-proposed main restricted universe m ultiverse
# deb-src http://mirrors.bfsu.edu.cn/ubuntu-ports/ lunar-proposed main restricted universe multiverse" > /etc/apt/sources.list

接着更新APT存储库并安装apt-transport-httpsca-certificates

1
2
apt update
apt install apt-transport-https ca-certificates -y

然后开启页面中的HTTPS并重新替换一次/etc/apt/sources.list

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
echo "# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.bfsu.edu.cn/ubuntu-ports/ lunar main restricted universe multiverse
deb-src https://mirrors.bfsu.edu.cn/ubuntu-ports/ lunar main restricted universe multiverse
deb https://mirrors.bfsu.edu.cn/ubuntu-ports/ lunar-updates main restricted universe multiverse
deb-src https://mirrors.bfsu.edu.cn/ubuntu-ports/ lunar-updates main restricted universe multiverse
deb https://mirrors.bfsu.edu.cn/ubuntu-ports/ lunar-backports main restricted universe multiverse
deb-src https://mirrors.bfsu.edu.cn/ubuntu-ports/ lunar-backports main restricted universe multiverse

deb https://mirrors.bfsu.edu.cn/ubuntu-ports/ lunar-security main restricted universe multiverse
deb-src https://mirrors.bfsu.edu.cn/ubuntu-ports/ lunar-security main restricted universe multiverse

# deb http://ports.ubuntu.com/ubuntu-ports/ lunar-security main restricted universe multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports/ lunar-security main restricted universe multiverse

# 预发布软件源,不建议启用
deb https://mirrors.bfsu.edu.cn/ubuntu-ports/ lunar-proposed main restricted universe multiverse
deb-src https://mirrors.bfsu.edu.cn/ubuntu-ports/ lunar-proposed main restricted universe multiverse" > /etc/apt/sources.list

更新APT存储库并更新所有软件包

1
2
apt update
apt upgrade -y

安装一些基础软件包

1
2
apt install vim aptitude apt-file apt-utils command-not-found git -y
apt update

设置中文和北京时间

先安装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
2
3
#!/bin/bash
export DISPLAY=:0 PULSE_SERVER=tcp:127.0.0.1:4713
dbus-launch --exit-with-session startxfce4 &

赋予可执行权限

1
chmod +x /usr/local/bin/xfce

然后切换到刚才创建的第二个终端,创建Termux中的桌面环境启动脚本

1
vi $PREFIX/bin/xfce

填入以下内容:

1
2
3
4
virgl_test_server_android &
termux-x11 :0 -ac &
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
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,改完就舒服多啦~

 评论
评论插件加载失败
正在加载评论插件