OpenWRT 编译过程

 

 

一、使用Ubuntu编译OpenWRT源码

第一步:安装基础软件

sudo apt-get install subversion g++ zlib1g-dev build-essential git python rsync man-db
sudo apt-get install libncurses5-dev gawk gettext unzip file libssl-dev wget zip time

 

第二步:克隆代码

git clone https://git.openwrt.org/openwrt/openwrt.git/
或者分支 https://github.com/lede-project/source.git cd openwrt ./scripts/feeds update -a // 更新最新的包 ./scripts/feeds install -a // 下载所有安装所有包 目录 package/feeds/
# 使用feeds.conf.default 默认配置进行软件包的更新与安装

make defconfig // 检查编译工具是否全,生成.config文件
make menuconfig // 打开编译菜单

 

解释 

OpenWRT Feed 机制

参考文档: https://openwrt.org/docs/guide-developer/feeds

在Openwrt系统中,“feed”是一系列的软件包,这些软件包需要通过一个统一的接口地址进行访问。

“feed”软件包中的软件包可能分布在远程服务器上、在svn上、在本地文件系统中或者其他的地方,

用户可以通过一种支持feed机制的协议,通过同一个地址进行访问。

 

第三步:配置

Target System - 表示目标机器CPU型号

Target Profile - 表示目标机器设备型号

 

第四步:编译

make V=99    // V = verbose 全部都显示

 

解释 

clean 命令

make clean      # rm -rf bin  build_dir

make dirclean  # rm -rf bin build_dir staging_dir toolchain logs 

make distclean # 删除以上所有文件 , dl 和 .config

 

对于特定组件进行clean

make target/linux/clean V=s

make package/luci/clean

 

 

 

二、OpenWRT BuildRoot 环境

OpenWRT 源码是由一堆makefile 和 补丁组成的,源代码中不包括任何的源代码或内核代码,使用脚本与

makefile来定义需要下载哪些文件与打上补丁。

代码结构如下

 

tools - 包含了从网上下载编译OpenWRT所有的编译工具

toolchain - 包含了 kernel 头文件,C库,binutils, debugger等

target - 包含了特定平台的文件,固件镜像和内核构建过程的索引,以及生成编译器个编译工具。

            其中linux目录下为各个平台<arch>的相应的内核patches,

            配置文件等,imagebuilder目录则扫描如何生成这个平台的固件。源码包就有的。

            用来指导如何编译firmware和内核,以及sdk。

package - 在openwrt中,基础的软件包目录为package,扩展的软件包在feeds中,feeds中的软件扩展了openwrt的基本功能,

                 它将所有的软件链接到package/feeds中。这些软件大多数都是编译成.ipk格式的。这里面有内核模块文件。

                 有各种软件的源码,以及patch文件和Makefile用来下载源码的。源码包就有。里面是随openwrt主版本就提供的包。

                 除了用户态的N多模块外,还有kernel目录,用来定义内核模块

feeds -  make之后的新增目录。里面存放的就是按照feeds.conf.default文件中列举的要处理的文件,所展开得到的目录。

             目录中存放的东西,和package目录中大致相似。指导如何下载和编译对应模块的)。

scripts - Perl脚本管理OpenWRT包的安装与卸载

dl - 编译工具,目标,package所需要的软件包将从网上下载放到dl目录中
build_dir - 一个临时目录,用来将所有需要编译的软件源码放到这个目录中进行编译。它包括一下三个目录:
                 build_dir/host:  与编译目标无关的工具的临时文件夹
                 build_dir/<arch>*: 作为所有目标,package编译的临时目录
                 build_dir/toolchain-<arch>*:  编译特定体系的交叉编译链的文件夹
         
staging_dir - 用于存放构建目标系统镜像的工具软件,包括:
                     staging_dir/host:  宿主系统使用的工具
                     staging_dir/<arch>*:  目标系统使用的软件软件包
                     staging_dir/<toolchain-<arch>*: 交叉编译工具链
                     目录的作用是:build_dir是编译的地方,那么这里就是把build_dir的结果放在了staging_dir目录了。
 
bin目录 - make之后的新增目录,用来存放make的结果。
               比如我是用来编译ramips的,则此目录中会有:ramips子目录,其中又包含:
               packages子目录(里面含有各种.ipk文件,以及一个Packages文件用来介绍此目录中的每个ipk文件)和可以烧入路由器的***.bin固件。
 
Makefile文件:make命令的总入口
rules.mk文件:定义了一系列在make时使用的规则
.config隐藏文件:makemenuconfig后的保存的配置文件。  
.config.old隐藏文件:老的.config文件

 

简言之,编译过程如下:

1. 下载交叉编译工具,内核头文件,C库等。

2. 设置 staging_dir 目录,交叉编译的toolchain会安装到这里。

3. 创建 dl 目录, 所有的第三方源码包会被下载到这里

4. 创建build_dir目录, 用户态工具会被编译到这里

5. 创建 build_dir/target-arch/root 和 目标平台根文件系统

6. 在根文件系统中安装所有包,最后生成的镜象会在bin/目录中

 

手动编译过程如下

make download 下载所有已选择的软件代码压缩包

1. make tools/install

2. make toolchain/install

3. make target/compile

4. make package/cleanup

5. make package/compile   # 编译包

6. make package/install      #  安装包

7. make package/preconfig

8. make target/install

9. make package/index

 

单独编译软件包

make package/tcpdump/clean  清除编译生成的文件

make package/tcpdump/prepare 进行编译准备

make package/tcpdump/configure  根据设置选项进行配置并生成Makefile

make package/tcpdump/compile   根据生成的Makefile进行编译

make package/tcpdump/install  生成安装包

 

 

 

三、OpenWRT In Qemu

1. 配置编译文件

make menuconfig

 

Target System -  选择 MIPS Malta CoreLV board(qemu)

Subtarget - Little Endian

Target Profile - Default

Target Image - 选择 ext4

Global Build Settings - 默认即可

 

2. 编译 make V=99

 

3. 编译完成后,在目录 bin/target/下有一个malta目录

ubuntu:~/openwrt/bin/targets/malta/le$ ls -l
total 272708
-rw-r--r-- 1 ubuntu ubuntu       329 Sep 10 13:39 config.seed
-rw-r--r-- 1 ubuntu ubuntu      1959 Sep 10 13:59 openwrt-malta-le-default.manifest
-rw-r--r-- 1 ubuntu ubuntu 268435456 Sep 10 13:59 openwrt-malta-le-root.ext4
-rw-r--r-- 1 ubuntu ubuntu   2727322 Sep 10 13:59 openwrt-malta-le-uImage-gzip
-rw-r--r-- 1 ubuntu ubuntu   1940771 Sep 10 13:59 openwrt-malta-le-uImage-lzma
-rwxr-xr-x 1 ubuntu ubuntu   6125260 Sep 10 13:59 openwrt-malta-le-vmlinux.elf
drwxr-xr-x 2 ubuntu ubuntu      4096 Sep 10 13:59 packages
-rw-r--r-- 1 ubuntu ubuntu       556 Sep 10 14:00 sha256sums
ubuntu:~/openwrt/bin/targets/malta/le$ 

 

 

4. 拷贝 openwrt-malta-le-root.ext4 与 openwrt-malta-le-vmlinux.elf 文件

 

5.  安装软件

sudo apt-get install qemu-kvm qemu virt-manager virt-viewer libvirt-bin

 

6. 运行

sudo qemu-system-mipsel -M malta -hda openwrt-malta-le-root.ext4 -kernel openwrt-malta-le-vmlinux.elf -nographic -append "root=/dev/sda console=tty50"

 

posted @ 2018-07-23 11:49  elewei  阅读(17566)  评论(0编辑  收藏  举报