Termux 和 Proot 下部署 HomeAssistant 的权限处理
在安卓手机上跑家庭自动化服务,听起来像是把闲置硬件再利用一把,实际做起来就会碰到一堆权限和兼容性问题。旧手机的 CPU 和内存通常不算差,问题不在算力,而在系统不给你碰底层资源。Termux 加上 Proot 能在无 Root 的前提下拉起一个 Linux 环境,但 HomeAssistant 这类会碰网络、设备节点和文件权限的服务,还是会把这些限制一层层暴露出来。
1. 先把运行环境理清
Termux 和 Proot 各自负责什么
Termux 不是单纯的'手机上的终端',它本身就是一个 Android 应用,包管理、文件系统、工具链都自成一套,运行在系统沙盒里。这样做的好处是干净,坏处也很直接:你拿不到系统级权限。
Proot 则是在用户态模拟 chroot、mount --bind 这类能力,让没 Root 的环境也能跑出一个看起来像完整 Linux 的根文件系统。它靠 ptrace 去拦截和重定向路径访问,所以能用,但别把它当成真的容器。很多时候它只是'够用',不是'完整'。
# 检查 Termux 环境基本信息
pkg update
pkg install proot proot-distro proot-distro list
和真正的 Linux 容器比,Proot 的短板很明确:
- 不能直接碰硬件设备
- 网络栈不是完整隔离
- 一些系统调用会因为兼容性出问题
- 用户和组映射不够灵活
为什么我会先选 Alpine
如果目标只是把 HomeAssistant 跑起来,Alpine 比 Ubuntu 更合适。它轻,基础镜像小,包管理也直接,少了很多在资源受限环境里才会冒出来的麻烦。
| 特性 | Alpine Linux | Ubuntu |
|---|---|---|
| 基础镜像大小 | ~5MB | ~50MB |
| 内存占用 | 低 | 中等 |
| 包管理工具 | apk | apt |
| 依赖完整性 | 高 | 中等 |
| 编译需求 | 少 | 多 |
| 安全性 | 高 | 中等 |
更实际的一点是,Alpine 里的不少 Python 包可以直接拿到预编译版本,像 cryptography 这类依赖底层 C 库的包,少了现场编译,安装过程会省很多事。对手机这种环境来说,这个差别挺大。
2. 权限问题到底卡在哪
典型的 PermissionError 从哪来
HomeAssistant 在 Proot 里出问题,通常不是单点故障,而是几个限制叠在一起:
- 它想枚举网络接口,但 Proot 给不了真实的设备视图
- 它会访问
/dev下面的设备节点,Android 沙盒不放行 - Proot 里的
root不是系统 root,本质上还是普通用户 - 有些组件会尝试写系统目录,而这里可写范围很小
有些库在这种环境里会直接抛权限错误,ifaddr 就是常见的一个。处理办法通常很粗暴:别让它继续走那条会出错的路径。
# HomeAssistant 中 ifaddr 库的权限规避修改
# 文件位置:/opt/homeassistant/lib/python3.x/site-packages/ifaddr/_posix.py
():
[]

