• okass 在版块 软件平台 中回复了话题 openwrt系统定制 2年, 10个月前

    1. openwrt文件系统架构详解

     

    1> 文件系统的目录树

    动态

    [备注]

    • 蓝色部分是源码自带的默认目录
    • 绿色部分是编译后生成的目录架构

     

    2> 原始目录架构解释

    • config   ,存放着整个系统的配置文件。
    • include  ,openwrt 的 Makefile 都存放在这里,文件名为 *.mk 。这里的文件是在 Makefile 里被 include 的,类似于库文件。这些文件定义了编译过程。
    • package,存放了 openwrt 系统中适用的软件包,包含针对各个软件包的 Makefile。openwrt定义了一套 Makefile 模板,各软件参照这个模板定义了自己的信息,如软件包的版本、下载地址、编译方式、安装地址等。在二次开发过程中,这个文件夹我们会经常打交道。事实上,通过 ./scripts/feed update -a和 ./scripts/feed install -a 的软件包也会存放在这个目录之中。
    • scripts,存放了一些脚本,使用了 bash、python、perl 等多种脚本语言。编译过程中,用于第三方软件包管理的 feeds 文件也是在这个目录当中。在编译过程,使用到的脚本也统一放在这个目录中
    • staging_dir,用于保存在 build_dir 目录中编译完成的软件,所以这里也和 build_dir 有同样的子目录结构。比如,在 target-XXX 文件夹中保存了目标平台编译好的头文件、库文件。在我们开发自己的 ipk 文件时,编译过程中的预处理头文件、链接动态库、静态库都是到这个子文件夹中。
    • target,openwrt 的源码可以编译出各个平台适用的二进制文件,各平台在这个目录里定义了 firmware 和 kernel 的编译过程。
    • tmp,从名字来看,是临时文件夹。在编译过程中,有大量中间临时文件需要保存,都是在这
    • toolchain,这个文件中存放的就是编译交叉编译链的软件包,包括:binutils,gcc,libc等等.
    • tools,编译时主机需要使用一些工具软件,tools 里包含了获取和编译这些工具的命令。软件包里面有 Makefile 文件,有的还包含了 patch。每个Makefile当中都有一句$(eval $(call HostBuild)),这表明编译这个工具是为了在主机上使用的。

    其他目录

    主要目录就是前面提及的8个,剩下的是单个文件。

    • Makefile,在顶层目录执行 make 命令的入口文件。
    • rules.mk,定义了 Makefile 中使用的一些通用变量和函数。
    • Config.in,在include/toplevel.mk中我们可以看到,这是和make menuconfig相关联的文件。
    • feeds.conf.default,是下载第三方一些软件包时所使用的地址。
    • LICENSE & README,即软件许可证和软件基本说明.其中README描述了编译软件的基本过程和依赖文件。

     

    3> 新增目录
    1、bin

    保存编译完成后的二进制文件,包括:完整的 bin 文件、所有的 ipk 文件。

    2、build_dir

    在前面的原始目录中,我们提到了 host 工具、toolchain 工具还有目标文件。openwrt 将在这个目录中展开各个软件包来进行编译,所以这个文件夹中包含如下 3 个子文件夹:

    • host ,  在该文件夹中编译主机使用的工具软件。
    • toolchain-XXX,  在该文件夹中编译交叉工具链。
    • target-XXX,  在此编译目标平台的目标文件,包括各个软件包和内核文件。

    3、dl

    “download”的缩写,从 feeds.conf 指定的仓库下载的 package 和 feed 中 Makefile 中指定版本的各种源码包。在编译前期,需要从网络下载的数据包都会放在这个目录下,这些软件包的一个特点就是会自动安装在所编译的固件中,也就是我们 make menuconfig 的时候,为固件配置的一些软件包,如果我们需要更改这些源码包,只需要将更改好的源码包打包成相同的名字放在这个目录下,然后开始编译即可。编译时,会将软件包解压到 build_dir 目录下。

    4、feeds

    openwrt 的附加软件包管理器的扩展包索引目录。有点绕,简单来说就是下载并管理软件包的。默认的 feeds下载有packages、management、luci、routing、telephony。如要下载其他的软件包,需打开源码根目录下面的 feeds.conf.default 文件,去掉相应软件包前面的#号,然后更新源:

    ./scripts/feeds update -a

    安装下载好的包:

    ./scripts/feeds install -a4. dl

    在编译过程中使用的很多软件,刚开始下载源码并没有包含,而是在编译过程中从其他服务器下载的,这里是统一的保存目录。

     

     

    4> 软件包的编译过程:

    1、软件包编译过程

    按照 package 中的脚本下载软件包到 dl 目录下,再将 dl 目录下的软件包解压到 build_dir 目录下,在该目录下进行编译,将生成的目标文件放到 staging_dir 目录下,最终编译完成的镜像文件放到 bin 文件中。

    package → dl → build_dir → staging_dir → bin

WirelessLink
Logo