Openwrt 初探

最近想研究一下Openwrt,于是开始搭建openwrt环境,虽然现在没有现成的板子,但是

可以先编译起来。

看了别人的帖子,都推荐使用svn从官网下载源码,

svn co svn://svn.openwrt.org/openwrt/trunk/

但是实际测试发现它的速度太慢了,为了得到官方的源码,从github上找到了它:

https://github.com/openwrt-mirror/openwrt

将它下载下来之后,要安装一些必要的包来编译它,我使用的是ubuntu12.04.

sudo apt-get install flex g++ gawk zlib1g-dev libncurses5-dev libssl-dev subversion

先看一下它的目录树:

tree -d -L 2
.
├── config
├── docs
├── include
│   └── site
├── package
│   ├── base-files
│   ├── boot
│   ├── devel
│   ├── firmware
│   ├── kernel
│   ├── libs
│   ├── network
│   ├── system
│   └── utils
├── scripts
│   ├── config
│   └── flashing
├── target
│   ├── imagebuilder
│   ├── linux
│   ├── sdk
│   └── toolchain
├── toolchain
│   ├── binutils
│   ├── gcc
│   ├── gdb
│   ├── glibc
│   ├── insight
│   ├── kernel-headers
│   ├── musl
│   ├── uClibc
│   └── wrapper
└── tools
    ├── autoconf
    ├── automake
    ├── b43-tools
    ├── bc
    ├── bison
    ├── ccache
    ├── cloog
    ├── cmake
    ├── dosfstools
    ├── e2fsprogs
    ├── elftosb
    ├── findutils
    ├── firmware-utils
    ├── flex
    ├── flock
    ├── genext2fs
    ├── gengetopt
    ├── gmp
    ├── include
    ├── libelf
    ├── libtool
    ├── lzma
    ├── lzma-old
    ├── m4
    ├── missing-macros
    ├── mkimage
    ├── mklibs
    ├── mm-macros
    ├── mpc
    ├── mpfr
    ├── mtd-utils
    ├── mtools
    ├── padjffs2
    ├── patch
    ├── patchelf
    ├── patch-image
    ├── pkg-config
    ├── ppl
    ├── qemu
    ├── quilt
    ├── scons
    ├── sed
    ├── sparse
    ├── squashfs
    ├── squashfs4
    ├── sstrip
    ├── upslug2
    ├── upx
    ├── wrt350nv2-builder
    ├── xz
    └── yaffs2

首先是更新一下feed:

./scripts/feeds update -a
./scripts/feeds install -a

这里的-a表示更新所有的feed,那么这里有哪些feed呢,可以从log里面看出来:

[email protected]:~/openwrt-git/openwrt$ scripts/feeds update -a
Updating feed ‘packages‘ from ‘https://github.com/openwrt/packages.git‘ ...
Cloning into ‘./feeds/packages‘...
remote: Counting objects: 3682, done.
remote: Compressing objects: 100% (2941/2941), done.
remote: Total 3682 (delta 488), reused 3055 (delta 247), pack-reused 0
Receiving objects: 100% (3682/3682), 2.00 MiB | 24 KiB/s, done.
Resolving deltas: 100% (488/488), done.
Create index file ‘./feeds/packages.index‘
Collecting package info: done
Collecting target info: done
Updating feed ‘luci‘ from ‘https://github.com/openwrt/luci.git‘ ...
Cloning into ‘./feeds/luci‘...
remote: Counting objects: 11683, done.
remote: Compressing objects: 100% (6278/6278), done.
remote: Total 11683 (delta 3832), reused 9770 (delta 2394), pack-reused 0
Receiving objects: 100% (11683/11683), 8.42 MiB | 85 KiB/s, done.
Resolving deltas: 100% (3832/3832), done.
Create index file ‘./feeds/luci.index‘
Collecting package info: done
Collecting target info: done
Updating feed ‘routing‘ from ‘https://github.com/openwrt-routing/packages.git‘ ...
Cloning into ‘./feeds/routing‘...
remote: Counting objects: 441, done.
remote: Compressing objects: 100% (343/343), done.
Receiving objects: 100% (441/441), 242.46 KiB | 58 KiB/s, done.
remote: Total 441 (delta 81), reused 330 (delta 38), pack-reused 0
Resolving deltas: 100% (81/81), done.
Create index file ‘./feeds/routing.index‘
Collecting package info: done
Collecting target info: done
Updating feed ‘telephony‘ from ‘https://github.com/openwrt/telephony.git‘ ...
Cloning into ‘./feeds/telephony‘...
remote: Counting objects: 268, done.
remote: Compressing objects: 100% (222/222), done.
remote: Total 268 (delta 51), reused 211 (delta 22), pack-reused 0
Receiving objects: 100% (268/268), 140.49 KiB | 102 KiB/s, done.
Resolving deltas: 100% (51/51), done.
Create index file ‘./feeds/telephony.index‘
Collecting package info: done
Collecting target info: done
Updating feed ‘management‘ from ‘https://github.com/openwrt-management/packages.git‘ ...
Cloning into ‘./feeds/management‘...
remote: Counting objects: 40, done.
remote: Compressing objects: 100% (28/28), done.
remote: Total 40 (delta 7), reused 27 (delta 2), pack-reused 0
Unpacking objects: 100% (40/40), done.
Create index file ‘./feeds/management.index‘
Collecting package info: done
Collecting target info: done
Updating feed ‘targets‘ from ‘https://github.com/openwrt/targets.git‘ ...
Cloning into ‘./feeds/targets‘...
remote: Counting objects: 137, done.
remote: Compressing objects: 100% (95/95), done.
remote: Total 137 (delta 17), reused 122 (delta 16), pack-reused 0
Receiving objects: 100% (137/137), 130.80 KiB | 44 KiB/s, done.
Resolving deltas: 100% (17/17), done.
Create index file ‘./feeds/targets.index‘
Collecting package info: done
Collecting target info: done

可以从上面的网址看出来更新的feed。

更新feed后目录树的变化:

.
├── config
├── docs
├── feeds
│   ├── luci
│   ├── luci.tmp
│   ├── management
│   ├── management.tmp
│   ├── packages
│   ├── packages.tmp
│   ├── routing
│   ├── routing.tmp
│   ├── targets
│   ├── targets.tmp
│   ├── telephony
│   └── telephony.tmp
├── include
│   └── site
├── package
│   ├── base-files
│   ├── boot
│   ├── devel
│   ├── feeds
│   ├── firmware
│   ├── kernel
│   ├── libs
│   ├── network
│   ├── system
│   └── utils
├── scripts
│   ├── config
│   └── flashing
├── staging_dir
│   └── host
├── target
│   ├── imagebuilder
│   ├── linux
│   ├── sdk
│   └── toolchain
├── tmp
│   └── info
├── toolchain
│   ├── binutils
│   ├── gcc
│   ├── gdb
│   ├── glibc
│   ├── insight
│   ├── kernel-headers
│   ├── musl
│   ├── uClibc
│   └── wrapper
└── tools
    ├── autoconf
    ├── automake
    ├── b43-tools
    ├── bc
    ├── bison
    ├── ccache
    ├── cloog
    ├── cmake
    ├── dosfstools
    ├── e2fsprogs
    ├── elftosb
    ├── findutils
    ├── firmware-utils
    ├── flex
    ├── flock
    ├── genext2fs
    ├── gengetopt
    ├── gmp
    ├── include
    ├── libelf
    ├── libtool
    ├── lzma
    ├── lzma-old
    ├── m4
    ├── missing-macros
    ├── mkimage
    ├── mklibs
    ├── mm-macros
    ├── mpc
    ├── mpfr
    ├── mtd-utils
    ├── mtools
    ├── padjffs2
    ├── patch
    ├── patchelf
    ├── patch-image
    ├── pkg-config
    ├── ppl
    ├── qemu
    ├── quilt
    ├── scons
    ├── sed
    ├── sparse
    ├── squashfs
    ├── squashfs4
    ├── sstrip
    ├── upslug2
    ├── upx
    ├── wrt350nv2-builder
    ├── xz
    └── yaffs2

然后使用:

make menuconfig
make

编译的过程会持续好几个小时,因为编译的时候还需要在线下载工具包,如果网络慢的话就会

更慢了。

关于make的作用,README是这样说的:

Simply running "make" will build your firmware.
It will download all sources, build the cross-compile toolchain,
the kernel and all choosen applications.

中文手册是这样说的:

OpenWrt选择了另一种方式来生成固件:下载,打补丁,编译,一切从零开始,即使交叉编译链也是如此。

一开始下载openwrt源码的时候,也就大约300MB,但是里面基本上没有代码,大部分

都是配置文件。

openwrt的英文文档如下:

https://downloads.openwrt.org/kamikaze/docs/openwrt.html

在编译过程中,使用make -j V=99 可以加快编译速度,并且显示所有信息,

在编译的时候,我的swap被占满,并且报错,可能是因为屏幕上刷的太快导致的:

virtual memory exhaustedvirtual memory exhausted

不打开V=99的情况下,我的编译log如下:

[email protected]:~/openwrt$ make -j4
 make[1] world
 make[2] target/compile
 make[2] package/cleanup
 make[3] -C target/linux compile
 make[2] package/compile
 make[3] -C package/system/opkg host-compile
 make[3] -C package/libs/toolchain compile
 make[3] -C package/kernel/gpio-button-hotplug compile
 make[3] -C package/libs/ncurses host-compile
 make[3] -C package/libs/libnl-tiny compile
 make[3] -C package/utils/lua compile
 make[3] -C package/libs/libjson-c compile
 make[3] -C package/libs/lzo compile
 make[3] -C package/libs/zlib compile
 make[3] -C package/libs/ncurses compile
 make[3] -C package/boot/uboot-ar71xx compile
 make[3] -C package/firmware/linux-firmware compile
 make[3] -C package/libs/ocf-crypto-headers compile
 make[3] -C package/network/utils/iw compile
 make[3] -C package/network/services/dropbear compile
 make[3] -C package/libs/libpcap compile
 make[3] -C package/network/utils/linux-atm compile
 make[3] -C package/network/utils/resolveip compile
 make[3] -C package/utils/busybox compile
 make[3] -C package/libs/libubox compile
 make[3] -C package/utils/util-linux compile
 make[3] -C package/kernel/linux compile
 make[3] -C package/libs/openssl compile
 make[3] -C package/system/ubus compile
 make[3] -C package/system/uci compile
 make[3] -C package/utils/jsonfilter compile
 make[3] -C package/system/mtd compile
 make[3] -C package/system/opkg compile
 make[3] -C package/network/config/netifd compile
 make[3] -C package/system/ubox compile
 make[3] -C package/utils/ubi-utils compile
 make[3] -C package/network/services/hostapd compile
 make[3] -C package/network/config/swconfig compile
 make[3] -C package/network/services/odhcpd compile
 make[3] -C package/network/utils/iwinfo compile
 make[3] -C package/system/procd compile
 make[3] -C package/system/fstools compile
 make[3] -C package/base-files compile
 make[3] -C package/boot/uboot-envtools compile
 make[3] -C package/kernel/mac80211 compile
 make[3] -C package/network/utils/iptables compile
 make[3] -C package/network/services/dnsmasq compile
 make[3] -C package/network/ipv6/odhcp6c compile
 make[3] -C package/network/services/ppp compile
 make[3] -C package/network/config/firewall compile
 make[2] package/install
 make[3] package/preconfig
 make[2] target/install
 make[3] -C target/linux install
 make[2] package/index

最终会生成下面的文件(在bin文件夹内):

由于我使用默认的配置,生成的文件太多,这里只给一个部分的截图

初次下载源代码,会比较理解openwrt的架构和编译过程,下面做一下简要的分析:

openwrt是基于linux kernel的,并且使用uclibc作为c库。

注意到编译过程中生成了三个文件夹,那么他们分别是干什么的呢?

dl

build_dir

staging_dir

dl是在编译的时候下载文件的目录,这些文件都是编译所需要的,下面是它们的的一部分:

├── ath10k-firmware-da0f85d924226ee30c46e037120621c9e192b39e.tar.bz2
├── autoconf-2.69.tar.xz
├── automake-1.15.tar.xz
├── bc-1.06.95.tar.bz2
├── binutils-linaro-2.24.0-2014.09.tar.xz
├── bison-3.0.2.tar.xz
├── broadcom-wl-4.150.10.5.tar.bz2
├── broadcom-wl-5.100.138.tar.bz2
├── busybox-1.23.2.tar.bz2
├── cmake-2.8.12.2.tar.gz
├── compat-wireless-2015-03-09.tar.bz2
├── dnsmasq-2.72.tar.gz
├── dropbear-2014.65.tar.bz2
├── e2fsprogs-1.42.8.tar.gz
├── findutils-4.4.2.tar.gz
├── firewall-2015-02-26-165029cb8c0f1545628f44143aec965e64cef021.tar.gz
├── flex-2.5.39.tar.bz2
├── fstools-2015-03-30-a5fa5b6144253726dcd7e769197eed787a723f5f.tar.gz
├── gcc-linaro-4.8-2014.04.tar.xz
├── gdb-linaro-7.6-2013.05.tar.bz2
├── genext2fs-1.4.1.tar.gz
├── gengetopt-2.22.6.tar.gz
├── gmp-5.1.3.tar.xz
├── hostapd-2015-03-25.tar.bz2
├── iptables-1.4.21.tar.bz2
├── ipw2100-fw-1.3.tgz
├── ipw2200-fw-3.1.tgz
├── iw-3.17.tar.xz
├── json-c-0.12.tar.gz
├── jsonfilter-2014-06-19-cdc760c58077f44fc40adbbe41e1556a67c1b9a9.tar.gz
├── libelf-0.8.13.tar.gz
├── libiwinfo-2015-03-23-40f2844fadc05f4a4de7699dbc12fee295b7057b.tar.gz
├── libpcap-1.5.3.tar.gz
├── libtool-2.4.tar.gz
├── libubox-2015-03-22-b8d9b382e39823850331edc2a92379173daf1be3.tar.gz
├── linux-3.18.10.tar.xz
├── linux-atm-2.5.2.tar.gz
├── linux-firmware-2015-03-20-f404336ba808cbd57547196e13367079a23b822c.tar.bz2
├── lua-5.1.5.tar.gz

注意到,这些都是从网上下载的,要注意保留,以后编译的时候就不用上网下载了。

build_dir的作用就是存放上述这些压缩包的解压路径,也就是说,dl的包会解压到build_dir里面,

并且编译这些包。

其中,这里有三个目录:

[email protected]:~/openwrt$ tree build_dir/ -d -L 1
build_dir/
├── host
├── target-mips_34kc_uClibc-0.9.33.2
└── toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2

host目录是解压dl下面的包并且编译用的,其中编译好的程序只用于编译的主机

target目录是为目标主机编译用的,可以在目录上看到CPU的架构和所用的c库

toolchain是用来编译交叉编译器的,其中也包含linux kernel

在staging_dir下面可以看到类似的三个目录:

[email protected]:~/openwrt$ tree staging_dir/ -d -L 1
staging_dir/
├── host
├── target-mips_34kc_uClibc-0.9.33.2
└── toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2

host目录下是一个编译出来的linux kernel目录树,和一般linux发行版的/ 目录类似,存放了一些编译主机上的一些工具

target 目录主要存放编译出来的firmware,是给目标机器用的

toolchain目录是一个编译出来的linux kernel目录树,包含了交叉编译器,你可以在里面写一个简单的c文件,并且使用交叉编译器编译它,

生成的程序可以在目标机器上运行。

这里有编译过程的大体介绍:

http://wiki.openwrt.org/doc/howto/build

openwrt是一个高度定制版的buildroot,官网有它的介绍:

http://wiki.openwrt.org/about/toolchain

使用这个系统,可以基本做到全自动的编译过程。

bin目录下面的文件粗看可以分为两类:

openwrt-ar71xx-generic-a02-rb-w300n-squashfs-factory.bin
openwrt-ar71xx-generic-a02-rb-w300n-squashfs-sysupgrade.bin

其中这两个的区别是(转自http://see.sl088.com/wiki/Openwrt_factory%E5%9B%BA%E4%BB%B6/%E4%B8%BA%E4%BD%95%E5%85%88%E5%88%B7factory):

factory是用来从原厂固件升级到openwrt用的。 sysupgrade是用来给openwrt升级用的

无论你是升级还是从官方方刷openwrt,openwrt-XXXXXXX-factory.bin的固件都是适用的。 而openwrt-XXXXXXX-sysupgrade.bin.固件只能用来升级用。如TTL救砖就不能用sysupgrade的固件。

其中这里又进一步说明了:

http://www.cnblogs.com/siikee/p/4224086.html

实际上bin下面还有其他东西,现在现有个大体的认识,后面再搞懂bootloader,ipk和代码架构这些概念

时间: 2024-10-26 04:42:52

Openwrt 初探的相关文章

Openwrt Image Builder/SDK 初探

image builder和SDK既可以从官网上下载,又可以自己进行编译(make menuconfig).官网上下载的是预先帮你编译好的,这样可以大量节省自己编译源码花的时间,这两个东西相当于半成品,最后的东西还是要你自己生成的.开发流程如下: 在编译时将image builder和sdk这两项勾上之后,它们就可以被编译出来的.当然也可以从官网下载,不过官网编译出来的包只支持X64 最下面两个就是Image builder和SDK. 然后将它们分别解压,名字太长了,改的短一点: 这里的目录和O

OpenWrt 系统日志之logread

前言 刚开始接触OpenWrt的时候,根本不知道如何调试各个进程,我之前从事IP Camera开发可能也局限了我的知识面,认为系统就改是那个样子. 其实不然,就像Linux发行版那样,他们都有各自都管理系统,同一个的消息通知系统,dbus和ubus这些.系统调试也是一样dmesg, 现在还接触到了logread. 初探 logread是在调试luci的时候用到的,极其方便,对于不太了解OpenWrt系统构成对人尤甚. 这个需要写进程对人对syslogd提供支持,否则说来知识惘然,我们需要做系统,

进阶之初探nodeJS

一.前言 在"初探nodeJS"随笔中,我们对于node有了一个大致地了解,并在最后也通过一个示例,了解了如何快速地开启一个简单的服务器. 今儿,再次看了该篇随笔,发现该随笔理论知识稍多,适合初级入门node,固萌生一个想法--想在该篇随笔中,通过一步步编写一个稍大一点的node示例,让我们在整体上更加全面地了解node. so,该篇随笔是建立在"初探nodeJS"之上的,固取名为"进阶之初探nodeJS". 好了,侃了这多,那么我们即将实现一个

从273二手车的M站点初探js模块化编程

前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数据. 273这个M站点是产品推荐我看的.第一眼看这个产品时我就再想他们这个三次加载和翻页按钮的方式,那么小分页的pageIndex是怎么计算的.所以就顺便看了下源码. 提到看源码时用到了Chrome浏览器的格式化工具(还是朋友推荐我的,不过这个格式化按钮的确不明显,不会的话自行百度). 三次加载和分

[转载]HDFS初探之旅

转载自 http://www.cnblogs.com/xia520pi/archive/2012/05/28/2520813.html , 感谢虾皮工作室这一系列精彩的文章. Hadoop集群(第8期)_HDFS初探之旅 1.HDFS简介 HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开发的,可以运行于廉价的商用服务器上.它所具有的高容错.高可靠性.高可扩展性.高

MongoDB初探系列之二:认识MongoDB提供的一些常用工具

在初探一中,我们已经可以顺利的将MongoDB在我们自己的机器上跑起来了.但是在其bin目录下面还有一些我们不熟知的工具.接下来,将介绍一下各个小工具的用途以及初探一中MongoDB在data文件夹下创建的文件的用途. 1.bin目录下面的各种小工具简介及使用方式 bsondump.exe 用于将导出的BSON文件格式转换为JSON格式mongo.exe mongoDB的客户端 mongod.exe 用于启动mongoDB的Server mongodump.exe 用于从mongodb数据库中导

OpenWrt学习目标

最近在研究OpenWrt,总感觉这一看一点那也了解一点,没有目的,也没有重心. 这里,给自己拟定一个目标,就朝着这个目标去学. 目标:在OpenWrt上开发服务器软件,该软件可以通过LuCI进行控制,并能提供网络接口,使用户可以通过手机对其进行操控. 要掌握的技能点: 掌握OpenWrt的裁剪,熟悉裁剪编译的原理.掌握基本的系统配置技能. 能编在OpenWrt上运行的程序.并能在OpenWrt上通过gdb进行调试.(重点) 掌握uhttpd的配置,与LuCI的工作原理.能根据需求设计网页界面.使

编译OpenWRT时报gconvert.c错误解决方法

我在第一次编译OpenWRT时,出现如下错误提示: gconvert.c:66:2: error: #error GNU libiconv not in use but included iconv.h is from libiconv 我在网上找解决方案,结果一致地都是说,重新 ./configure 一下: ./configure --enable-iconv=no --with-libiconv=gnu make 可问题的关键是:OpenWRT的trunk路径下没见有个 configure

MIPS平台OpenWrt路由器系统内的Rust应用程序开发

作者:Liigo(庄晓立) 日期:2014年9月17日 原创链接:http://blog.csdn.net/liigo/article/details/39347541 版权所有,转载请注明出处:http://blog.csdn.net/liigo 目标 使用 Rust 语言,交叉编译开发 MIPS(el) + OpenWrt 路由器平台下的应用软件. 编译rustc 首先自行编译Rust编译器源代码,生成支持 mipsel-linux 平台的交叉编译器rustc ./configure --t