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包的安装与卸载
简言之,编译过程如下:
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"