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-<arch>*/root-<arch>
和目标文件系统架构目录,包含最终的根文件系统。
f)
安装用户态软件包到根文件系统和以适当的格式压缩整个根文件系统。
最后根文件系统的固件镜像在
/bin/<arch>/
下生成。
二. 目录结构分析
图
1
目录结构图
图
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
目录下为各个平台
<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
文件