在嵌入式 Linux 开发中,/tmp 目录虽然看似简单,但因其“临时性”、“高读写性能”和“所有用户可访问”的特性,在实际开发、调试与部署过程中具有多种巧妙用途。以下是 /tmp 目录在嵌入式 Linux 环境中的 8 个实用妙用,结合资源受限、启动快速、安全性要求高等特点进行详细说明:
1. 作为程序运行时的中间缓存区
- 场景:编译脚本、固件更新、图像处理等任务需要暂存中间数据。
- 优势:避免频繁读写 Flash(如 eMMC、NAND),延长存储寿命。
- 示例:
# 解压固件到 /tmp 再处理,避免直接操作只读分区
tar -xf update.tar.gz -C /tmp/
2. 挂载为 tmpfs 提升 I/O 性能
- 原理:将 /tmp 挂载为基于内存的 tmpfs 文件系统。
- 适用:内存充足(如 ≥128MB RAM)且需高频读写临时文件的设备(如工业控制器、视频采集终端)。
- 配置(在 /etc/fstab 或 init 脚本中):
tmpfs /tmp tmpfs size=32M,mode=1777 0 0
- 效果:读写速度接近内存带宽,无磨损,重启自动清空。
3. 存放进程间通信(IPC)的 socket 或 FIFO 文件
- 用途:轻量级 IPC,替代复杂的 D-Bus 或消息队列。
- 安全建议:使用 mktemp -d /tmp/myapp.XXXXXX 创建私有子目录,防止命名冲突。
- 示例:
char path[] = "/tmp/mydaemon.sock";
struct sockaddr_un addr = {.sun_family = AF_UNIX};
strcpy(addr.sun_path, path);
bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
4. 用于自动化测试或单元测试的沙箱环境
- 优势:每次测试前清空 /tmp/test_XXX,确保环境干净;测试失败也不会污染持久存储。
- 实践:
TEST_DIR=(mktemp -d /tmp/embedded_test.XXXXXX)
./run_tests.sh --workdir "TEST_DIR"
rm -rf "TEST_DIR"
5. 作为 Web 服务或 CGI 脚本的临时上传目录
- 场景:嵌入式 Web 服务器(如 Boa、Lighttpd)接收文件上传。
- 配置(以 Lighttpd 为例):
server.upload-dirs = ( "/tmp" )
- 注意:需配合权限控制(如 sticky bit)和定期清理,防止 DoS 攻击。
6. 存放系统启动阶段的临时状态标志
- 用途:在 init 脚本或 systemd service 中标记“已执行某操作”,避免重复。
- 示例:
if [ ! -f /tmp/first_boot_done ]; then
# 执行首次启动初始化(如生成密钥)
touch /tmp/first_boot_done
fi
- 优势:比写入 /etc 或 /var 更快,且不影响持久配置。
7. 配合 BusyBox 工具链实现轻量级日志缓冲
- 技巧:将关键日志先写入 /tmp/app.log,再由后台任务批量刷入 /var/log(若存在)。
- 适用:无持久存储或日志非关键的设备(如传感器节点)。
- 命令示例:
echo "(date): Sensor OK" >> /tmp/sensor.log
# 定期通过串口或网络上报 /tmp/sensor.log 内容
8. 作为 OTA(空中升级)过程中的安全暂存区
- 流程:
1. 下载新固件到 /tmp/firmware.bin
2. 校验 SHA256
3. 验证通过后写入 /dev/mtdblockX 或 /update 分区
- 安全价值:
- 避免不完整固件写入主分区导致变砖
- 利用 tmpfs 可防止固件被恶意篡改(内存易失)
⚠️ 嵌入式环境下的特别注意事项:
- 空间限制:若未挂载 tmpfs,/tmp 通常位于根文件系统(可能是只读 SquashFS + overlay),需确认是否有写权限。
- 权限设置:务必设置 sticky bit(1777),防止用户 A 删除用户 B 的临时文件:
chmod 1777 /tmp
- 清理策略:资源极度受限设备可禁用自动清理,依赖重启回收;否则应配置 systemd-tmpfiles 或自定义 cron。