banner
NEWS LETTER

嵌入式 Linux 系列 04:RootFS 结构、启动脚本和配置持久化

Scroll down

RootFS 是嵌入式 Linux 用户态的地基。应用能不能启动、配置会不会丢、日志写到哪里、系统能不能长期运行,很多问题最后都会回到 rootfs 设计。

一、RootFS 里有什么

一个最小 rootfs 通常包括:

1
2
3
4
5
6
7
8
9
10
/bin
/sbin
/etc
/dev
/proc
/sys
/lib
/usr
/tmp
/var

其中 /proc/sys/dev 通常是启动后挂载的伪文件系统或设备文件系统,不是普通静态目录。

二、只读 rootfs 和可写数据区

产品系统建议分层:

1
2
3
rootfs: 只读,随固件升级
data: 可写,保存配置、日志、运行状态
tmpfs: 临时文件,重启丢失

好处:

  • 系统文件不容易被破坏。
  • 断电时配置和日志集中管理。
  • OTA 升级可以替换 rootfs,保留 data。
  • 出问题时更容易区分系统问题和用户数据问题。

检查挂载:

1
2
3
mount
cat /proc/mounts
df -h

三、BusyBox init

精简系统常用 BusyBox init。

关键文件:

1
2
3
/sbin/init
/etc/inittab
/etc/init.d/rcS

/etc/inittab 示例:

1
2
3
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::ctrlaltdel:/sbin/reboot

rcS 示例:

1
2
3
4
5
6
7
8
9
10
11
#!/bin/sh

mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t devtmpfs devtmpfs /dev
mount -t tmpfs tmpfs /tmp

mkdir -p /data/config /data/log

/etc/init.d/S10network start
/etc/init.d/S50device_agent start

启动脚本要尽量简单、可重复执行,并且错误日志要能看见。

四、配置持久化

不要把运行时配置写进只读 /etc。推荐:

1
2
3
/data/config/device.json
/data/config/timezone
/data/config/network.conf

写配置时要考虑异常断电。一个常用做法是写临时文件后原子替换:

1
2
3
4
5
6
7
8
9
write_config() {
file="$1"
tmp="$file.tmp"

cat > "$tmp"
sync "$tmp" 2>/dev/null || sync
mv "$tmp" "$file"
sync "$(dirname "$file")" 2>/dev/null || sync
}

这样比直接覆盖原文件更可靠。

五、日志目录

日志建议放到:

1
/data/log

注意控制大小:

  • 单文件大小限制。
  • 保留最近 N 个文件。
  • 关键错误单独记录。
  • 量产版本减少 debug 日志。

最简单的轮转方式:

1
2
3
if [ -f /data/log/app.log ] && [ "$(wc -c < /data/log/app.log)" -gt 1048576 ]; then
mv /data/log/app.log /data/log/app.log.1
fi

更完整可以引入 logrotate 或应用内部日志轮转。

六、RootFS 排查清单

系统进不了 shell 时查:

1
2
3
4
5
ls -l /sbin/init
ls -l /bin/sh
ls -l /lib
cat /etc/inittab
cat /etc/init.d/rcS

配置丢失时查:

1
2
3
mount | grep data
cat /proc/mounts
ls -l /data/config

日志写不出来时查:

1
2
3
df -h
mount
ls -ld /data/log

RootFS 的关键不是目录背得多,而是知道每类文件应该放在哪里,以及重启和升级后会发生什么。

其他文章
目录导航 置顶
  1. 1. 一、RootFS 里有什么
  2. 2. 二、只读 rootfs 和可写数据区
  3. 3. 三、BusyBox init
  4. 4. 四、配置持久化
  5. 5. 五、日志目录
  6. 6. 六、RootFS 排查清单
请输入关键词进行搜索