深入理解openwrt架构(一)--安装准备和目录分析

来源:互联网 发布:xp关闭80端口 编辑:程序博客网 时间:2024/05/17 21:51
openwrt安装准备和目录分析

.安装准备工作

我选择的是虚拟机上安装ubuntu12.10的linux操作系统,最好是在普通用户下操作。
1,安装linux上的更新组件
       为了支持openwrt的安装编译,在linux操作系统上需要安装以下的软件
       $ sudo apt-get install gcc g++ binutilspatch bzip2 flex bison make autoconf gettext texinfo unzip sharutils subversionlibncurses5-dev ncurses-term  zlib1g-devsubversion git-core gawk libz-dev asciidoc  -y
2,新建openwrt目录并进入
   $ mkdir /opt/openwrt
   $ cd    /opt/openwrt
3,从官网下载openwrt的最新源码trunk版本的(这个版本支持的硬件更多)
   $ svn co svn://svn.openwrt.org/openwrt/trunk
   $ svn up  //更新openwrt版本号和源码  
   下载后的的目录如下:
4,为trunk目录添加如下权限
   $ sudo chmod -R /opt/openwrt/trunk
5,在trunk目录下,升级所有扩展软件源列表
   $ ./scripts/feeds update -a
   这一步的结果是:产生$(TOPDIR)/feeds目录,存放的就是执行
   feeds.conf.default文件后的结果:从指定svn中下载的文件
6,安装所有扩展软件
   $ ./scripts/feeds install - a
   这一步的结果是:在package目录中多了一个feeds目录,里面存放的子目录是到$(TOPDIR)/feeds目录的链接
   注意:在TOPDIR/Makefile中,有如下定义:
   # update allfeeds, re-create index files, install symlinks
   package/symlinks:
   $(SCRIPT_DIR)/feedsupdate -a
   $(SCRIPT_DIR)/feedsinstall -a
   那么,可以想见,上述两个也可以合并为一步,即make package/symlinks
7,使用默认编译环境,检查是否能进行编译
   $ make defconfig
8,配置自定义的镜像配置
   $ make menuconfig
   对于如何进行配置,将在后面的讲解中进行详解
9,编译镜像
   $ make V=99
   第一次编译可能需要花费很长的时间,根据你的网络而定,一般情况下大约是2~3个小时,最主要的是花费在下载源码的时间上,以后编译一般在半个小时左右就能编译好。
10,编译完成之后,将会多出几个目录如下:
增加的目录包括:bin/ , build_dir/, dl/, feeds/,staging_dir/
11make步骤分析
     简单来说,一旦OpenWrt buildroot已正确配置,如指定目标平台和体系结构,用户空间包已经选择等, OpenWrt buildroot会通过以下步骤编译镜像(一旦配置完成)
    a) 下载交叉编译工具,内核头文件等。
    b)建立staging_dir/目录,这个目录是交叉编译工具链将被安装的地方,如果你想使用相同的交叉编译工具链用作其他目的,比如编译第三方应用程序,你可以找到在这个目录下找到交叉编译工具,然后使用arch-linux-gcc 编译你的应用程序。
    c)创建下载目录dl/tar包将下载到这里。
    d) 创建编译目录build_dir/,用户态的工具和应用程序包将被解压或者复制到这里来进行编译。
    e) 创建目标目录build_dir/target-<arch>*/root-<arch>和目标文件系统架构目录,包含最终的根文件系统。
    f) 安装用户态软件包到根文件系统和以适当的格式压缩整个根文件系统。
    最后根文件系统的固件镜像在/bin/<arch>/下生成。
目录结构分析
                            
                      图目录结构图
    1openwrt的基本的目录结构,其中白色部分是直接下载源码就有的源目录,蓝色部分则是通过make之后产生的目录(其中feeds目录则是通过命令./scripts/feeds update -a;./scripts/feeds install -a之后安装的扩展包目录,这个目录将所有的文件链接到package/feeds/中去了)
       a)  tooltoolchain目录:是编译固件image,获取内核头文件,二进制编译器和调试器,c库文件,需要用到的通用工具。
      b)  include目录:编译时的头文件索引,源码包就有。是一些编译用的通用脚本和include宏定义。比较重要的包括:package.mk文件(几乎每个package目录中的模块的makefile中都提到它)
      c) scripts目录:openwrt的包进行管理的perl脚本,源码包就有。存放各类脚本的目录,比如:feeds脚本,使用.scripts/feeds update -a或者.scripts/feeds install -a,就可以对feeds.conf.default中列举的文件进行处理了。
      d)  target目录:包含了特定平台的文件,固件镜像和内核构建过程的索引,以及生成编译器个编译工具。其中linux目录下为各个平台<arch>的相应的内核patches,配置文件等,imagebuilder目录则扫描如何生成这个平台的固件。源码包就有的。用来指导如何编译firmware和内核,以及sdk
      e) package目录和feeds目录:在openwrt中,基础的软件包目录为package,扩展的软件包在feeds中,feeds中的软件扩展了openwrt的基本功能,它将所有的软件链接到package/feeds中。这些软件大多数都是编译成.ipk格式的。这里面有内核模块文件。有各种软件的源码,以及patch文件和Makefile用来下载源码的。源码包就有。里面是随openwrt主版本就提供的包。除了用户态的N多模块外,还有kernel目录,用来定义内核模块(feeds目录:make之后的新增目录。里面存放的就是按照feeds.conf.default文件中列举的要处理的文件,所展开得到的目录。目录中存放的东西,和package目录中大致相似。指导如何下载和编译对应模块的)。
      f) dl目录:编译工具,目标,package所需要的软件包将从网上下载放到dl目录中
      g)  build_dir目录:一个临时目录,用来将所有需要编译的软件源码放到这个目录中进行编译。它包括一下三个目录:
      build_dir/host:  与编译目标无关的工具的临时文件夹
           build_dir/<arch>*: 作为所有目标,package编译的临时目录
          build_dir/toolchain-<arch>*:  编译特定体系的交叉编译链的
                               文件夹
            
     h) staging_dir目录:用于存放构建目标系统镜像的工具软件,包括:
       staging_dir/host:  宿主系统使用的工具
            staging_dir/<arch>*:  目标系统使用的软件软件包
            staging_dir/<toolchain-<arch>*: 交叉编译工具链
       目录的作用是:build_dir是编译的地方,那么这里就是把build_dir的结果放在了staging_dir目录了。
     i) bin目录:make之后的新增目录,用来存放make的结果。比如我是用来编译ramips的,则此目录中会有:ramips子目录,其中又包含:packages子目录(里面含有各种.ipk文件,以及一个Packages文件用来介绍此目录中的每个ipk文件)和可以烧入路由器的***.bin固件。
      其他文件:
     j)  Makefile文件:make命令的总入口
     k)  rules.mk文件:定义了一系列在make时使用的规则
      l) .config隐藏文件makemenuconfig后的保存的配置文件。  
   m).config.old隐藏文件:老的.config文件
0 0