zoukankan      html  css  js  c++  java
  • 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"

  • 相关阅读:
    【SpringFramework】Spring 事务控制
    Mini 学生管理器
    方法的重写override,重载overload。
    方法封装,属性调用以及设置。
    判断hdfs文件是否存在
    模拟(删除/远程拷贝)当前一周的日志文件
    2.上传hdfs系统:将logs目录下的日志文件每隔十分钟上传一次 要求:上传后的文件名修为:2017111513xx.log_copy
    使用定时器:在logs目录,每两分钟产生一个文件
    五个节点的hadoop集群--主要配置文件
    hadoop集群配置文件与功能对应解析
  • 原文地址:https://www.cnblogs.com/elewei/p/9353908.html
Copyright © 2011-2022 走看看