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

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/
11 make 步骤分析
      简单来说 , 一旦 OpenWrt buildroot 已正确配置 , 如指定目标平台和体系结构 , 用户空间包已经选择等 , OpenWrt buildroot 会通过以下步骤编译镜像 ( 一旦配置完成 )
    a)  下载交叉编译工具,内核头文件等。
    b) 建立 staging_dir/ 目录,这个目录是交叉编译工具链将被安装的地方,如果你想使用相同的交叉编译工具链用作其他目的,比如编译第三方应用程序,你可以找到在这个目录下找到交叉编译工具,然后使用 arch-linux-gcc  编译你的应用程序。
    c) 创建下载目录 dl/ tar 包将下载到这里。
    d)  创建编译目录 build_dir/ ,用户态的工具和应用程序包将被解压或者复制到这里来进行编译。
    e)  创建目标目录 build_dir/target-*/root- 和目标文件系统架构目录,包含最终的根文件系统。
    f)  安装用户态软件包到根文件系统和以适当的格式压缩整个根文件系统。
     最后根文件系统的固件镜像在 /bin// 下生成。
目录结构分析
                             
                      图 目录结构图
     1 openwrt 的基本的目录结构,其中白色部分是直接下载源码就有的源目录,蓝色部分则是通过 make 之后产生的目录(其中 feeds 目录则是通过命令 ./scripts/feeds update -a;./scripts/feeds install -a 之后安装的扩展包目录,这个目录将所有的文件链接到 package/feeds/ 中去了)
        a)  tool toolchain 目录: 是编译固件 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 目录下为各个平台 的相应的内核 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/*:  作为所有目标, package 编译的临时目录
          build_dir/toolchain-*:   编译特定体系的交叉编译链的
                                文件夹
            
     h) staging_dir 目录: 用于存放构建目标系统镜像的工具软件,包括:
       staging_dir/host:   宿主系统使用的工具
            staging_dir/*:   目标系统使用的软件软件包
            staging_dir/*:  交叉编译工具链
        目录的作用是: 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 文件

你可能感兴趣的:(路由器openWRT)