iperf3在RK平台Android14上的深度调优:从源码到实战的完整网络性能测试方案
最近在RK3588的开发板上折腾Android14,准备用iperf3测一下千兆网口的实际吞吐量,结果刚启动客户端就给我来了个下马威——iperf3: error - unable to create a new stream: no such file or directory。这个错误看起来简单,背后却牵扯到Android系统权限模型、文件系统布局、以及嵌入式环境下的特殊约束。如果你也在RK平台或者类似的嵌入式Android设备上遇到过类似问题,这篇文章或许能帮你少走些弯路。
嵌入式Android设备上的网络性能测试从来都不是一件简单的事。传统的Linux工具在Android环境下运行时,往往会遇到各种权限和路径问题。iperf3作为业界标准的网络性能测试工具,在标准Linux系统上运行良好,但移植到Android环境时,特别是像RK平台这样深度定制的嵌入式系统,就需要针对性地进行调整。这篇文章不仅会解决那个恼人的“no such file or directory”错误,还会深入探讨如何在资源受限的嵌入式环境中搭建完整的网络测试环境,从源码编译到实际部署,提供一套可落地的解决方案。
1. 理解Android14环境下的权限与文件系统约束
Android14在安全性和权限管理上做了进一步强化,这对传统Linux工具的运行环境产生了显著影响。与标准的Linux发行版不同,Android采用了更加严格的沙盒机制和权限隔离,特别是对于/tmp目录的访问权限。
在标准的Linux系统中,/tmp目录通常是全局可写的临时文件存储位置,许多命令行工具(包括iperf3)默认会在这里创建临时文件。然而在Android系统中,特别是从Android 10开始,对临时目录的访问受到了严格限制。普通应用(即使是拥有shell权限)也无法直接在/tmp目录下创建文件,这是因为Android的SELinux策略和文件系统权限模型发生了变化。
Android文件系统权限的关键变化:
- SELinux策略强化:Android的SELinux策略默认禁止非系统进程在
/tmp目录进行写操作 - 命名空间隔离:每个应用都在自己的文件系统命名空间中运行,无法直接访问全局的
/tmp - 存储沙盒:应用数据被严格隔离在各自的
/data/data/目录下
对于RK平台这样的嵌入式设备,情况可能更加复杂。厂商可能会对文件系统进行定制,或者使用只读的文件系统分区。这就意味着,即使你通过adb shell获得了root权限,某些系统目录的写权限可能仍然受到限制。
注意:在Android设备上,
/data目录通常是应用数据存储的位置,具有相对宽松的权限设置,这使其成为替代/tmp的理想选择。
2. iperf3错误根源分析与临时解决方案
当iperf3尝试创建新的数据流时,它需要在临时目录中创建套接字文件或管道文件。查看iperf3的源码可以发现,这个临时目录的确定逻辑如下:
char template[PATH_MAX];
const char *tempdir = getenv("TMPDIR");
if (tempdir == NULL) {
tempdir = getenv("TMP");
}
if (tempdir == NULL) {
tempdir = "/tmp"; // 默认回退到/tmp
}
snprintf(template, sizeof(template), "%s/iperf3.XXXXXX", tempdir);
从代码中可以看出,iperf3会依次检查TMPDIR、TMP环境变量,如果都没有设置,就默认使用/tmp目录。在Android14环境下,正是这个默认的/tmp目录导致了权限错误。
临时解决方案:设置环境变量
最简单的解决方法是设置TMP环境变量,将其指向一个有写权限的目录:
# 在adb shell中执行
export TMP=/data
iperf3 -c 192.168.1.100 -t 30
或者更完整的环境变量设置:
export TMPDIR=/data/local/tmp
export TMP=/data/local/tmp
iperf3 -s &
iperf3 -c 192.168.1.100
不同目录的权限对比:
| 目录路径 | Android权限 | SELinux上下文 | 是否适合iperf3 |
|---|---|---|---|
/tmp |
通常只读或受限写 | tmpfs |
否,权限不足 |
/data |
可读写 | system_data_file |
是,推荐选项 |
/data/local/tmp |
可读写 | shell_data_file |
是,适合adb shell环境 |
/sdcard |

719

被折叠的 条评论
为什么被折叠?



