proot 简明教程
proot 简明教程
sqrt2802(sqrt2802.pages.dev), Jul 2025
本教程按 CC BY-NC-ND 4.0 协议开源
一些闲话
这个教程其实从 2023 年就开始在写,但是一直拖到了现在。
现在发出来可能有点晚,毕竟不调设置就能跑 proot 的 Android 11- 已经不多了。但是考虑到写这个教程的目的更多是自检,实际上也大概率 0 人在意,所以都无所谓。
笔者是 2022 年暑假从虚拟机转战 proot 的(所以教程的工具链也都是那个时候的版本),原因是在电脑注册表里装软件会被家里制裁(所以本教程提供了完整的电脑端免安装软件包,如有需求可直接跳转到对应段落)。这一方面的现成资料很少,基本都靠自己踩坑然后去 gh 上搜相关的 issue 解答。笔者大概花了大半个学期断断续续从零架起了一个勉强能用的环境,决定自己总结一遍这个流程,然后就拖了三年(笑)。
写在前面
在手机上写代码以利用电子垃圾一直是赛博拾荒者们的一大梦想。
如果既不想冒险刷机又不想牺牲性能跑虚拟机,那么搜索到的绝大多数教程都会提到 Termux 和 proot。
无刷机原生 proot 教程哪家强?echo None。网上的 proot 相关教程不是第三方脚本 proot-distro 就是各种牛鬼蛇神 apk,这种 apk 下载下来之后一半会输出 proot-distro 命令,另一半会让你复制一条 wget https://github.com/xxx/yyy.sh。
本篇教程将会用以下设备配置一个看上去比较正常的开发环境:
- 一台 Windows 电脑(最好不要过旧/过新)
- 一部 Android 手机(同上,不用刷机)
- 一个速度还行的局域网(WLAN 或手机热点等)
- 一个拥有 Linux 基础知识的脑子
请注意,教程所述方法未经大规模测试,不具有安全性和稳定性保障,请勿用做运行在线服务的生产环境。强烈建议只在个人局域网内使用。
写代码的时候记得及时保存!!!
Termux 入门
使用终端模拟器 Termux 在 Android 系统中调出命令行界面。
配置方法:
- 从官方网站
termux.dev下载 apk 并安装,建议给应用后台运行和访问存储的权限。 - 打开应用,加载完成后从屏幕最左端按住并向右滑动,调出多任务界面(可以多尝试几次),点击右上角的设置按钮,完成基本配置。
- 回到终端界面,输入
termux-change-repo换源并使用pkg upgrade更新软件(如果手机输入法使用不方便,可以外接蓝牙键盘等设备)。更新后,需要再次使用termux-change-repo换源一次。
提示:如果你需要长时间挂机(比如后面提到的 sshd 等),可以长按屏幕选中任意一个字符,在弹出的菜单中点击 "More" 后勾选 "Keep screen on"。
如果你的 Android 版本在 12 及以上,在挂机时可能会出现终端莫名其妙被系统杀死的情况,可阅读官方 GitHub 仓库的 README 中给出的修复教程链接。
需要注意的是,Termux 和标准的 Linux 有一些差异:
- Termux 的根目录不在
/上,可能在一个像/data/data/com.termux/files/这样的路径里。 - Termux 使用了 Android 的 libc 库,所以在其他系统上编译好的程序(比如一些软件官网下载的 arm64 binary)多数无法运行。
- Termux 的默认用户不是
root(因为没有刷机),只能在 Termux 目录里安装软件。 - Termux 的包管理器是
pkg,一个由 apt 改装的程序。pkg upgrade可以省略成pkg upgr或者pkg upg等。
在不安装其他软件的情况下,Termux 是没有图形化界面的。对于大部分人(手机码字的刷机大神除外)来说,这显然无法接受。
给 Termux 安装图形化桌面并通过远程连接操作是一种可行的方案,但其操作过于复杂,而且会占用较多的系统资源。于是,我们退而求其次,想到了用 vscode SSH 扩展连接手机的方法。
proot 基础
proot 是一款不需要 root 权限的简易容器软件。可以通过容器解决 libc 和路径问题并模拟有 root 权限的环境,假装自己在用完整的 Linux,使用 vscode 进行连接。
proot 可以通过在 Termux 内使用 pkg install proot 安装。
proot 没有像 Docker Hub 那样的官方映像仓库,需要自己下载文件系统映像使用。由于未刷机的设备不支持 hard link,我们选用只含有 symlink 的 Alpine Linux 压缩包。
最新版本的压缩包可以在官网 alpinelinux.org/downloads/ 下载(Mini root filesystem -> aarch64 按钮),老版本需要在官网 Releases 页面点击对应 branch 的链接进入 releases/ 目录查找,例如 3.15 的下载地址是 https://dl-cdn.alpinelinux.org/alpine/v3.15/releases/aarch64/alpine-minirootfs-3.15.11-aarch64.tar.gz。
除非特殊说明,教程中使用 v3.15.11 演示。该版本已 EOL,日常使用(特别是需要频繁对外通信的)请谨慎。
下载压缩包后用 tar 解压到某一目录中,即可得到文件系统。在目录外建立一个新的 shell 脚本文件(可以使用 Termux 自带的 nano),输入以下内容:
unset LD_PRELOAD
proot -r path/to/directory -w /root --kill-on-exit -0 -l --sysvipc -L
执行脚本文件,自动进入容器并启动 root 终端。脚本用到的参数均可在 proot --help 中查询,不做重复解释。
进入容器后使用 export,可以看到容器中残留了很多 Termux 环境的环境变量。我们需要编辑 /etc/profile 文件,在容器启动时把它们更改或清除掉。实际的变量列表因人而异,如果你不确定是否应该操作某个变量,可以在搜索引擎中查找其用途后决定。
(Alpine 内置了 Busybox 版 vi 作为文件编辑器,使用方法与 vim 相似,不做重复说明。)
unset TERMUX_APK_RELEASE
unset TERMUX_APP_PID
export HOME=/root
......
同理,groups 命令输出中留有原 Termux 用户的 gid 信息,我们需要在容器中把它们添加回来。在容器终端使用 exit 退出,回到 Termux 环境后用 id 查看用户组名,并在容器内 addgroup 添加。
因为 Alpine 系统默认使用国内无法访问的 1.1.1.1 进行 DNS 解析,容器内是无法使用域名联网的(也就是会出现 ping IP 正常,ping 网址却连不上的情况)。因此,我们要新建一个 /etc/resolv.conf 文件,替换掉默认的 DNS 服务器:
nameserver 8.8.8.8
nameserver 8.8.4.4
(或者使用你想用的其他 DNS 服务器)
退出重进后,就可以正常地 ping 和下载文件了。Alpine 的包管理器是 apk,具体的换源、安装、更新等使用方法可自行搜索,此处不再赘述。
连接 vscode
教程中使用 vscode v1.69.2 演示。该版本已 EOL,日常使用请谨慎。
要想使用 vscode 连接,容器中需要配置运行一个 sshd 服务端。
首先,需要修改启动容器的 shell 脚本,在 proot 命令处添加以下参数将运行 sshd 必需的一些系统目录挂载到容器中:
-b /proc/ -b /sys/ -b /dev/ -b /dev/urandom:/dev/random -b /proc/self/fd/1:/dev/stdout -b /proc/self/fd/2:/dev/stderr -b /proc/self/fd/0:/dev/stdin -b /proc/self/fd:/dev/fd -b (容器文件系统目录)/tmp:/dev/shm
修改后进入容器,执行以下命令,安装 sshd 和 vscode 依赖的软件包:
apk add bash wget grep gcompat libstdc++ openssh-server
安装完毕后,修改 /etc/ssh/sshd_config 配置文件:
- 取消
Port一行的注释(下同),并将其值修改为可用的端口号(如 8022 等)。进行这一步的原因是,未 root 的用户无法使用 sshd 默认的 22 端口。 - 将
PermitRootLogin的值修改为yes,允许 root 登录。 - 将
AllowTcpForwarding的值修改为yes,允许 vscode 在容器内的服务端创建新连接。
配置完成后,使用 ssh-keygen -A 命令生成密钥并 passwd 设置 root 密码,即可开启 sshd 服务。启动 sshd 的命令是 /usr/sbin/sshd,终止的命令是 pkill sshd。
将电脑和手机连入同一局域网,启动容器的 sshd,在安装了 Remote-SSH 扩展的 vscode 中点击窗口左下角的远程连接按钮,选择 Connect to host 并输入 root@(手机在局域网中的 IP 地址):(sshd 端口)(例如 [email protected]:8022),即可连接到容器,像平时使用 vscode 一样进行编码。
如果你觉得直接用密码登录不安全,也可以使用密钥登录,在此不作赘述。
拓展:免安装版 vscode
本段内容仅适用于 windows 系统。
(可能)不为人知的是,vscode 是可以在免安装模式下运行的。你只需要下载 zip 格式的 vscode,然后在 Code.exe 所在目录下新建一个 data 文件夹,再在 data 里新建一个 tmp 文件夹即可。
但是,尽管 vscode 本体不会在系统目录中留下运行痕迹,powershell 终端的命令历史记录还是会存储在电脑里。你可以修改 settings.json 来在每次启动终端时告诉 powershell 不保存本次会话的命令历史:
"terminal.integrated.profiles.windows": {
"pwsh": {
"path": "powershell.exe",
"args": [
"-NoExit",
"-Command",
"Set-PSReadlineOption",
"-HistorySaveStyle",
"SaveNothing"
]
}
},
"terminal.integrated.defaultProfile.windows": "pwsh"
笔者从官方源打包了一个已经调整为完全免安装版的现成 vscode 1.69.2 压缩包(自解压 exe 程序,双击运行即可),可从以下链接下载:
https://sqrt1.lanzoue.com/irfwS31032mh,提取码 00
同理,在进行 ssh 连接时,容器的密钥会被存入电脑的 known_hosts 文件中,留下痕迹。这一问题可通过修改 Remote-SSH 扩展的配置文件来解决:
Host xxx
HostName xxx
User xxx
Port xxx
StrictHostKeyChecking No
UserKnownHostsFile C:\nul
拓展:proot 运行 ubuntu 容器
Alpine 固然好,但我就是想用 glibc,有没有办法?有的兄弟有的。
Ubuntu 的通用文件系统镜像可以在 Ubuntu Base 的发布地址 cdimage.ubuntu.com/ubuntu-base/releases/ 下载。
partner-images.canonical.com/core/中有一些 Ubuntu Core 的系统包,但该地址没有跟进 2024 年之后的新版本,疑似已经弃用。
进入网站后选择需要的系统版本号,并寻找架构代码 arm64 的 tar.gz 压缩包下载,其大小一般为几十 MB。本教程使用 Ubuntu Base 22.04.5 演示,对应的系统包是 https://cdimage.ubuntu.com/ubuntu-base/releases/22.04.5/release/ubuntu-base-22.04.5-base-arm64.tar.gz。
Ubuntu 的系统包含有 hard link,不能直接在 Termux 里解压。我们可以把含有压缩包的目录挂载到 Alpine 容器里解压,容器会自动将 hard link 转换为 symlink,实现模拟的效果。
把下载的压缩包放在目标文件夹中(解压之后就不要移动了),然后打开你的 Alpine 容器启动脚本,在 proot 一行添加挂载参数:
-b (压缩包目录):(容器内挂载目录)
形如 -b ~/fs/:/root/aaa/。“压缩包目录”即为 Termux 中的路径,而“容器内挂载目录”最好选择一个不存在的路径。
进入 Alpine 容器,打开挂载目录(如上文中的 /root/aaa/),解压系统包,按照前文所述方法修改 /etc/profile、resolv.conf 等配置文件,然后退出容器即可。(记得把挂载参数删掉)
启动 Ubuntu 容器的 shell 脚本和 Alpine 大体相同,但 proot 行末尾需要添加 /bin/bash --login。进入容器后如法炮制 groups,即可完成基本配置。以下是一些注意事项:
- 如果你想使用 root 之外的用户,需要将
/etc/profile中的export HOME修改为:
if [ $(/usr/bin/whoami) != "root" ]; then
export HOME="/home/$(/usr/bin/whoami)"
else
export HOME=/root
fi
-
Ubuntu Base 的 hosts 默认是空的,将
/etc/hostname修改为localhost,并在/etc/hosts中添加一行127.0.0.1 localhost即可。 -
apt 用不了 https 是正常现象。修复方法是先
apt install ca-certificates,然后再把sources.list中的网址改成 https。 -
Ubuntu Base 的自带软件包没有 manpages,可以执行一次
unminimize来自动重装完整的包。 -
apt 安装东西的时候可能会报一长串形如 “Falling back to Teletype” 的 warning,这是缺少 perl dialog 导致的,解决方法是
apt install apt-utils libterm-readkey-perl dialog。某些手机可能还会报 “symlink xxx size changed”,这是手机系统的问题,与 proot 无关,不影响正常使用。
拓展:交叉编译 C/C++ 程序
这部分是写给那些无法在电脑上安装编译器的小朋友(例如小时候的笔者)看的。
众所周知,C/C++ 是编译型语言,编译得到的可执行 exe 只能跑在 CPU 架构和操作系统相同的机器上。因此,cpp 源码在你 arm64 Linux 手机上的编译产物复制到 x86_64 Windows 的电脑上,自然无法运行。
“交叉编译”就是解决这一问题的方法,在你的手机上安装一个针对 x86_64 Windows 的交叉编译器,它产出的 exe 复制到电脑上,就可以运行了。(如果提示缺 dll,自行搜索“静态编译”)
安装的方法是,按照前文方法配置 Ubuntu 容器,然后执行 apt install g++-mingw-w64-x86-64-win32。安装完成后,交叉编译器可以通过 x86_64-w64-mingw32-g++-win32 命令启动,把平常编译时命令中的 g++ 替换成这一长串名称即可。
如果你嫌名字太长输入麻烦,可以通过创建别名的方式简化,例如执行 ln -s /usr/bin/x86_64-w64-mingw32-g++-win32 /usr/local/bin/wing++,然后就只需要输入 wing++ 了。
交叉编译不仅限于 Windows,也可以产出针对 x86_64 Linux(例如 NOI Linux 或者评测机)的程序。对应的安装命令是 apt install g++-x86-64-linux-gnu,而编译器的名称则是 x86_64-linux-gnu-g++。
最后提一句,如果你只是因为注册表限制而无法在电脑上安装编译器,可以尝试 w64devkit,完全免安装并且自带 shell 终端,非常好用。唯一需要手动配置的是 profile 中的 export HOME,建议改为 w64devkit 所在目录,否则 C 盘里会留下 .ash_history 文件。