Openwrt directory structure
了解Openwrt的目录结构是学习一个新系统最基础也是最重要的部分。试想如果你想加一行代码进行修复bug,却花了半个小时才找到相应的位置,那是多么悲催啊,所以懂得系统框架可以让你在开发过程不会跑偏、快速定位,让工程项目规范化等。
如图是openwrt的基本的目录结构,其中白色部分是直接下载源码就有的源目录,蓝色部分则是通过make之后产生的目录(其中feeds目录则是通过命令./scripts/feeds update -a;./scripts/feeds install -a之后安装的扩展包目录,这个目录将所有的文件链接到package/feeds/中去了),下面就对各目录进行简要说明。
1.tool和toolchain目录
编译固件image/获取内核头文件/二进制编译器和调试器/c库文件,需要用到的通用工具。
2.include目录
编译时的头文件索引,源码包就有,包含一些编译用的通用脚本和include宏定义。比较重要的包括:package.mk文件(几乎每个package目录中的模块的makefile中都提到它)
3.scripts目录
对openwrt的包进行管理的perl脚本,源码包就有,存放各类脚本的目录。比如:feeds脚本,使用.scripts/feeds update -a或者.scripts/feeds install -a,就可以对feeds.conf.default中列举的文件进行处理了。
4.target目录
包含了特定平台的文件,固件镜像和内核构建过程的索引,以及生成编译器各编译工具。
- linux目录下为各个平台相应的内核patches,配置文件等;
- imagebuilder目录则扫描如何生成这个平台的固件,源码包就有的,用来指导如何编译firmware和内核以及sdk的。
5.package目录和feeds目录
在openwrt中,基础的软件包目录为package,扩展的软件包在feeds中。
feeds中的软件扩展了openwrt的基本功能,它将所有的软件链接到package/feeds中。里面存放的就是按照 feeds.conf.default文件中列举的要处理的文件,所展开得到的目录。目录中存放的东西,和package目录中大致相似。指导如何下载和编译对应模块的。
这些软件大多数都是编译成.ipk格式的,这里面有内核模块文件,有各种软件的源码,以及patch文件和Makefile用来下载源码的。
6.dl目录
编译工具、目标、package所需要的软件包将从网上下载放到dl目录中
7.build_dir目录
一个临时目录,用来将所有需要编译的软件源码放到这个目录中进行编译。它包括一下三个目录:
- build_dir/host: 与编译目标无关的工具的临时文件夹
- build_dir/<arch>*: 作为所有目标,package编译的临时目录
- build_dir/toolchain-<arch>*:编译特定体系的交叉编译链的文件夹
8.staging_dir目录
用于存放构建目标系统镜像的工具软件,包括:
- staging_dir/host: 宿主系统使用的工具
- staging_dir/<arch>*: 目标系统使用的软件软件包
- staging_dir/<toolchain-<arch>*: 交叉编译工具链
9.bin目录
make之后的新增目录,用来存放make的结果。比如我是用来编译ramips的,则此目录中会有:ramips子目录,其中又包含:packages子目录(里面含有各种.ipk文件,以及一个Packages文件用来介绍此目录中的每个ipk文件)和可以烧入CPE的openwrt-ramips-mt7620-xiaomi-miwifi-mini-squashfs-sysupgrade.bin文件。
10.其他文件
- Makefile文件:make命令的总入口
- rules.mk文件:定义了一系列在make时使用的规则
- .config隐藏文件:make menuconfig后的config结果的存放文件。
- .config.old隐藏文件:老的.config文件
Openwrt directory structure的分析就到这边,有感悟时会持续会更新。
注:以上内容都是本人在学习过程积累的一些心得,难免会有参考到其他文章的一些知识,如有侵权,请及时通知我,我将及时删除或标注内容出处,如有错误之处也请指出,进行探讨学习。文章只是起一个引导作用,详细的数据解析内容还请查看Openwrt相关教程,感谢您的查阅。