画的博客
页面 首页 主题 在线查询 分类 默认 接口 技术 逆向 后台 登录
发布于2025年08月06日暂无评论

在 Android 使用 Termux 程序使用 proot-distro 命令管理 Linux 发行版安装使用

PRoot Distro

一个基于 [proot] 实用程序的 Bash 脚本包装器,用于轻松管理基于 chroot 的 Linux 发行版安装。它不需要 root 权限或任何特殊的 ROM、内核等。开始使用只需要最新版本的 [Termux] 应用程序。详情请参见 安装 部分。


内置发行版

PRoot Distro 提供了一组常见发行版的最小根文件系统 tar 包。每个发行版都保证至少支持 AArch64 (ARM64) CPU。为了减少维护工作量,我们只打包单一版本的发行版(稳定版、LTS 或滚动发布版),只有少数例外。

发行版PD 别名版本状态
Adelie Linuxadelie1.0-beta6支持
Alpine Linuxalpine3.22.1冻结
Arch Linux (ARM)archlinuxrolling支持
Artix Linuxartixrolling仅 aarch64
Chimera Linuxchimerarolling仅 64 位
Debiandebiantrixie支持
Deepindeepinbeige仅 64 位
Fedorafedora42不稳定
Manjaromanjarorolling仅 aarch64
OpenSUSEopensuserolling支持
Parduspardusyirmiuc无 armv7
Rocky Linuxrockylinux9.5仅 64 位
Ubuntuubuntu24.04 LTS无 i686
Void Linuxvoidrolling支持
GuixN/AN/A不支持
NixOSN/AN/A不支持
其他DIYDIYDIY

关于发行版状态的说明:

  • supported 表示在 aarch64、arm、i686 和 x86_64 设备上预期能正常工作。
  • only 64bit 表示发行版仅适用于 64 位架构:aarch64、x86_64 等。
  • no armv7no ... 表示缺少对特定架构的支持。
  • frozen 表示由于已知问题,发行版可能不会收到版本升级。
  • unstable 表示发行版在与 proot 一起使用时已知有严重问题。

所有内容均按原样提供。根文件系统 tar 包由所选发行版仓库提供的内容生成,我们不进行任何修改。

构建由 GitHub Actions 自动化:

我们不为任何提及的发行版开发软件包,因此关于它们的错误报告将被忽略。尽管在大多数"错误"情况下,你需要责怪 Android OS 或 [proot] 实用程序。

PRoot Distro 只是 [proot] 的一个包装器(启动器)。

如果你需要自定义版本,你需要自己添加。请参见 添加发行版

安全性

用户必须在安装发行版后升级软件包,以确保所有最新的错误修复和安全补丁都已应用。

我们目录中的发行版根文件系统档案按需更新。实际上这意味着新安装的发行版可能已经过时几个月。

请记住,prootproot-distro 的核心)不像 dockerfirejail 和其他知名工具那样提供高级隔离。

安装

使用包管理器:

pkg install proot-distro

使用 git:

pkg install git file proot
git clone https://github.com/termux/proot-distro
cd proot-distro
./install.sh

依赖项:bash、bzip2、coreutils、curl、file、findutils、gawk、gzip、ncurses-utils、proot、sed、tar、util-linux、xz-utils

如果你想要命令行自动补全,请安装 bash-completion 包。

功能概述

PRoot Distro 旨在提供管理已安装发行版的一体化功能:安装、卸载、备份、恢复、登录。每个操作都通过命令定义。每个命令接受其独特的选项集,特定于它执行的任务。

使用基础:

proot-distro <command> <arguments>

替代变体 (v4.0.0+):

pd <command> <arguments>

其中 <command> 是 proot-distro 操作命令(见下文了解可用内容),<arguments> 是特定于给定命令的选项列表。

安装发行版的示例:

proot-distro install debian

一些命令支持别名。例如,替代

proot-distro list
proot-distro install debian
proot-distro login debian
proot-distro remove debian

你可以输入这个:

proot-distro ls
proot-distro i debian
proot-distro sh debian
proot-distro rm debian

支持的别名信息可以在每个命令的帮助中查看。

已知发行版通过插件脚本定义,这些脚本定义了从哪里下载根文件系统档案的 URL 和完整性检查的校验和集。插件还可以定义在发行版安装期间执行的命令集。

请参见 添加发行版 了解如何向 PRoot Distro 添加自己的发行版。

访问内置帮助

命令:help

此命令将显示关于 proot-distro 使用的帮助信息。

  • proot-distro help - 主页。
  • proot-distro <command> --help - 查看特定命令的帮助。

备份发行版

命令:backup

别名:bakbkp

备份指定的发行版及其插件到 tar 档案。备份的内容可以打印到标准输出以供进一步处理,或写入文件。

压缩根据文件扩展名确定,例如 .tar.gz 将导致 GZip 压缩,.tar.xz 将导致 XZ 压缩。管道备份数据始终不压缩,给用户进一步处理的自由。

使用示例:

proot-distro backup debian | xz | ssh example.com 'cat > /backups/pd-debian-backup.tar.xz'
proot-distro backup --output backup.tar.gz debian

此命令是通用的。所有附加处理如加密应由用户通过外部命令完成。

安装发行版

命令:install

别名:addiinins

安装由别名指定的发行版 - 一个引用所选发行版插件的短名称。

使用示例:

proot-distro install alpine

默认情况下,安装的发行版将具有与命令行上指定的相同别名。这意味着你将无法同时安装多个副本。你可以使用选项 --override-alias 在安装时重命名发行版,这将创建一个发行版插件的副本。

使用示例:

proot-distro install --override-alias alpine-test alpine
proot-distro login alpine-test

复制的插件具有以下名称格式 <name>.override.sh,并存储在其他插件所在的目录中 ($PREFIX/etc/proot-distro)。

你可以使用环境变量 PD_OVERRIDE_TARBALL_URL 指定自定义 URL 来下载根文件系统档案,例如:

export PD_OVERRIDE_TARBALL_URL="http://localhost:8080/debian.tar.gz"
proot-distro install debian

可选地指定 PD_OVERRIDE_TARBALL_STRIP_OPT 来定义提取 tar 包时应剥离多少路径组件。如果未在发行版的插件脚本中另行定义,默认值为 1。如果根文件系统未存储在子目录中,请指定为 0。

请注意,自定义下载的根文件系统的完整性不会被检查。

可以强制指定要安装的发行版的自定义 CPU 架构。为此,你需要将 DISTRO_ARCH 环境变量设置为以下值之一:aarch64armi686riscv64x86_64。例如:

DISTRO_ARCH=arm proot-distro install alpine

通常如果你的主机是 64 位的,相同架构的 32 位发行版应该可以无缝工作,但这不保证。因此,如果你在 AArch64 主机上使用 ARM 版本的系统时遇到问题,这将是 proot 实用程序的错误或与主机支持的 CPU 指令不兼容。

使用外来架构,例如在 AArch64 主机上使用 x86_64 目标,总是需要 QEMU 用户模式包。

使用一个命令安装所有支持的 QEMU 用户模式包:

pkg install qemu-user-aarch64 qemu-user-arm qemu-user-i386 qemu-user-x86-64

x86_64 目标还支持 Blink 用户模式 CPU 模拟器(实验性)。请参见 下方 了解使用详情。

列出发行版

命令:list

别名:lils

显示可用发行版列表、它们的别名、安装状态和注释。

启动 shell 会话

命令:login

别名:sh

在给定发行版中执行 shell。例如:

proot-distro login debian

在给定发行版中以指定用户身份执行 shell:

proot-distro login --user admin debian

你也可以运行自定义命令:

proot-distro login debian -- /usr/local/bin/mycommand --sample-option1

参数 -- 作为 proot-distro login 选项处理的终止符。其后的所有参数都不会被视为 PRoot Distro 的选项。

登录命令支持这些行为修改选项:

  • --user <username>

    使用自定义登录用户而不是默认的 root。你需要通过 useradd -U -m username 创建用户后才能使用此选项。

  • --fix-low-ports

    强制将低网络端口重定向到高号码(2000 + 端口)。将此与需要低端口的软件一起使用,而没有真正的 root 权限无法实现。

    例如,此选项将端口 80 重定向到类似 2080 的端口。

  • --isolated

    不在 proot 环境内挂载主机卷。如果给出此选项,以下挂载点将无法访问:

    • /apex(仅 Android 10+)
    • /data/dalvik-cache
    • /data/data/com.termux
    • /sdcard
    • /storage
    • /system
    • /vendor

    你将无法在 proot 环境内使用 Termux 实用程序。

  • --termux-home

    在 proot 环境内将 Termux 主目录挂载为用户主目录。

    此选项优先于选项 --isolated

  • --shared-tmp

    与 proot 环境共享 Termux 临时目录。优先于选项 --isolated

  • --bind path:path

    创建自定义文件系统路径绑定。选项期望以以下格式的参数:

    <host path>:<proot path>

    优先于选项 --isolated

  • --no-link2symlink

    禁用 PRoot link2symlink 扩展。这将禁用硬链接模拟。只有在 SELinux 被禁用或处于宽容模式时才能使用此选项。

  • --no-sysvipc

    禁用 PRoot System V IPC 模拟。如果你遇到崩溃,请尝试此选项。

  • --no-kill-on-exit

    shell 会话终止时不杀死进程。通常如果运行任何后台进程会导致会话挂起。

  • --kernel

    将内核版本和兼容性级别设置为给定值。

  • --work-dir

    将工作目录设置为给定值。默认情况下,工作目录与用户主目录相同。

卸载发行版

命令:remove

别名:rm

此命令完全删除给定系统的安装。小心使用,因为它不会要求确认。删除的数据无法恢复。

使用示例:

proot-distro remove debian

重命名发行版

命令:rename

别名:mv

通过更改别名、重命名其插件和根文件系统目录来重命名发行版。如果是重命名默认发行版,将创建插件的副本。

使用示例:

proot-distro rename ubuntu ubuntu-test01

只有已安装的发行版才能重命名。

重新安装发行版

命令:reset

别名:-

删除指定的发行版并重新安装。这是以下操作的快捷方式:

proot-distro remove <dist> && proot-distro install <dist>

使用示例:

proot-distro reset debian

与命令 remove 一样,删除的数据无法恢复。小心使用。

从备份恢复

命令:restore

别名:-

从给定的 proot-distro 备份(tar 档案)恢复发行版。

恢复操作执行完全回滚到档案中的备份状态。小心使用,因为此命令会不可恢复地删除以前的数据。

压缩根据文件扩展名自动确定。管道数据必须始终在提供给 proot-distro 之前解压缩。

使用示例:

ssh example.com 'cat /backups/pd-debian-backup.tar.xz' | xz -d | proot-distro restore
proot-distro restore ./pd-debian-backup.tar.xz

复制文件到发行版或反之

命令:copy

别名:cp

复制给定的文件或目录到/从发行版。

使用示例:

proot-distro copy ./localfile.txt ubuntu:/home/user/targetfile.txt

如果传递了选项 --move,则可以移动文件而不是复制。

不支持通配符。源路径和目标路径只能指定一次。

清除下载缓存

命令:clear-cache

别名:clearcl

这将删除所有缓存的根文件系统档案。

添加发行版

发行版通过包含元数据变量的插件脚本定义。一个最小的脚本如下所示:

DISTRO_NAME="Debian"
TARBALL_URL['aarch64']="https://github.com/termux/proot-distro/releases/download/v1.10.1/debian-aarch64-pd-v1.10.1.tar.xz"
TARBALL_SHA256['aarch64']="f34802fbb300b4d088a638c638683fd2bfc1c03f4b40fa4cb7d2113231401a21"

脚本存储在目录 $PREFIX/etc/proot-distro 中,应命名为 <alias>.sh,其中 <alias> 是引用发行版的期望名称。例如,Debian 插件通常命名为 debian.sh

插件变量参考

DISTRO_ARCH:指定要安装的发行版的 CPU 架构变体。

通常此变量是自动确定的,你不应设置它。典型用例是设置自定义架构以在 QEMU 模拟器(用户模式)下运行发行版。

支持的架构是:aarch64armi686riscv64x86_64

DISTRO_NAME:发行版的名称,例如"Alpine Linux (3.14.1)"。

DISTRO_COMMENT:对当前发行版的注释。

通常不需要此变量。使用它来通知用户某些内容不工作或需要额外步骤才能开始使用此发行版。

TARBALL_STRIP_OPT:提取根文件系统档案时应剥离的前导路径组件数。默认值为 1,因为所有默认根文件系统 tar 包都将内容存储在子目录中。

TARBALL_URL:根文件系统 tar 包 URL 的 Bash 关联数组。

应至少为你的 CPU 架构定义。有效的架构名称与 DISTRO_ARCH 相同。应以适当的协议方案开头。例如,https://file://ftp:// 等以访问本地或远程文件。

TARBALL_SHA256:每个根文件系统变体的 SHA-256 校验和的 Bash 关联数组。

必须为 TARBALL_URL 中设置的每个 tar 包定义。

运行额外的安装步骤

可以通过函数 distro_setup 配置插件以在安装发行版后执行指定命令。

示例:

distro_setup() {
    run_proot_cmd apt update
    run_proot_cmd apt upgrade -yq
}

当命令应在根文件系统内执行时使用 run_proot_cmd

实验性 Blink 模拟器支持

如果用户指定的 DISTRO_ARCH 与当前设备架构不同,将使用 CPU 模拟模式。

默认的 CPU 模拟后端是 QEMU 用户模式。然而对于 x86_64 目标架构,用户可以启用 Blink 模拟器的使用。要使用 Blink 作为模拟后端,用户需要设置环境变量:

export PROOT_DISTRO_X64_EMULATOR=BLINK

PROOT_DISTRO_X64_EMULATOR 仅接受 QEMUBLINK 值。

使用此命令安装 Blink 模拟器包:

pkg install blink

模拟模式不保证稳定性。用户可能观察到程序的奇怪行为和崩溃。某些发行版可能工作而其他可能不工作。由于模拟器开销,性能也会降低。

PRoot 问题和与 Chroot 的区别

虽然 PRoot 经常被称为用户空间 chroot 实现,但它在实现和工作特性方面与 chroot 大不相同。以下是你应该了解的最重要区别列表。

  1. PRoot 由于非本地执行而缓慢且潜在不稳定

    每个进程都通过 ptrace() 钩住。这是为了能够转换文件路径(模拟 chroot)、伪造 root 用户身份和解决不支持的系统调用。

    这种对执行流的侵入通常能正常工作。然而在某些情况下,用户可能观察到"不可能"的错误,如崩溃或奇怪的程序行为,这些在本地 Linux 发行版设置(PC、树莓派)上无法重现。

    使用调试工具如 gdb 或 strace 可能有问题。

    重要proot-distro 可能比其他 proot 环境设置脚本表现出更高的性能下降。这背后的原因是更广泛地使用目录和文件绑定。这不是错误,也不计划"修复"。

  2. PRoot 无法从运行的进程中分离。

    由于 PRoot 通过 ptrace() 控制运行的进程,它无法从中分离。这意味着你无法启动守护进程(例如 sshd)并关闭 PRoot 会话。你将不得不杀死进程、等待其完成或让 proot 在会话关闭时立即杀死它。

  3. PRoot 不提升权限。

    Chroot 本身也不提升权限。只是 PRoot 被配置为劫持用户 ID,即使其显示为 root。所以在现实中你的用户名、ID 和权限与没有 PRoot 时相同,但对当前用户进行健全性检查的程序会假设你以 root 用户身份运行。

    特别是,假 root 用户使得在 proot 环境中使用包管理器成为可能。

  4. PRoot 不模拟权限分离。

    你的 root 和非 root 用户实际上是相同的。文件将显示为由你的当前用户拥有,这意味着 root 和非 root 用户都能编辑你的 proot 发行版设置的文件。

    根据你的 PRoot Distro 使用案例,这可能是一个安全问题。

  5. PRoot 不启用对硬件和文件系统挂载的访问。

    你将无法读取/写入内部和外部驱动器分区、USB 设备、Wi-Fi 和蓝牙适配器等设备。

    使用 FUSE 挂载文件系统也不可能:Android OS 不像标准 Linux 发行版那样在 /dev/fuse 上设置世界可写权限。

  6. Appimage、Flatpak 和 Snap 在 PRoot 下不工作。

    自给自足的应用程序容器如 Appimage、Flatpak 或 Snap 依赖于文件系统挂载功能、FUSE 和其他没有真正 root 权限无法获得的功能。

镜像

我不提供自己的根文件系统档案托管服务器。除非你愿意承担托管费用,否则请不要要求提供它们。

所有文件都作为 GitHub 发布版本发布。后者意味着没有有效的方法来镜像所有可用的根文件系统 tar 包,因此不存在镜像,proot-distro 也没有内置的镜像切换方法。

如果你无法从 GitHub 下载根文件系统档案,你有这些选择:

  1. 尝试使用 GitHub 代理,例如 https://gh-proxy.ygxz.in/
  2. 构建自己的根文件系统 tar 包并使用自己的服务器进行托管。对于本地文件,你可以尝试指定格式为 file:///path/to/file.tar.gz 的 URL。

任何选择都需要更新存储在 $PREFIX/etc/proot-distro 下的文件中的链接和 sha-256 校验和。

分支

如果你想使用 PRoot Distro 或其部分作为自己项目的基础,请确保你遵守 GNU GPL v3.0 许可证。

分支必须以不同名称分发。

标签: Android, Termux

添加新评论

提交评论