[Linux/Ollama] Termux : 一款运行在 Android 平台上的开源终端模拟器与 Linux 环境应用、支持在手机上基于Ollama部署LLM
0 序
- 由于电脑上开的程序较多,资源吃紧,灵光一现——用闲置的Android手机模拟Linux,把 Ollama 跑在 手机端上。
- 稍微一调研,除了Root Android手机之外,还真有手机模拟Linux的开源项目——Termux(安卓上的 Linux 终端模拟器)。
另外,Ollama 官方主力支持的是 Windows / macOS / Linux ,并没有推出安卓原生 APK;不过社区方案已经比较成熟,小米等主流骁龙/天玑 ARM64 机型实测可用 。
- 核心结论
技术可行:Termux 官方软件源里就有 ollama 包,一条命令就能装
性能有限:手机基本是 CPU 推理(除非厂商开放 NPU/GPU 调度),流畅跑 1.5B~3B 量化模型没问题,7B 能用但明显慢,更大模型不现实
最低门槛:ARM64 处理器、6GB 以上内存、至少 4~12GB 空闲存储
小米实测:有小米 14 Pro 用户通过 Termux + proot-distro 装 Debian 再装 Ollama 跑通 phi3、qwen、llama3
1 概述
产品介绍
- 产品定位:Termux 是一款运行在 Android 平台上的【开源】终端模拟器与 Linux 环境应用。
它无需对设备进行 Root 破解,即可在 Android 操作系统内部提供一个轻量级、独立的 Linux 用户空间(Userland)。
-
诞生背景与原因:传统的 Android 终端应用大多仅提供极简的 Shell 命令接口,缺乏完整的 GNU/Linux 软件生态和包管理机制。开发者在移动设备上进行轻量级编程、系统运维和自动化脚本编写时面临严重限制。Termux 的创立旨在打破移动操作系统与传统 Linux 桌面/服务器环境之间的壁垒,将强大的终端能力与 apt 包管理生态直接引入 Android。
-
解决的核心问题:
- 【免Root】的完整 Linux 环境:提供基于 Linux 命令行(CLI)的标准计算环境,避开了传统方式下必须 Root 设备的安保屏障。
- 【软件生态缺失问题】:引入
apt与pkg包管理器,交叉编译并维护了庞大的 Linux 软件包仓库(包含 Python、Node.js、Git、OpenSSH 等)。- 【移动端开发与运维限制】:允许工程师在手机/平板上直接运行服务器、搭建开发测试环境、执行自动化脚本以及进行网络诊断。
- Termux URL:
Github Releases
58.7k star / 7.2k fork (2026.8.6)
发展历程
-
早期起步(2015年 - 2018年):由 Fredrik Fornwall 创建并主导开发。项目发布于
Google Play商店,因其出色的免 Root 体验与完善的软件包管理快速积累了大量开发者与 Linux 爱好者用户。 -
Google Play 策略转折(2019年 - 2020年):Google Play 提高了 API Level 29(Android 10)的Target SDK要求,其中执行 W^X(Write XOR Execute)安全策略限制了应用在其【私有数据目录】之外动态生成和执行 ELF 二进制文件。这一限制导致 【Termux】 无法继续在更新了 【Target SDK】 的 【Google Play】 商店版本中正常升级和运行动态编译的包。
-
社区化与迁移 F-Droid(2020年至今):Termux 官方正式宣布停止在 Google Play 上的版本更新,将【主发布渠道】全面迁移至 F-Droid 及 GitHub Releases。随后项目转向完全由【开源社区驱动】发展,拓展了包括 Termux:API、Termux:GUI、Termux:X11 等扩展插件体系。
核心功能
-
终端模拟:基于 TerminalView 库,支持完整的 VT100/ANSI 终端控制序列、色彩显示、自定义快捷键键板以及外接键盘映射。
-
软件包管理:内置基于 Debian
apt架构的包管理系统(封装命令为pkg),支持在线安装、升级、卸载上千种编译好的 Linux 工具包。 -
开发环境构建:支持在 Android 端直接搭建 C/C++(GCC/Clang)、Python、Node.js、Rust、Go、Java、PHP 等主流编程语言的运行环境与编译器。
-
远程连接与服务:内置 OpenSSH 客户端与服务端,既可通过 SSH 远程连接服务器,也可将 Android 设备作为 SSH 服务端供外部访问。
-
系统交互扩展(Termux:API):通过配套插件,允许 Linux 命令行脚本调用 Android 底层硬件与系统接口,如读取传感器、发短信、拨打电话、获取 GPS 定位、控制闪光灯等。
-
图形界面支持(X11/PRoot):结合 Termux:X11 或 VNC 客户端,以及 PRoot 容器技术,可运行带 GUI 的 Linux 桌面环境(如 XFCE4、LXDE)以及桌面级应用程序。
主要特点 *
- 开箱即用,无需 Root:利用 Android 应用自身的沙盒机制机制(Linux UID 隔离),将整个 POSIX 环境构建在应用私有数据目录下,免去了设备 Root 带来的安全风险和保修失效问题。
- 强大的移植生态:官方维护了专为 Android NDK 交叉编译的软件包仓库(
termux-packages),大部分 GNU/Linux 命令行工具均经过专门适配。 - 高度可扩展:支持安装多重 Linux 发行版(通过 PRoot 安装 Ubuntu、Debian、Arch Linux、Alpine 等),突破底层 Android 系统 API 差异的限制。
- 极低的硬件开销:由于与宿主 Android 共享同一个 Linux 内核,其运行损耗远低于全虚拟机(如 QEMU/UTM)架构,资源占用极小、响应迅速。
局限性 *
-
Android 机制限制(Android 10+ 引擎杀手):Android 系统的 Phantom Process Killer(幽灵进程杀手)及后台进程限制策略,可能导致后台运行的资源密集型程序或长时间运行的服务被系统强制杀死。
-
非标准 Linux 目录架构:
-
Termux 未严格遵循 FHS(Filesystem Hierarchy Standard)。
-
根目录并不是
/,而是/data/data/com.termux/files/usr;用户主目录为/data/data/com.termux/files/home。 -
传统二进制文件硬编码的
/bin/sh或/usr/bin/env路径在 Termux 中会导致No such file or directory错误(需要使用termux-fix-shebang工具修正脚本头)。 -
缺少 Root 权限引起的限制:无法直接访问硬件设备节点(如
/dev/nodes)、无法操作网络协议栈(如使用原生pingraw socket、抓包工具tcpdump等,除非利用专用替代方案或设备已 Root)。 -
ABI 与系统调用限制:部分涉及底层内核特性(如 System V IPC 机制、bpf 等)的程序在没有内核支持或无 Root 权限时无法正常运行。
适用场景 *
- 移动端 DevOps 与系统运维:利用 SSH/Mosh 连接远程服务器、通过 Python/Ansible 执行运维自动化脚本、查询日志与监控。
- 轻量级现场开发与调试:配合 Go/Python/Node.js 等解释器或编译器,在大屏平板或外接键盘下编写、运行及测试代码,或进行 Git 版本控制操作。
- 网络安全与渗透测试:安装 Nmap、Metasploit、Hydra 等安全工具,进行现场无线网络审计与安全性测试。
- 旧 Android 设备硬件再利用:将淘汰的旧 Android 手机改造为【低功耗】的【家庭微型服务器】(如运行 Git Server、Web 服务器、Home Assistant、MQTT Broker 等)。
同类竞品 *
| 竞品名称 | 运行机制 | 是否需要 Root | 优点 | 缺点 |
|---|---|---|---|---|
| Termux | 原生用户空间(NDK编译) | 否 | 性能损耗极低,生态丰富,支持系统 API 联动 | 目录结构非 FHS,受 Android 后台策略影响大 |
| UserLLand | PRoot 容器机制 | 否 | 标准 FHS 结构,开箱即用支持完整的 Linux 发行版桌面; 支持MacOS/Windows/Android/Linux端 |
跨 syscall 转换导致文件 I/O 与执行性能有一定损耗 |
| Linux Deploy | chroot 挂载 | 是 | 性能接近原生态,拥有完全系统权限(完全 Linux 生态) | 门槛高,强制要求设备 Root 并且内核支持良好的文件系统 |
| JuiceSSH | 纯 SSH 客户端 | 否 | 极佳的终端 UI/UX 体验,支持密钥管理与端口转发 | 无本地 Linux 运行环境,仅能作为客户端连远程服务器 |
- Termux : Termux - a terminal emulator application for Android OS extendible by variety of packages
- https://termux.dev/cn/
- https://github.com/termux/termux-app
58.7k star / 7.2k fork (2026.8.6)
- UserLand : Everything you need to dive into Linux.
- https://userland.tech/download
- https://github.com/CypherpunkArmory/UserLAnd
4.2k star / 561 fork (2026.8.6)
- Linux Deploy : Install and run GNU/Linux on Android
- https://meefik.dev/linuxdeploy/
- https://github.com/meefik/linuxdeploy
5.9k star / 753 fork (2026.8.6)
- JuiceSSH : SSH client for Android
- https://github.com/dhiaeddine/JuiceSSH
33 star / 7 fork (2026.8.6)
发展趋势
-
社区活跃度:Termux 社区目前在 GitHub 上保持着极高活跃度,核心项目(
termux-app、termux-packages等)拥有庞大的 contributor 团队,软件仓库每日更新频繁。 -
Star & Fork 趋势:作为 Android 平台上受欢迎的开源 Linux 环境工具,
termux-appGitHub Star 数量持续保持稳步增长趋势,在同类项目中排名第一。
- 总结:Termux 已从单纯的终端模拟器演进为 Android 上最具影响力的 Linux 应用生态基础设施,未来将持续聚焦于突破 Android 新版本限制及增强 X11 桌面交互体验。
2 工作原理与架构
概念术语
-
Bionic libc:Android 系统自带的 C 标准库,与传统 Linux 使用的
glibc不兼容。Termux 仓库中的所有原生二进制文件均使用 Android NDK 结合 Bionic 进行编译。 -
PRoot:利用 Linux 的
ptrace【系统调用】实现的无 Root 用户空间chroot替代品。能够【伪造根目录】/和文件路径,使得标准 Linux 发行版可以在 Termux 中运行。 -
Termux-exec:一个通过预加载
LD_PRELOAD劫持execve()系统调用的挂钩库,用于自动把系统路径(如/bin/sh)映射回 Termux 的实际路径(如$PREFIX/bin/sh)。 -
Prefix (
$PREFIX): Termux 环境变量,指向其专属的安装根路径/data/data/com.termux/files/usr。
~ $ pwd
/data/data/com.termux/files/home
~ $ ls /data/data/com.termux/files/usr
bin etc include lib libexec share tmp var
架构与运行原理
- Termux 的整体设计架构主要分为:
- Android 原生 UI / JNI 交互层
- Terminal Emulation 终端仿真引擎
- POSIX Linux 用户空间环境
1. 终端仿真机制
- Termux 的前端使用 Java/Kotlin 构建,底层基于
TerminalView组件。 - 应用通过 Linux 的伪终端接口(
pty/ptmx)创建一个后台 Shell 进程。 - 用户的键盘输入经由 【JNI】 传递给【后台子进程】,子进程的标准输出/标准错误(stdout/stderr)通过 ANSI/VT100 转义码解析,最终由 TerminalView 渲染至屏幕上。
2. 软件运行与环境变量重定向
-
应用沙盒机制:Android 系统为每个应用分配唯一的 UID。Termux 只能在专属的数据目录
/data/data/com.termux/files/拥有读写与执行权限。 -
路径重定向:
-
所有通过
pkg/apt安装的软件全量部署在$PREFIX(.../files/usr) 目录下。 -
环境变量
PATH被预先设置为$PREFIX/bin;LD_LIBRARY_PATH指向$PREFIX/lib。 -
利用
libtermux-exec.so劫持execve调用,动态将脚本中硬编码的/bin/bash或/usr/bin/env重定向至 Termux 的合法路径,确保未经修改的通用 Linux 脚本可以直接运行。
3. PRoot 跨虚拟化层原理
- 当用户需要完整的 Linux 发行版生态(如需要 FHS 标准目录结构或依赖
glibc的二进制程序)时,Termux 借助 PRoot 技术:
[Linux] Filesystem Hierarchy Standard/文件系统层次结构标准(FHS for Linux) - 博客园/千千寰宇
- 利用 Linux 内核的
ptrace系统调用拦截目标进程的所有系统调用(syscall)。- 在系统调用执行前,将文件路径参数(如访问
/usr/lib)动态修改为真实存放路径(如~/ubuntu/usr/lib)。- 伪造
getuid()返回值,使用户在容器内部“感知”自己为root用户(实际在外部仍是 Android 沙盒的普通 UID)。
termux 的文件系统
- Termux 在安卓上是跑在自己的私有沙盒目录里,和普通 Linux 的 /home/用户名 不一样。它的"用户主文件夹(home)"分两层概念,别搞混:
用户主目录(你日常所在的 ~)
- 绝对路径:
~ $ echo $HOME
/data/data/com.termux/files/home
~ $ pwd
/data/data/com.termux/files/home
~ $ ls -la
total 25
drwx------. 6 u0_a514 u0_a514 3452 Aug 6 14:50 .
drwxrwx--x. 4 u0_a514 u0_a514 3452 Aug 6 12:01 ..
drwx------. 4 u0_a514 u0_a514 3452 Aug 6 12:33 .ollama
drwx------. 2 u0_a514 u0_a514 3452 Aug 6 12:40 .ssh
drwx------. 2 u0_a514 u0_a514 3452 Aug 6 12:01 .termux
-rw-------. 1 u0_a514 u0_a514 20 Aug 6 12:42 .termux_authinfo
drwx------. 2 u0_a514 u0_a514 3452 Aug 6 14:50 storage
我们用户所创建的脚本、下载的文件、clone 的代码、以及 Ollama 的模型默认都在这儿。
系统程序目录(装好的软件都在这里)
- 绝对路径:
/data/data/com.termux/files/usr,对应环境变量 $PREFIX
~ $ echo $PREFIX
/data/data/com.termux/files/usr
~ $ ls -la $PREFIX
total 69
drwx------. 10 u0_a514 u0_a514 3452 Aug 6 12:01 .
drwxrwx--x. 4 u0_a514 u0_a514 3452 Aug 6 12:01 ..
drwx------. 2 u0_a514 u0_a514 24576 Aug 6 12:40 bin
drwx------. 9 u0_a514 u0_a514 3452 Aug 6 12:40 etc
drwx------. 33 u0_a514 u0_a514 8192 Aug 6 12:40 include
drwx------. 12 u0_a514 u0_a514 20480 Aug 6 12:40 lib
drwx------. 9 u0_a514 u0_a514 3452 Aug 6 12:40 libexec
drwx------. 20 u0_a514 u0_a514 3452 Aug 6 12:40 share
drwx------. 2 u0_a514 u0_a514 3452 Aug 6 12:40 tmp
drwx------. 8 u0_a514 u0_a514 3452 Aug 6 12:40 var
举例:咱们
pkg install ollama装好的ollama可执行文件就位于$PREFIX/bin/ollama,也就是/data/data/com.termux/files/usr/bin/ollama。
整体目录树
/data/data/com.termux/files/
├── home/ ← 你的主目录 (~),OLlama 模型也在这
│ └── .ollama/models/ ← Ollama 模型默认位置
└── usr/ ← $PREFIX,系统程序区
├── bin/ ← 可执行文件
├── etc/ ← 配置
├── lib/ ← 库
└── share/ ← 共享资源
想在手机文件管理器里看到这些文件?
- 默认情况下,Android 11+ 的第三方文件管理器看不到
/data/data/com.termux/这个私有目录。
从 Android 11(API 30)开始,系统推行"分区存储(Scoped Storage)",第三方应用的私有目录
/data/data/<包名>/对【其他应用】(包括系统自带的文件管理器、ES 文件浏览器、Solid Explorer 等)【完全不可见】——这是【系统的安全设计】,不是 【bug】。
Termux的维护者在官方 issue 里也明确说过:没有 root 的情况下,Android 11+ 的文件管理器就是看不到【其他应用的私有目录】,这是【强制隔离】。
- 为什么我们在手机的文件系统管理器上看不见
/data/data/com.termux/文件夹?
- /data/data/com.termux/ 是 Termux 这个 APP 的私有沙盒目录,只有 Termux 自己(以及 root)能进
- Android 11 之后,即使你有 MANAGE_EXTERNAL_STORAGE 权限,也只能访问 /sdcard/Android/data/ 这一层,真正的 /data/data/ 对全局挂载空间不可见
所以,你在【文件管理器】里翻到
/data/这一层时,系统直接对你隐藏了com.termux这个文件夹
- 若要做【双向访问】——想和手机其他文件互传,在 Termux 里执行一次:
termux-setup-storage
系统会弹窗请求"允许 Termux 访问照片、媒体和文件",点授权允许。之后主目录里会出现
~/storage/文件夹,里面是一组符号链接,指向手机的真实存储位置 :
~/storage/shared/ → 内部存储根目录
~/storage/downloads/ → 下载
~/storage/dcim/ → 相册
~/storage/music/ → 音乐
~/storage/external-1/ → SD 卡(若有)
```txt
>> 之后你就可以 cp 模型文件 `~/storage/shared/` 把东西丢到【手机内部存储】里,用**普通文件管理器**也能看到 。
# 3 使用指南
## 安装部署
### 安装渠道说明
> **警告**:请严格避免使用 Google Play 上的 Termux 版本,该版本**已终止维护**,存在严重的包下载失败和兼容性问题。建议前往 [Github Releases](https://github.com/termux/termux-app/releases)下载。
推荐以下2种主要安装方式:
#### 方法1:通过 F-Droid 客户端安装(推荐)
1. 在 Android 设备上下载并安装 [F-Droid 客户端](https://f-droid.org/)。
2. 打开 F-Droid,搜索 `Termux`。
3. 选择安装由 Termux 官方发布的版本,后续可通过 F-Droid 接收无缝更新。
- 【科普】 `F-Droid` = 一个"不偷数据、不塞广告、全部开源"的安卓应用商店,适合对隐私和软件自由有要求的用户。
> - **项目简介**:F-Droid 是一个面向 Android 平台的自由开源软件(FOSS)应用商店,同时也是一个应用管理客户端——你装上 F-Droid 后,可以在里面浏览、安装、更新各类开源 App。
> - **核心创始人**: `Ciaran Gultnieks`——在2010 年,这位**英国**软件开发者发起了 F-Droid 项目,目标是**为 Android 平台打造一个自由开源软件(FOSS)应用分发渠道**。
> - **运营组织**: f-droid.org 的核心基础设施由 F-Droid Limited 运营——这是一家注册在英格兰的英国私人公司(公司号 08420676)
> - **特点/区别**:它和**普通应用商店**的核心区别
>> - **只收录自由开源应用**:默认仓库 https://f-droid.org/ 里的每一款应用都提供【完整源代码】,构建过程可复现,没有"黑盒"
>> - **隐私至上**:下载应用无需注册账号,F-Droid 本身不追踪你装了什么,收录的应用也要求无专有追踪器、无广告 SDK、无分析 SDK
>> - **社区驱动**:由关注自由开源软件的志愿者维护,至今已运营 15 年以上,目前收录超过 4000 款开源应用
>> - **免费且无广告**:F-Droid 服务本身不收费、不投放广告
>> - **支持第三方仓库**:除了默认仓库,你还可以添加其他兼容的 F-Droid 仓库,扩展应用来源

#### 方法2:通过 GitHub Releases 直接安装
1. 访问 [Termux App GitHub Releases](https://github.com/termux/termux-app/releases) 页面。
2. 根据设备架构(如: Android 15 => Android 7+, aarch/arm64-v8a) 选择对应的 APK 文件进行下载安装:
>> * `arm64-v8a`:大多数现代化 64 位 Android 手机。 √
>> * `armeabi-v7a`:旧款 32 位 Android 设备。
>> * `x86_64`:Android 模拟器或 x86 架构平板。
## 关键操作与基本使用
### 1. 基础环境初始化与镜像源切换
安装完成后,首先需要初始化软件包仓库。由于默认源位于国外,建议国内用户切换为镜像源以加速下载:
```bash
# 升级初始软件包
pkg update && pkg upgrade -y
# 切换国内镜像源 (执行后会弹出图形化选择框,可选择 TUNA 清华源或 USTC 中科大源)
termux-change-repo
2. 获取存储权限
为了使 Termux 能够读取和写入手机内部存储中的文件(如下载目录、相册等),需要显式授权:
termux-setup-storage
执行后,在弹出的 Android 系统权限申请框中选择“允许”。授权成功后,用户的主目录下会自动生成
storage软链接目录:
~$ termux-setup-storage
(弹出授权窗口)
~ $ pwd
/data/data/com.termux/files/home
~ $ ls -la
total 25
drwx------. 6 u0_a514 u0_a514 3452 Aug 6 14:47 .
drwxrwx--x. 4 u0_a514 u0_a514 3452 Aug 6 12:01 ..
drwx------. 4 u0_a514 u0_a514 3452 Aug 6 12:33 .ollama
drwx------. 2 u0_a514 u0_a514 3452 Aug 6 12:40 .ssh
drwx------. 2 u0_a514 u0_a514 3452 Aug 6 12:01 .termux
-rw-------. 1 u0_a514 u0_a514 20 Aug 6 12:42 .termux_authinfo
drwx------. 2 u0_a514 u0_a514 3452 Aug 6 14:47 storage
~ $ ls -la storage
total 7
drwx------. 2 u0_a514 u0_a514 3452 Aug 6 14:50 .
drwx------. 6 u0_a514 u0_a514 3452 Aug 6 14:50 ..
lrwxrwxrwx. 1 u0_a514 u0_a514 30 Aug 6 14:50 audiobooks -> /storage/emulated/0/Audiobooks
lrwxrwxrwx. 1 u0_a514 u0_a514 24 Aug 6 14:50 dcim -> /storage/emulated/0/DCIM
lrwxrwxrwx. 1 u0_a514 u0_a514 29 Aug 6 14:50 documents -> /storage/emulated/0/Documents
lrwxrwxrwx. 1 u0_a514 u0_a514 28 Aug 6 14:50 downloads -> /storage/emulated/0/Download
lrwxrwxrwx. 1 u0_a514 u0_a514 49 Aug 6 14:50 external-0 -> /storage/emulated/0/Android/data/com.termux/files
lrwxrwxrwx. 1 u0_a514 u0_a514 44 Aug 6 14:50 media-0 -> /storage/emulated/0/Android/media/com.termux
lrwxrwxrwx. 1 u0_a514 u0_a514 26 Aug 6 14:50 movies -> /storage/emulated/0/Movies
lrwxrwxrwx. 1 u0_a514 u0_a514 25 Aug 6 14:50 music -> /storage/emulated/0/Music
lrwxrwxrwx. 1 u0_a514 u0_a514 28 Aug 6 14:50 pictures -> /storage/emulated/0/Pictures
lrwxrwxrwx. 1 u0_a514 u0_a514 28 Aug 6 14:50 podcasts -> /storage/emulated/0/Podcasts
lrwxrwxrwx. 1 u0_a514 u0_a514 19 Aug 6 14:50 shared -> /storage/emulated/0
(说明:`l` 即软链接标识符)
~ $ ls storage
audiobooks dcim documents downloads external-0 media-0 movies music pictures podcasts shared
3. 安装常用基础工具: pkg / apt / python ...
- 通过
pkg(或apt)安装常用开发及运维工具:
# 安装基础必备组件
pkg install vim git curl wget openssh -y
# 安装 Python 开发环境
pkg install python -y
python -m pip install --upgrade pip
4. 配置与启动 OpenSSH 服务
- 在电脑端管理手机 Termux,可配置 SSH 服务:
# 更新包管理器
pkg update && pkg upgrade -y
# 安装 openssh (含: sshd 服务端、ssh 客户端)
pkg install openssh -y
# 查看 Termux 用户名 (通常名称: u0_aXXX)
whoami
(说明: Android系统在安装App应用(如 Termux)时即基于每个应用分配的uid来分配固定的用户名,只要不卸载重装,该uid、及【用户名应固定不变】)
# 设置 Termux 用户密码(默认: 无密码)
passwd
# 启动 SSH 服务(默认监听 8022 端口)
sshd
# 确认服务在运行
~ $ pgrep -l sshd
12771 sshd
15069 /data/data/com.termux/files/usr/libexec/sshd-session
15090 /data/data/com.termux/files/usr/libexec/sshd-session
15162 /data/data/com.termux/files/usr/libexec/sshd-session
15191 /data/data/com.termux/files/usr/libexec/sshd-session
29486 /data/data/com.termux/files/usr/libexec/sshd-session
29521 /data/data/com.termux/files/usr/libexec/sshd-session
或: ps -ef | grep -i ssh
# 获取手机当前 IP 地址 (找 wlan0下的 inet 字样后的 IP)
ifconfig
# 电脑端远程连接命令(假设手机 IP 为 192.168.11.100)
# ssh @192.168.11.100 -p 8022
5. 使用 PRoot 安装完整 Linux 发行版(以 Ubuntu 为例)
如果需要标准的 FHS 架构或需要运行依赖 glibc 的二进制程序,可使用 proot-distro 工具:
# 查看当前操作系统信息
~ $ uname -a
Linux localhost 6.6.30-android15-8-geae86f166c48-abogki367569362-4k #1 SMP PREEMPT Mon Sep 16 14:52:44 UTC 2024 aarch64 Android
# 安装 proot-distro 工具
pkg install proot-distro -y
# 查看支持的 Linux 发行版列表
proot-distro list
# 安装 Ubuntu 环境
proot-distro install ubuntu
# 登录到 Ubuntu 环境
proot-distro login ubuntu
6. 进程管理
- 进程查询
pgrep -l sshd
或 ps -ef | grep -i sshd
CASE 安装Ollama *
Ollama是一个由Meta公司(原Facebook公司)开发的、支持在Windows、Linux和MacOS上本地运行的、轻量且高效的、【大语言模型】框架。简言之,私有化部署LLM的开源工具。
- 更新包管理器
pkg update && pkg upgrade -y
- 安装 Ollama 服务
pkg install ollama -y
- 运行 Ollama
//启动 Ollama (将在后台运行)
~ $ ollama serve &
//查看进程运行状况,确保服务在后台正常运行
~ $ pgrep -l ollama
10417 ollama
~ $ ps -ef | grep -i ollama
u0_a514 10417 29401 0 1970 pts/0 00:00:13 ollama serve
//验证 Ollama 服务是否在跑
~ $ curl http://localhost:11434/api/version
或:
~ $ curl http://localhost:11434/api/tags
{"models":[{"name":"qwen2.5:1.5b","model":"qwen2.5:1.5b","modified_at":"2026-08-06T04:30:57.324780436Z","size":986061892,"digest":"65ec06548149b04c096a120e4a6da9d4017ea809c91734ea5631e89f96ddc57b","details":{"parent_model":"","format":"gguf","family":"qwen2","families":["qwen2"],"parameter_size":"1.5B","quantization_level":"Q4_K_M","context_length":32768,"embedding_length":1536},"capabilities":["completion","tools"]}]}~ $
//下载并运行 LLM 模型
【注意】 防止后台被杀:在 Termux 里执行 `termux-wake-lock`,并在小米"电池与性能"设置里把 Termux 设为「无限制」
【注意】 退出方式: /exit 或 /bye 或 Ctrl + D
~ $ ollama run qwen2.5:1.5b
>>> hello
你好!有什么可以帮助你的吗?
>>> /exit
~ $
//列出已下载的模型
~ $ ollama list
NAME ID SIZE MODIFIED
qwen2.5:1.5b 65ec06548149 986 MB 3 hours ago
//查看模型信息
~ $ ollama show qwen2.5:1.5b
Model
architecture qwen2
parameters 1.5B
context length 32768
embedding length 1536
quantization Q4_K_M
Capabilities
completion
tools
System
You are Qwen, created by Alibaba Cloud. You are a helpful assistant.
License
Apache License
Version 2.0, January 2004
...
//列出正在运行的模型
~ $ ollama ps
NAME ID SIZE PROCESSOR CONTEXT UNTIL
qwen2.5:1.5b 65ec06548149 1.4 GB 100% CPU 4096 3 minutes from now
- 停止运行 Ollama服务
pkill ollama
- 局域网内访问 Ollama 的问题
默认情况下 Ollama 只监听 127.0.0.1:11434,外部设备连不上 。要让局域网可访问,需要让 Ollama 监听所有网卡:
- step1 在 Termux 里重新启动服务,绑定到 0.0.0.0
# 先停掉旧服务
pkill ollama
# 设置环境变量后启动
export OLLAMA_HOST=0.0.0.0:11434 && echo $OLLAMA_HOST && ollama serve &
(可选步骤) 让 OLLAMA_HOST 永久生效:
每次 Termux 重启都要重新 export 很麻烦,可以写进 ~/.bashrc:
echo 'export OLLAMA_HOST=0.0.0.0:11434' >> ~/.bashrc
source ~/.bashrc

验证监听状态
netstat -tuln | grep 11434
# 应该看到 0.0.0.0:11434,而不是 127.0.0.1:11434
- step2 电脑/其他设备上访问 Ollama
在电脑浏览器或终端里:
curl http://<手机IP>:11434/api/tags
或: 在图形客户端(Chatbox、Cherry Studio、Open WebUI 等)里填:
API Base URL: http://<手机IP>:11434
或: 命令行远程调用:OLLAMA_HOST=http://<手机IP>:11434 ollama run qwen2.5:1.5b
- Ollama 的关键文件位置
- 可执行程序的路径: $PREFIX/bin/ollama
即:
/data/data/com.termux/files/usr/bin/ollama
- 模型的默认路径:
$HOME/.ollama/models/即:
/data/data/com.termux/files/home/.ollama/models/
~ $ ls ~/.ollama/models/manifests/registry.ollama.ai/library/qwen2.5/1.5b
/data/data/com.termux/files/home/.ollama/models/manifests/registry.ollama.ai/library/qwen2.5/1.5b
- 调用 Ollama 模型
$ curl http://<手机IP>:11434/api/generate -d '{
> "model": "qwen2.5:1.5b",
> "prompt": "写一个反转字符串的 Python 函数",
> "stream": false
> }'
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 94 0 0 100 94 0 4 0:00:23 0:00:23 --:--:-- 0{
{
"model":"qwen2.5:1.5b"
,"created_at":"2026-08-06T08:22:29.229801938Z"
,"response":"Sure! Here's an example of how to create and use a simple Python script that reads from the standard input (keyboard) and writes to the standard output:\n\n```python\nimport sys\n\n# Define a function to read user input\ndef get_input():\n return input(\"Enter some text: \")\n\n# Main function where we process user input\nif __name__ == \"__main__\":\n # Get user input until an empty line is entered (which means \"EOF\")\n while True:\n try:\n user_text = get_input().strip()\n \n if not user_text:\n print(\"No input received, exiting...\")\n sys.exit(0)\n \n # Process the input text here\n processed_text = f\"Processed: {user_text}\"\n \n # Output to standard output (screen)\n print(processed_text)\n except KeyboardInterrupt:\n print(\"\\nExiting script due to keyboard interrupt.\")\n break\n\n```\n\n### Explanation:\n\n1. **Import `sys`**: This is used for accessing system-specific parameters and calling system-provided functions.\n2. **Define a function `get_input()`**: This function reads the text entered by the user from the standard input (keyboard).\n3. **Check if the script is being run as the main module (`if __name__ == \"__main__\":`)**:\n - If it's not running as a standalone script, the script will exit with an error message.\n4. **Use `while True` loop**: This allows you to keep getting input until an empty line is entered (which ends a command).\n5. **Process and output user input**: The text from the previous prompt is passed through another function (`process_text()`) for processing, then printed on the console.\n\n### What You Can Do Next:\n- Copy this script into your Python environment.\n- Run it using `python filename.py`.\n- Try entering some lines of text. It will wait for you to enter a command before it outputs what you've entered back to you.\n\nThis simple example demonstrates basic interaction between users and scripts in the console. You could extend it by adding more functions (like converting input into another format) or integrating with other libraries as needed."
,"done":true
,"done_reason":"stop"
,"context":[151644,8948,198,2610,525,1207,16948,11,3465,553,54364,14817,13,1446,525,264,10950,17847,13,151645,198,151644,872,198,6949,145682,23479,54514,5691,146,115,23479,5691,13027,59630,151645,198,151644,77091,198,39814,0,5692,594,458,3110,315,1246,311,1855,323,990,264,4285,13027,5316,429,15804,504,279,5297,1946,320,41713,8,323,13914,311,279,5297,2550,1447,73594,12669,198,474,5708,271,2,18614,264,729,311,1349,1196,1946,198,750,633,5898,3932,262,470,1946,445,6269,1045,1467,25,59928,2,4697,729,1380,582,1882,1196,1946,198,333,1304,606,563,621,13265,3817,21082,262,671,2126,1196,1946,3080,458,4287,1555,374,10636,320,8206,3363,330,23483,1138,262,1393,3007,510,286,1430,510,310,1196,4326,284,633,5898,1005,13105,741,3374,310,421,537,1196,4326,510,394,1173,445,2753,1946,3949,11,44748,33093,394,5708,13641,7,15,340,6360,310,671,8603,279,1946,1467,1588,198,310,15233,4326,284,282,1,82535,25,314,872,4326,11195,3374,310,671,9258,311,5297,2550,320,8174,340,310,1173,21929,291,4326,340,286,3650,84188,510,310,1173,4921,77,87924,5316,4152,311,13625,12667,13053,310,1438,271,13874,19324,14374,71287,1447,16,13,3070,11511,1565,7791,63,95518,1096,374,1483,369,31788,1849,18906,5029,323,8098,1849,9838,42957,5746,624,17,13,3070,35338,264,729,1565,455,5898,54258,95518,1096,729,15804,279,1467,10636,553,279,1196,504,279,5297,1946,320,41713,4292,18,13,3070,3973,421,279,5316,374,1660,1598,438,279,1887,4688,28654,333,1304,606,563,621,13265,3817,563,788,63,32295,510,256,481,1416,432,594,537,4303,438,264,43388,5316,11,279,5316,686,4869,448,458,1465,1943,624,19,13,3070,10253,1565,3472,3007,63,6337,95518,1096,6147,498,311,2506,3709,1946,3080,458,4287,1555,374,10636,320,8206,10335,264,3210,4292,20,13,3070,7423,32100 4850 0 4756 100 94 199 3 0:00:31 0:00:23 0:00:08 104941,729,28654,4630,4326,368,32881,369,8692,11,1221,16709,389,279,2339,382,14374,3555,1446,2980,3155,9295,510,12,14540,419,5316,1119,697,13027,4573,624,12,6452,432,1667,1565,12669,3899,7197,18639,12,9735,16262,1045,5128,315,1467,13,1084,686,3783,369,498,311,3725,264,3210,1573,432,16275,1128,498,3003,10636,1182,311,498,382,1986,4285,3110,31116,6770,16230,1948,3847,323,19502,304,279,2339,13,1446,1410,13036,432,553,7842,803,5746,320,4803,33437,1946,1119,2441,3561,8,476,53852,448,1008,20186,438,4362,13]
,"total_duration":23820859157
,"load_duration":3370923957
,"prompt_eval_count":40
,"prompt_eval_duration":199237000
,"eval_count":445
,"eval_duration":20244048000
}
Z FAQ for Termux
Q: 基于模拟Linux的手机端运行 Ollama 部署LLM大模型,实际使用的注意事项?
- 模型选型:手机端建议 tinyllama:1.1b(600MB)、qwen2.5:1.5b(1GB)或 llama3.2:3b,别一上来就拉 7B/13B,否则慢到怀疑人生且发热严重
- 发热与续航:CPU 满负载推理会明显发热、掉电快,长时间运行建议插电
- 后台存活:小米 MIUI/HyperOS 的后台管理比较激进,除了电池优化白名单(Termux的电池策略=无限制),最好配合唤醒锁命令
termux-wake-lock - API 调用:Ollama 启动后默认监听 11434 端口,同一局域网下电脑/其他设备可以连手机上的模型服务
小米手机能跑 Ollama,但它是"极客玩法"而非"日常 APP",适合玩一玩本地小模型、做局域网 AI 服务;真要稳定日常用,还是电脑端跑 Ollama、手机当客户端更现实。
Q: 为什么在 Termux 中执行脚本会提示 No such file or directory,但文件明明存在?
这是由于该脚本的顶行(Shebang)硬编码了标准的 Linux 路径(例如 #!/bin/bash 或 #!/usr/bin/env python),而 Termux 的环境中并没有 /bin 或 /usr/bin 目录。
- 解决方法:使用 Termux 官方提供的路径修复工具处理该脚本:
pkg install termux-exec
termux-fix-shebang
Q: 在 Android 12 及以上版本,Termux 后台经常无故被杀,如何处理?
- 原因分析:
- Android 12 引入了更严格的 Phantom Process Killer(幽灵进程杀手) 机制,当应用派生的【后台子进程】 CPU 占用较高或数量过多时会被系统直接 SIGKILL 强杀。
- 解决方法:
- (临时方法) 主动激活屏幕,并切换到 Termux 应用
此举能暂时维持一会儿 (亲测大约能维持5-10分钟)。
- 关闭 Termux 应用的“电池优化”限制,将其设为“无限制”/“允许后台运行”。
- 小米手机为例:
设置-省电与电池-(选择)Termux-省电策略-(选择: 默认智能限制后台运行=改为=>无限制)
- 若已开启
ADB调试权限,可以通过电脑端 ADB 执行以下命令【全局关闭幽灵进程限制】:
adb shell device_config put activity_manager max_phantom_processes 2147483647
Y 推荐文献
- Termux
- Android
-
[Linux] Filesystem Hierarchy Standard/文件系统层次结构标准(FHS for Linux) - 博客园/千千寰宇
-
Ollama : https://ollama.com/
-
F-Droid
X 参考文献
原文地址: https://www.cveoy.top/t/topic/qHhe 著作权归作者所有。请勿转载和采集!