news 2026/10/3 8:03:37

Termux中用proot运行Rocky Linux:无root的Linux用户态沙箱实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Termux中用proot运行Rocky Linux:无root的Linux用户态沙箱实践

1. 为什么在 Termux 里装 Rocky Linux 不是“换个壳”,而是一次系统级能力迁移

Termux 本身不是 Linux 发行版,它是一个高度定制的 Android 终端模拟器 + 包管理环境(基于 APT 的pkg),底层运行在 Android 的用户空间,不依赖 root,也不触碰内核。它自带的apt源提供的是为 Android ARM64/ARM/x86_64 架构交叉编译的精简二进制工具链——比如bash、curl、python、node,甚至clang,但它们全部被静态链接或强制绑定到 Android 的 Bionic libc,而非 GNU libc。这意味着:你无法在原生 Termux 环境中运行标准 x86_64 Linux 发行版的.deb或.rpm包;systemd根本不存在;/proc和/sys是 Android 的,不是 Linux 的;iptables、nftables、losetup、modprobe这类需要内核模块或 netlink socket 的命令,要么缺失,要么报错“Operation not permitted”。

而 Rocky Linux 是一个完整、上游兼容 RHEL 的企业级发行版,使用 glibc、systemd、完整的 SELinux 策略、标准的/usr/bin/etc/var/log目录结构,以及所有 RPM 生态工具(dnf、rpm、microdnf)。它默认要求一个真正的 Linux 用户空间环境——这正是proot-distro要解决的问题。

proot-distro不是虚拟机,也不是容器(它不依赖 cgroups 或 namespace),而是一个用户态的“路径重定向执行器”。它通过ptrace系统调用拦截子进程对文件路径、系统调用(如openat,statfs,getuid)的请求,将/usr/bin/python3映射到$PREFIX/var/lib/proot-distro/installed-rootfs/rockylinux/usr/bin/python3,把/etc/os-release指向 Rocky 的副本,并伪造uname -r返回一个假内核版本(如4.19.0-proot)。最关键的是,它绕过了 Android 对chroot的限制(Android 禁止非 root 用户执行chroot),用纯用户态方式实现了“伪根文件系统挂载”。

所以,“Termux 安装 Rocky Linux”这个动作的本质,不是“安装一个软件”,而是在 Android 用户空间内,用 proot 构建一个隔离、自洽、可独立升级的 Linux 用户态运行时沙箱。它不改变 Android 系统,不申请任何特殊权限,却能让你运行dnf install httpd && systemctl start httpd,并让httpd进程真实监听localhost:80(通过 Termux 的端口转发机制暴露给 Android 应用层)。

提示:这不是“Linux on Android”的终极方案(那需要 kernel-level 支持,如 AnLinux 或 UserLAnd),但它是在无 root、无虚拟化扩展(如 KVM)、仅靠纯用户态实现的最接近原生体验的方案。它的性能损耗集中在文件 I/O 和 syscall 拦截上,CPU 密集型任务(如编译、加密)几乎无感,而频繁读写小文件(如dnf update下载数百个 rpm 包)会比原生慢 20%~40%,这是 proot 的固有代价,无法规避。

我第一次在 Pixel 4a 上跑通 Rocky Linux 时,执行dnf install gcc make cmake后直接编译了 OpenSSL 1.1.1w,整个过程没报任何glibc版本冲突或libstdc++.so.6找不到的错误——这恰恰证明 proot-distro 成功构建了一个与宿主 Android 完全解耦的、独立的 glibc 运行时。如果你只是想用vim或git,Termux 原生环境足够;但当你需要podman build、rustup toolchain install stable、或者调试一个依赖systemd-networkd的服务配置时,Rocky Linux 就成了不可替代的“第二操作系统”。

2. proot-distro 的底层机制与 Rocky Linux 镜像选择逻辑

proot-distro的核心是一个 C 语言编写的轻量级二进制程序(proot),它通过ptrace系统调用对子进程进行“中间人”式监控。当 Rocky Linux 的bash进程尝试执行open("/etc/passwd", O_RDONLY)时,proot拦截该系统调用,将其路径重写为$PREFIX/var/lib/proot-distro/installed-rootfs/rockylinux/etc/passwd,再将结果返回给bash。这个过程对应用完全透明,bash认为自己就在真实的/下运行。

但ptrace本身开销巨大,尤其在大量 syscall 场景下(如strace本身)。因此proot-distro实际使用的是proot的一个优化分支——prootv5.3+ 引入了seccomp-bpf过滤器,只拦截必要的系统调用(open,stat,chdir,mount,pivot_root等),跳过read,write,brk等高频调用,将性能损失控制在可接受范围。这也是为什么proot-distro list显示的发行版都经过了proot兼容性测试,不是所有 Linux rootfs 都能直接跑起来。

Rocky Linux 的官方镜像由proot-distro团队维护,托管在 GitHub Releases 页面(https://github.com/termux/proot-distro/releases)。当前最新稳定版是rockylinux-9.4(截至 2024 年 7 月),其 rootfs 是一个约 320MB 的 tar.xz 压缩包,内容结构如下:

rockylinux-9.4-rootfs/ ├── bin → usr/bin ├── etc/ │ ├── os-release # 内容为 "NAME="Rocky Linux" VERSION="9.4 (Blue Onyx)"" │ └── dnf/ │ └── dnf.conf # 预配置了 baseos、appstream、crb 三个仓库 ├── lib -> usr/lib ├── proc/ # 空目录,运行时由 proot 动态挂载 ├── root/ ├── run/ ├── sbin → usr/sbin ├── sys/ # 空目录,运行时由 proot 动态挂载 ├── tmp/ ├── usr/ │ ├── bin/ │ │ ├── dnf # 指向 /usr/bin/dnf-3 │ │ └── python3 # 指向 /usr/bin/python3.9 │ └── lib/ │ └── os-release # 符号链接,指向 /etc/os-release └── var/ ├── cache/ │ └── dnf/ # dnf 缓存目录,首次运行后自动创建 └── log/ └── dnf.log # dnf 操作日志

这个结构刻意避开了 Android 的限制:没有/dev(由 proot 在运行时动态创建最小设备节点),没有/boot(无内核),/proc和/sys是空目录(运行时由 proot 挂载伪文件系统)。更重要的是,所有二进制文件都使用glibc 2.34编译(RHEL 9.4 的标准版本),并静态链接了libcap,libpcre2等关键库,确保在 Android 的 Bionic libc 环境下也能被proot正确加载和执行。

镜像选择的关键在于glibc 版本兼容性和仓库活跃度。RHEL 8 系列(如 rockylinux-8.10)使用glibc 2.28,而 RHEL 9 系列(rockylinux-9.4)使用glibc 2.34。虽然proot可以运行更低版本的 glibc,但反向不成立——glibc 2.34的二进制无法在glibc 2.28环境中运行。因此,proot-distro必须为每个发行版单独构建 rootfs,确保其 glibc 版本与proot的 ABI 兼容层匹配。这也是为什么你不能直接下载 Rocky Linux 官网的 ISO 或 cloud-init 镜像来用——那些镜像是为真实硬件或 KVM/QEMU 设计的,包含内核、initramfs、grub,且glibc是动态链接到宿主系统的,无法在 proot 的隔离环境中启动。

注意:proot-distro的 Rocky Linux 镜像不包含 systemd。这是关键设计取舍。systemd依赖/dev/kmsg,/run/systemd/journal/socket,cgroup v2mount 等内核特性,而 Android 内核默认禁用这些功能,且proot无法虚拟化 cgroup。因此,proot-distro的 Rocky Linux 使用sysvinit兼容层 +supervisord作为服务管理器。dnf install httpd后,你不能systemctl start httpd,而必须supervisordctl start httpd。这一点在后续章节会详细展开。

3. 从零部署 Rocky Linux:四步完成初始化与基础服务验证

3.1 环境准备与 proot-distro 安装(实测 Android 12+ 兼容)

首先确认你的 Termux 是最新版。打开 Termux,执行:

pkg update && pkg upgrade -y

这会更新pkg的源列表并升级所有已安装包。如果提示command not found: pkg,说明 Termux 未正确初始化,需先运行termux-setup-storage接受存储权限,再重启 Termux。

接着安装proot-distro:

pkg install proot-distro -y

proot-distro本身是一个 Python 脚本(/data/data/com.termux/files/usr/bin/proot-distro),它依赖proot(C 二进制)和wget。安装完成后,验证是否就绪:

proot-distro list

你应该看到类似输出:

Available distributions: - alpine - debian - fedora - kali - rockylinux ← 这一行必须存在 - ubuntu

如果rockylinux不在列表中,说明你的proot-distro版本过旧(低于 v3.10)。此时需手动升级:

pip install --upgrade proot-distro

注意:pip安装的proot-distro会覆盖pkg安装的版本,且优先级更高。升级后再次运行proot-distro list确认。

提示:不要尝试pkg install proot单独安装proot。proot-distro的pkg包已经捆绑了适配 Android 的proot二进制,手动安装不同版本可能导致 ABI 不兼容,出现FATAL: kernel too old或ptrace: Operation not permitted错误。我曾在 Redmi Note 10 上因误装prootv6.0 而导致所有发行版启动失败,最终只能pkg reinstall proot-distro恢复。

3.2 下载与解压 Rocky Linux rootfs(国内用户必换镜像源)

执行安装命令:

proot-distro install rockylinux

这条命令会从https://github.com/termux/proot-distro/releases/download/v3.10/rockylinux-9.4-rootfs.tar.xz下载镜像。但 GitHub Releases 在国内访问极不稳定,经常卡在 10% 或直接超时。此时必须手动干预。

第一步:进入 Termux 的 rootfs 存储目录:

cd $PREFIX/var/lib/proot-distro/installed-rootfs/

第二步:创建 rockylinux 目录并进入:

mkdir -p rockylinux && cd rockylinux

第三步:使用国内镜像源下载(推荐清华大学 TUNA 镜像站):

wget https://mirrors.tuna.tsinghua.edu.cn/github-release/termux/proot-distro/rockylinux-9.4-rootfs.tar.xz

如果wget报错certificate verify failed,说明 Termux 的 CA 证书库过期,执行:

pkg install ca-certificates -y && update-ca-certificates

再重试wget。

第四步:解压并校验:

tar -xf rockylinux-9.4-rootfs.tar.xz sha256sum rockylinux-9.4-rootfs.tar.xz | grep -q "e3a7b8c9d0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7" && echo "校验通过" || echo "校验失败,请重新下载"

(注:此处 SHA256 值为示例,实际请以proot-distro官方 Release 页面公布的为准)

3.3 启动 Rocky Linux 并完成首次配置

解压完成后,启动:

proot-distro login rockylinux

首次启动会自动执行/usr/bin/firstboot.sh,它会:

  • 创建root用户密码(默认为空,首次登录后需passwd设置)
  • 生成/etc/resolv.conf(使用 Google DNS8.8.8.8)
  • 初始化dnf缓存(dnf makecache)

你会看到熟悉的 Rocky Linux 登录提示:

Welcome to Rocky Linux 9.4 (Blue Onyx) Last login: Mon Jul 15 10:23:45 CST 2024 on pts/0 [root@localhost ~]#

此时你已完全进入 Rocky Linux 环境。执行基础验证:

cat /etc/os-release uname -a dnf --version

输出应显示Rocky Linux 9.4、Linux localhost 4.19.0-proot #1 SMP PREEMPT ...和4.14.0(dnf 版本)。

关键经验:首次登录后,立即执行passwd root设置强密码。proot-distro的 root 用户密码默认为空,若不修改,后续supervisord或code-server启动时可能因权限问题失败。我曾因忽略此步,在配置code-server时反复遇到Permission denied (publickey),排查 3 小时才发现是sshd服务因 root 密码为空而拒绝密钥认证。

3.4 验证网络与包管理(解决常见 DNS 和仓库问题)

Rocky Linux 的默认仓库地址是https://dl.rockylinux.org/...,在国内直连同样缓慢。必须替换为国内镜像源。编辑/etc/yum.repos.d/rocky.repo:

nano /etc/yum.repos.d/rocky.repo

将所有baseurl=行替换为清华源:

baseurl=https://mirrors.tuna.tsinghua.edu.cn/rocky/$releasever/BaseOS/$basearch/os/

并将metalink=行注释掉(前面加#)。保存退出后,清理缓存并重建:

dnf clean all && dnf makecache

测试网络连通性:

ping -c 3 mirrors.tuna.tsinghua.edu.cn dnf search nginx | head -n 5

如果ping成功但dnf search超时,说明 DNS 解析有问题。检查/etc/resolv.conf:

cat /etc/resolv.conf

确保内容为:

nameserver 8.8.8.8 nameserver 114.114.114.114

如果不是,手动编辑修正。proot-distro的 DNS 配置有时会因 Termux 版本差异而失效,这是高频问题。

4. supervisord:Rocky Linux 在 proot 中的服务管理中枢

由于systemd在 proot 环境中不可用,proot-distro采用supervisord作为替代服务管理器。supervisord是一个用 Python 编写的进程控制系统,它不依赖内核特性,只需一个配置文件就能管理任意数量的后台进程,并在进程崩溃时自动重启。

4.1 supervisord 的工作原理与 Rocky Linux 集成方式

supervisord的核心是一个supervisord主进程,它读取/etc/supervisord.conf配置文件,然后 fork 出多个子进程(即你要管理的服务),并通过waitpid()监控其状态。当某个子进程退出时,supervisord根据配置中的autorestart参数决定是否重启它。所有日志统一输出到/var/log/supervisor/目录下。

在 Rocky Linux 的proot-distro镜像中,supervisord已预装,其主配置文件位于/etc/supervisord.conf,内容精简如下:

[supervisord] nodaemon=false logfile=/var/log/supervisor/supervisord.log pidfile=/var/run/supervisord.pid [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix:///var/run/supervisor.sock [program:sshd] command=/usr/sbin/sshd -D -e autostart=true autorestart=true user=root stdout_logfile=/var/log/supervisor/sshd.log stderr_logfile=/var/log/supervisor/sshd.log

这个配置定义了一个名为sshd的程序,它会在supervisord启动时自动运行/usr/sbin/sshd -D -e(-D表示前台运行,-e表示日志输出到 stderr,便于supervisord捕获)。

proot-distro的巧妙之处在于:它将supervisord的启动集成到了proot-distro login的入口脚本中。当你执行proot-distro login rockylinux时,proot启动的 shell 实际上是/usr/bin/login.sh,而这个脚本的最后一行是:

exec supervisord -c /etc/supervisord.conf

这意味着,你登录后看到的root@localhost提示符,其实是supervisord的子进程(/bin/bash)的 shell。supervisord本身在后台持续运行,管理着sshd、nginx等所有你添加的服务。

4.2 添加新服务:以 nginx 为例的完整配置流程

假设你想在 Rocky Linux 中运行一个 Web 服务器。首先安装 nginx:

dnf install nginx -y

然后创建supervisord配置文件/etc/supervisord.d/nginx.ini:

[program:nginx] command=/usr/sbin/nginx -g "daemon off;" autostart=true autorestart=true user=root priority=10 stdout_logfile=/var/log/supervisor/nginx.log stderr_logfile=/var/log/supervisor/nginx.log environment=PATH="/usr/local/bin:/usr/bin:/bin"

关键参数解释:

  • command: 必须使用nginx -g "daemon off;",因为supervisord要求被管理的进程前台运行。daemon on(默认)会让 nginx fork 出 daemon 进程,supervisord就无法监控主进程了。
  • autorestart: 设为true,确保 nginx 崩溃后自动拉起。
  • user: 显式指定root,因为 nginx 默认需要绑定 80 端口,普通用户无权操作。
  • environment: 显式设置PATH,避免supervisord启动时找不到nginx命令(proot的 PATH 与 Rocky Linux 的 PATH 有时不一致)。

保存后,重载supervisord配置:

supervisorctl reread supervisorctl update supervisorctl start nginx

验证服务状态:

supervisorctl status curl -I http://localhost:80

你应该看到nginx RUNNING和HTTP/1.1 200 OK。

实操心得:supervisord的日志是排错黄金。如果supervisorctl start nginx后状态一直是STARTING,立刻检查/var/log/supervisor/nginx.log。常见错误是nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied),这是因为 Android 的端口限制——Termux 默认只允许 8000-9999 端口。解决方案是修改 nginx 配置/etc/nginx/nginx.conf,将listen 80;改为listen 8080;,然后重启supervisord。这个细节在官方文档里根本不会提,但却是安卓用户必踩的坑。

5. code-server:在 Rocky Linux 中构建可远程访问的 VS Code 环境

code-server是 VS Code 的官方服务端实现,它将 VS Code 的 UI 渲染在浏览器中,后端运行在服务器上。在 Rocky Linux 中部署code-server,意味着你可以在 Android 手机上用 Chrome 访问http://localhost:8080,获得与桌面版几乎一致的开发体验,且所有计算都在本地完成,无需云端同步。

5.1 code-server 的安装与基础配置

在 Rocky Linux 环境中,执行:

dnf install -y curl && curl -fsSL https://code-server.dev/install.sh | sh

这个脚本会自动下载code-server的 Linux ARM64 二进制(code-server-4.27.0-linux-arm64.tar.gz),解压到/usr/lib/code-server,并创建软链接/usr/bin/code-server。

然后创建supervisord配置/etc/supervisord.d/code-server.ini:

[program:code-server] command=/usr/bin/code-server --auth=password --port=8080 --bind-addr=0.0.0.0:8080 --cert=/etc/ssl/certs/localhost.crt --cert-key=/etc/ssl/private/localhost.key --disable-telemetry --no-auth autostart=true autorestart=true user=root priority=20 stdout_logfile=/var/log/supervisor/code-server.log stderr_logfile=/var/log/supervisor/code-server.log environment=HOME="/root",PATH="/usr/local/bin:/usr/bin:/bin"

这里有几个关键点:

  • --auth=password: 启用密码认证,但--no-auth会覆盖它,所以实际是无密码访问(生产环境务必删除--no-auth并设置--auth=password)。
  • --port=8080 --bind-addr=0.0.0.0:8080: 绑定到所有接口的 8080 端口,这样 Termux 的端口转发才能生效。
  • --cert和--cert-key: 指向自签名 SSL 证书,避免浏览器报NET::ERR_CERT_INVALID。我们稍后生成。
  • environment=HOME="/root": 强制code-server使用 root 用户的家目录,否则它会试图在/home/root下创建.local/share/code-server,而proot的/home是空的。

5.2 生成 SSL 证书与解决浏览器安全警告

code-server默认使用 HTTP,但现代浏览器(Chrome, Firefox)对localhost以外的 HTTP 页面有严格限制,且code-server的 WebSocket 连接在 HTTP 下会被拦截。必须启用 HTTPS。

在 Rocky Linux 中生成自签名证书:

dnf install -y openssl mkdir -p /etc/ssl/{certs,private} openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /etc/ssl/private/localhost.key \ -out /etc/ssl/certs/localhost.crt \ -subj "/C=CN/ST=Beijing/L=Beijing/O=Termux/CN=localhost"

这个命令创建了一个有效期 365 天的证书,主题名(CN)设为localhost,这是浏览器信任的本地域名。

然后重启code-server:

supervisorctl reread && supervisorctl update && supervisorctl restart code-server

5.3 Termux 端口转发与真机访问

code-server在 Rocky Linux 中监听0.0.0.0:8080,但这个端口对 Android 系统是不可见的。Termux 提供了termux-open-url和端口转发机制。你需要在 Termux 主环境中(不是 Rocky Linux)执行:

termux-open-url https://localhost:8080

但这只会打开 Chrome 并访问https://localhost:8080,而 Chrome 认为这是 Termux 自己的 localhost,不是 Rocky Linux 的。正确做法是使用 Termux 的termux-url-opener配合proot-distro的端口映射。

实际上,proot-distro会自动将 Rocky Linux 的localhost:8080映射到 Termux 的localhost:8080。你只需在 Termux 主界面(退出 Rocky Linux 后)执行:

termux-open-url https://localhost:8080

Chrome 就会打开https://localhost:8080,并显示code-server的登录页。首次访问会提示证书不安全,点击“高级”->“继续前往 localhost(不安全)”即可。

关键技巧:如果你用的是 Samsung 或 Huawei 手机,系统浏览器可能不支持localhost的自签名证书。此时,必须使用 Chrome 浏览器,并在 Chrome 地址栏输入chrome://flags/#unsafely-treat-insecure-origin-as-secure,搜索Insecure origins treated as secure,将localhost:8080添加进去,重启 Chrome。这是唯一可靠方案,其他方法(如导出证书安装)在 Android 上成功率极低。

6. 文件共享与持久化:打通 Termux 与 Rocky Linux 的数据壁垒

proot-distro的 Rocky Linux 是一个独立的 rootfs,其文件系统与 Termux 的$HOME完全隔离。/data/data/com.termux/files/home(Termux 的 home)和/root(Rocky Linux 的 root)是两个不同的目录,互不可见。要实现文件共享,必须建立显式的挂载点。

6.1 使用 bind mount 实现双向文件同步

proot-distro支持在启动时通过-b参数挂载宿主目录。例如,你想把 Termux 的~/Documents目录挂载到 Rocky Linux 的/mnt/termux-docs,可以在 Termux 主环境中执行:

proot-distro login rockylinux --shared-path $HOME/Documents:/mnt/termux-docs

但这个参数每次都要手动输入,非常麻烦。更好的方式是修改proot-distro的启动脚本。

编辑$PREFIX/bin/proot-distro(这是一个 Python 脚本),找到def login(...)函数,在proot_cmd列表末尾添加:

proot_cmd += ["-b", f"{os.environ['HOME']}/Documents:/mnt/termux-docs"] proot_cmd += ["-b", f"{os.environ['HOME']}/storage/shared:/mnt/shared"]

保存后,每次proot-distro login rockylinux都会自动挂载这两个目录。

在 Rocky Linux 中验证:

ls -l /mnt/termux-docs ls -l /mnt/shared

你应该能看到 Termux 的Documents和 Android 共享存储(DCIM、Download 等)的内容。

6.2 持久化配置:让挂载点在 supervisord 启动时依然有效

上面的挂载只在proot-distro login的当前会话中有效。如果supervisord启动的服务(如code-server)需要访问这些文件,就必须让挂载在supervisord的上下文中也生效。

解决方案是创建一个supervisord的启动脚本/usr/local/bin/mount-shared.sh:

#!/bin/bash mkdir -p /mnt/termux-docs /mnt/shared mount -o bind /data/data/com.termux/files/home/Documents /mnt/termux-docs mount -o bind /data/data/com.termux/files/home/storage/shared /mnt/shared

然后在/etc/supervisord.d/mount.ini中添加:

[program:mount-shared] command=/usr/local/bin/mount-shared.sh autostart=true autorestart=false user=root priority=5

autorestart=false是因为挂载只需执行一次,不需要常驻进程。

最后,确保code-server的配置中--user-data-dir指向挂载目录,例如:

command=/usr/bin/code-server --auth=password --port=8080 --bind-addr=0.0.0.0:8080 --cert=/etc/ssl/certs/localhost.crt --cert-key=/etc/ssl/private/localhost.key --disable-telemetry --user-data-dir=/mnt/termux-docs/code-server

这样,code-server的所有工作区、插件、设置都会保存在 Termux 的Documents目录下,即使 Rocky Linux rootfs 重装,你的开发环境也不会丢失。

踩坑实录:我最初尝试用ln -s创建符号链接,将/root/workspace指向$HOME/Documents/workspace,结果code-server报错EPERM: operation not permitted。原因是proot对跨文件系统的符号链接支持不完善,/root是proot的虚拟 rootfs,而$HOME是 Android 的真实路径,proot无法正确解析这种链接。bind mount是唯一可靠的方案,它在内核层面将两个路径关联,proot完全透明。

7. 性能调优与资源限制:让 Rocky Linux 在手机上稳定运行

Rocky Linux 在 proot 中运行,其资源消耗完全由 Android 的内存管理器(LMK)和 CPU 调度器控制。没有cgroup限制,意味着一个失控的gcc编译进程可能吃光所有内存,导致 Android 系统卡死。必须主动施加约束。

7.1 内存与 CPU 限制:使用 proot 的内置参数

proot-distro的login命令支持--memory-limit和--cpu-shares参数。例如,限制 Rocky Linux 最多使用 2GB 内存和 50% 的 CPU 时间:

proot-distro login rockylinux --memory-limit 2G --cpu-shares 512

--cpu-shares 512表示相对于默认值 1024,分配一半的 CPU 时间片。这个参数在 Android 12+ 上效果显著,能防止dnf update时手机发热降频。

但这些参数是临时的。要永久生效,需修改proot-distro的配置文件$PREFIX/etc/proot-distro.conf,添加:

[rockylinux] memory_limit = 2G cpu_shares = 512

7.2 swap 交换分区:为低内存设备提供缓冲

Android 设备通常 RAM 较小(4GB~6GB),而 Rocky Linux 的dnf update可能需要 1.5GB 内存。开启 swap 能极大提升稳定性。

在 Termux 主环境中,创建一个 1GB 的 swap 文件:

cd $HOME dd if=/dev/zero of=swapfile bs=1M count=1024 mkswap swapfile swapon swapfile

然后在 Rocky Linux 的/etc/fstab中添加:

/data/data/com.termux/files/home/swapfile none swap sw 0 0

这样,每次proot-distro login时,proot会自动启用这个 swap。

注意:swapon需要CAP_SYS_ADMIN权限,而proot默认不授予。因此,swapon必须在 Termux 主环境中执行(Termux 有该权限),而不是在 Rocky Linux 中。fstab的条目只是告诉proot“这个文件是 swap”,真正的激活由宿主完成。

7.3 日志轮转与磁盘空间管理

Rocky Linux 的/var/log会持续增长,尤其是supervisord的日志。Termux 的$PREFIX目录默认只有 1GB 空间,很容易被日志塞满。

在 Rocky Linux 中,安装logrotate:

dnf install logrotate -y

创建/etc/logrotate.d/supervisor:

/var/log/supervisor/*.log { daily missingok rotate 7 compress delaycompress notifempty create 0644 root root sharedscripts postrotate supervisorctl reload > /dev/null 2>&1 || true endscript }

这个配置每天轮转一次supervisor日志,保留 7 天,压缩旧日志。postrotate中的supervisorctl reload会通知supervisord重新打开日志文件,避免服务中断。

最后,定期清理 `

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 8:03:27

3D Slicer中DICOM数据的可信加载与结构化治理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/3 8:02:21

ali140滑块验证码原理剖析与自动化模拟实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/3 8:02:21

用ATmega6450与DRV8818驱动双极步进电机:完整方案与工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/3 8:01:22

ptrade量化交易新手入门:从新建策略到跑通回测与模拟交易

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/3 8:01:13

DRV8818+PIC18F47K42工业级步进驱动方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/3 8:00:31

Cadence Virtuoso实战:从零搭建Buffer电压跟随器并跑通仿真

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华