文件系统使用指南
1. RootFS
借助于 Buildroot, 很多需要使用的工具可以直接被编译和安装到 RootFS, 如果希望将非依赖 Buildroot 独立编译的程序和文件放到 RootFS 中时,可使用 SDK 提供的RootFS Overlay 的机制来实现。
1.1. Overlay机制
RootFS Overlay 是指在制作 RootFS 镜像过程中,使用客制化的 RootFS 目录内容覆盖 output/target/
中目录和文件的一个机制。
图 5.22 RootFS Overlay 机制
如上图所示,编译过程中生成的内容,安装到 output/target/
,制作 RootFS 镜像时:
首先将
output/target/
目录内容rsync
到 RootFS 制作目录output/build/luban-fs/target/
然后将指定的 RootFS Overlay 目录中的内容
rsync
到 RootFS 制作目录output/build/luban-fs/target/
如果配置了多个 RootFS Overlay 目录,则按顺序
rsync
覆盖output/build/luban-fs/target/
中的内容
通过上述机制,开发者可以将独立编译的程序和文件放在一个 RootFS Overlay 目录中,然后将该目录路径配置到对应的 <board>_defconfig
,即可将这些程序和文件打包到 RootFS 镜像。
1.2. 默认 Overlay
SDK 给每个 Board 设置了一个默认的 Overlay 目录,可以按照需要的目录结构存储直接预制文件
target/d211/fpga_spinand/rootfs_overlay
1.3. 新 Overlay
Luban SDK 的 Overlay 支持多目录,增加新的 Overlay 目录的方案是:
- 打开配置界面
make menuconfig
- System configuration
System configuration --->
(target/$(LUBAN_CHIP_NAME)/$(LUBAN_BOARD_NAME)/rootfs_overlay) Root filesystem overlay directories
此处 ``target/$(LUBAN_CHIP_NAME)/$(LUBAN_BOARD_NAME)/rootfs_overlay`` 即为每一个板子的目录下的默认的 rootfs_overlay 目录。
-
添加新目录
RootFS Overlay 目录可以配置多个,不同目录之间使用
空格
分开即可。如
target/$(LUBAN_CHIP_NAME)/$(LUBAN_BOARD_NAME)/rootfs_overlay test_rootfs
此处除了板子目录下的 ``rootfs_overlay`` 目录,还添加了 SDK 顶层目录下的 ``test_rootfs`` 目录。
1.4. 编译结果
在完成上述添加后,重新编译生成固件时三个目录将被合并构建 RootFS
- rootfs_overlay 和 test_rootfs 中的内容会被按顺序安装到
output/build/luban-fs/target/
output/build/luban-fs/target/
内容被安装到output/target/
中- 基于
output/target/
生成 RootFS
2. 开机启动
RootFS /etc/init.d/
目录可以设置开机初始化脚本 ,这些脚本在登录之前被 linuxrc 执行。
小技巧
linuxrc 执行的内容和顺序可详细参考:package/third-party/busybox/inittab
Luban SDK 编译时,如何为项目安装开机初始化脚本?推荐如下几种方式
2.1. init.d 脚本
如果初始化脚本与某组件包相关,可以编写一个 init.d 脚本, 在该组件包安装文件时,将对应的脚本安装到 /etc/init.d/
目录
2.1.1. 脚本
Linux 对 init.d 脚本有统一的要求,可以百度解决,此处给一个简单的例子: S99qtlauncher, 其中 S99 为优先级,99说明优先级比较低
#!/bin/sh
#
# Start qtlauncher....
#
DAEMON="/usr/local/qtlauncher/qtlauncher"
DAEMONOPTS=" -platform=linuxrc"
PIDFILE=/var/run/qtlauncher.pid
start() {
printf "Starting qtlauncher: "
PID=`$DAEMON $DAEMONOPTS > /DEV/NULL 2>&1 & echo $!`
if [ -z $PID ]: then
printf "Fail \n"
else
echo $PID >$PIDFILE
printf "OK \n"
fi
}
stop() {
printf "Stopping qtlauncher: "
PID=`cat $PIDFILE`
if [ -f $PIDFILE]; then
kill -HUP $PID
printf "OK \n"
rm -f $PIDFILE
else
printf "pidfile not found \n"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit $?
2.1.2. 安装
继续上文的 S99qtlauncher:
package/artinchip/qtlauncher/qtlauncher.mk
define QTLAUNCHER_INSTALL_TARGET_CMDS
$(INSTALL) -m 0755 -D package/artinchip/qtlauncher/S99qtlauncher \
$(TARGET_DIR)/etc/init.d/S99qtlauncher
endef
2.2. RootFS Overlay
如果该脚本与具体的组件包没有直接的关系,与项目相关性较大,或者不方便放到具体的组件包中,则可以 放到 target/<chip>/<board>/rootfs_overlay/
目录,这样在生成 RootFS 镜像时,通过 Overlay 的方式 安装到镜像的 /etc/init.d/
目录中。
具体可参考 RootFS 。
2.3. initscripts
/etc/init.d/
目录是由 package/third-party/initscripts/
包进行安装创建的, 也可以将相关初始化脚本放在该包中进行安装。
需要修改 package/third-party/initscripts/initscripts.mk
中的 INITSCRIPTS_INSTALL_TARGET_CMDS
。
注解
多数的脚本都有与之相关的组件包,建议尽量采用第一、第二种方式进行安装,并不建议将过多的脚本放到 initscripts 包中进行安装。
3. 系统分区
分区表的配置在 image_cfg.json
文件中完成,可以很容易的进行增删改查操作
3.1. 配置说明
image_cfg.json
是 SDK/target/<chip>/<board>
目录下描述如何生成烧录镜像的文件,其中的第一部分就是描述烧录的目标存储介质的分区设置。
3.1.1. eMMC
"mmc": { // Media type
"size": "8G", // Size of SD/eMMC
"partitions": { // Partition table apply to device
"spl_1": { "offset": "0x4400", "size": "128k" },
"spl_2": { "size": "367k" },
"uboot": { "size": "1m" },
"env": { "size": "512k" },
"kernel": { "size": "16m" },
"rootfs": { "size": "64m" },
"user": { "size": "64m" },
"data": { "size": "-" },
},
},