上次说到在Android上使用Termux部署Linux环境, 本来只是轻量使用, 不浪费退休手机的算力, 但是看到很多爱折腾的朋友感兴趣, 索性继续折腾一下
这次对于已经解锁bootloader, 获取了root权限的手机一个更好的选择, 通过chroot部署完整Linux系统
其实也有人提到过, Android手机上还可以刷原生Linux系统, 如果型号支持, 并且驱动良好, 这确实是最能榨干设备性能的方式, 但有很多Android手机并不在原生Linux的支持型号中
对于已经root但不支持刷入原生Linux的Android手机, 榨干最后一滴性能最好的方式就是基于chroot部署Linux环境, 一来作为驱动设备的Android系统可以提供最佳的硬件驱动, 二来通过chroot部署的Linux环境与Android系统共享内核, 资源损耗极低, 并且能提供完整Linux体验, 比Termux更具有可玩性
1. chroot部署Linux的优缺点和要求
1.1 优点
- • 原生级性能: 没有硬件虚拟化, 没有中间层, 能发挥100%的计算能力
- • 极低的资源损耗: Linux与Android共享RAM和存储空间
- • 完整Linux环境: 使用glibc, 支持绝大多数ARM架构的Linux软件
- • 底层硬件访问: 权限足够的情况下, chroot环境可直接访问手机部分底层硬件接口, 比如USB/蓝牙/网络等, 可以有更极客的玩法
1.2 缺点
- • 不支持Docker: 这是Android内核决定的, chroot无法解决
- • 不支持Systemd: 这也是受限于Android内核
1.3 与Termux的区别
有人会问, 反正都不支持Docker, 这和Termux有什么区别, 区别还是有一些的
Termux原生: 环境几乎没有性能损失, 但其Linux环境一方面系统目录结构不同, 一方面使用Android原生的Bionic libc, 在软件兼容上大打折扣, 很多ARM软件无法使用
Termux+Proot: 解决了系统目录结构和软件兼容性问题, 但是有一定性能损失, 在I/O密集型的应用上尤其明显
Chroot: 则相当于结合了两者优点, 保证了软件兼容性的同时, 还几乎没有性能损失
1.4 部署要求
必须有root权限 (一般来说要解锁bootloader之后才能获取)
2. 部署过程
chroot部署我试过多种方案, 但测试下来还是已经停止更新的linux-deploy最稳定
目前比较新的两种方案:
- • chroot-distro: https://github.com/sabamdarif/chroot-distro
- • Auto-Linux: https://github.com/HanSoBored/Auto-Linux
刷入后多多少少有些问题, 系统运行异常, 甚至无法恢复, 只能整机重刷, 来回折腾好几次, 还是LinuxDeploy好使, github地址: https://github.com/meefik/linuxdeploy
2.1 安装LinuxDeploy
打开linuxdeploy的github地址, 下载最新的2.6.0版本apk, 安装后打开, 若可以正常打开软件, 表明有戏, 进行一些前置设置
- • 允许后台运行, 电池电量使用无限制 (非常重要!!! 不设置好可能导致开机自启动和后台运行都出现问题), 不同Android系统入口不同, 但都有类似设置
2.2 LinuxDeploy设置
LinuxDeploy打开后界面如下

点击左上角的设置菜单 -> 设置/Settings, 进行一些LinuxDeploy本身的基础设置
- 1. 勾选: CPU唤醒 (防止息屏之后SSH断开, 后台服务停止)
- 3. 勾选: 开机自启动, 启动延时不要改得太短, 这里我保持默认的30秒
- 4. 勾选: TELNET打开, 仅本地主机关闭, 方便PC端连接操作
2.3 部署配置
点击主界面右下角的配置菜单, 进行部署配置, 这里给出我自己的配置参考
- • 架构: arm64 (依据自己手机CPU架构填写)
- • 源地址: http://ftp.debian.org/debian
这里注意, 仅支持http地址, 不支持https, 最好保持不要动
也可以换成 http://mirrors.aliyun.com/debian 试试
- • 安装类型: 目录 (最稳妥, 没有性能损失的方法)
- • 安装路径:
/data/local/linux (最好不要使用默认的{EXTERNAL_STORAGE}下的路径) - • 挂载: 启用,
/sdcard -> /sdcard
2.4 在线Linux部署
在上述配置确认无误之后, 可以尝试点击右上角操作菜单中的 安装/install, 若网络通畅, 中途没有报错, 那你真是非常幸运, 这么轻松就安装好了, 我在安装时总是有下载错误提示, 如果碰到下载报错, 可以先停止, 再点击右上角 安装/install 尝试重新安装
如果和我一样一直有下载报错, 换源地址也无法解决, 则需要另外的方法
2.5 TELNET连接与离线导入部署
TELNET连接
之前我们打开了TELNET设置, 现在可以通过PC连接, 打开XMobaTerm
新建会话, Telnet, 输入Android的局域网地址, 用户名不用填, 端口5023 接成功如图所示
输入su, 使用root身份, 手机应用界面需要允许root授权, 成功获取root权限之后, 提示符变为#
如果上一步在线部署成功, 则可以跳过剩余部分
下载离线的rootfs包:
https://mirrors.tuna.tsinghua.edu.cn/lxc-images/images/debian/bookworm/arm64/default/
打开上述地址, 下载最新日期目录下的 rootfs.tar.xz, 并拷贝到手机根目录(可以通过USB线)
然后在Telnet终端继续操作
# 先卸载目录linuxdeploy umount# 再导入系统linuxdeploy import <rootfs.tar.xz 路径>z 文件路径>
导入成功后可尝试进入已经部署的系统
# 进入chroot部署的linux系统linuxdeploy shell -u root
成功进入后提示如下

2.6 网络问题
进入系统后发现的第一个问题就是无法联网
# ping不通网络ping www.baidu.com
先添加网络权限
# 1. 创建 Android 特有的网络组(分配对应的底层 GID)groupadd -g 3003 aid_inetgroupadd -g 3004 aid_net_raw# 2. 将 root 用户加入这两个组(如果你是用其他普通用户登录的,把 root 换成你的用户名)usermod -a -G aid_inet,aid_net_raw root# 3. 如果你的系统里没有 usermod 命令,可以直接修改 /etc/group 文件:# echo "aid_inet:x:3003:root" >> /etc/group# echo "aid_net_raw:x:3004:root" >> /etc/group
配置之后发现能ping IP地址, 不能ping域名
# 能通ping 8.8.8.8# 不能通ping www.baidu.com
尝试修改域名解析服务器
echo "nameserver 8.8.8.8" > /etc/resolv.conf
提示文件不存在, 怪了, 看一眼/etc/resolv.conf
ls -alh /etc/resolv.conf
/etc/resolv.conf 默认并不是一个真正的文本文件而是一个软链接, 指向 /run/systemd/resolve/stub-resolv.conf, 但是我们的chroot环境没有运行systemd, 估计指向的文件不存在才报错, 让我们直接删掉这个软连接, 再修改配置
# 删除软连接rm -f /etc/resolv.conf# 设置域名解析服务器echo "nameserver 8.8.8.8" > /etc/resolv.conf# 测试网络ping www.baidu.com
终于通网了, 更新系统, 安装openssh-server
apt updateapt dist-upgradeapt install openssh-server -y
2.7 开机自启动与SSH连接
按照上述配置, 设置好允许后台运行, 电量使用无限制, 设置中打开CPU唤醒锁, 打开开机自启动, 启动延迟设置最好10秒以上, 重新开机之后看看ssh (22端口)能不能重新连接, 若不能连接, 则按照如下步骤操作
- • 点击右下角部署配置, 确保sysv勾选打开, SSH勾选打开
- • 点击左上角操作菜单, 点击配置/Configure, 不要点错了, 点了安装会覆盖之前的内容, 配置完成之后再试一试
也可以telnet连接之后执行以下命令, 与上面的配置操作等价
# 获取root权限su# 仅配置,不重新安装linuxdeploy deploy -c
如果所有操作无误, 重启手机之后应该可以开机自启动, 并且可以直接SSH连接了
3 尽情玩耍
chroot部署的linux使用sysv管理服务, service命令, 而不是systemctl
# 查看开启的服务root@xiaomi10-256:~# service --status-all [ + ] dbus [ ? ] hwclock.sh [ - ] procps [ + ] ssh [ - ] sudo [ - ] udev# 查看某个服务状态root@xiaomi10-256:~# service ssh statussshd is running.
试试安装一个deb软件, apt搜索fastfetch没找到, 就下载了一个arm64的deb包, 安装试一试
root@xiaomi10-256:~# apt install /root/bin/fastfetch-linux-aarch64.debReading package lists... DoneBuilding dependency tree... DoneReading state information... DoneNote, selecting 'fastfetch' instead of '/root/bin/fastfetch-linux-aarch64.deb'The following NEW packages will be installed: fastfetch0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.Need to get 0 B/5,424 kB of archives.After this operation, 15.4 MB of additional disk space will be used.Get:1 /root/bin/fastfetch-linux-aarch64.deb fastfetch arm64 2.61.0 [5,424 kB]debconf: delaying package configuration, since apt-utils is not installedSelecting previously unselected package fastfetch.(Reading database ... 15066 files and directories currently installed.)Preparing to unpack .../fastfetch-linux-aarch64.deb ...Unpacking fastfetch (2.61.0) ...Setting up fastfetch (2.61.0) ...N: Download is performed unsandboxed as root as file '/root/bin/fastfetch-linux-aarch64.deb' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)
安装成功了, 后面的提示无所谓, 不用管, 说我把文件放在root用户的目录下了
跑一个fastfetch, 漂亮, 封面图有了, 忽略我的内存占用, 因为我的Termux还在跑, 里面还有好几个应用跑着
试一试运行ARM64应用, 正好在做游戏, 下载一个Godot引擎试试, 到godot github页面 (https://github.com/godotengine/godot/releases), 下载一个 linux arm64版本, 解压, headless运行, 好家伙, 还真跑起来了, 字体库有点问题, 不影响
可玩性非常高, 今天太晚了, 后面有时间接着玩玩
晚安, 咪西迪西