Openwrt 初探
最近想研究一下Openwrt,于是开始搭建openwrt环境,虽然现在没有现成的板子,但是
可以先编译起来。
openwrt的特点是基于下载 -> patch -> 编译 的一个工作模式,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
.
├── 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里面看出来:
tan@love:~/openwrt-git/openwrt$ scripts/feeds update -a
Updating feed 'packages' from 'https://github.com/openwrt/packages.git' ...
Cloning into './feeds/packages'...
remote: Counting objects: , done.
remote: Compressing objects: % (/), done.
remote: Total (delta ), reused (delta ), pack-reused
Receiving objects: % (/), 2.00 MiB | KiB/s, done.
Resolving deltas: % (/), 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: , done.
remote: Compressing objects: % (/), done.
remote: Total (delta ), reused (delta ), pack-reused
Receiving objects: % (/), 8.42 MiB | KiB/s, done.
Resolving deltas: % (/), 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: , done.
remote: Compressing objects: % (/), done.
Receiving objects: % (/), 242.46 KiB | KiB/s, done.
remote: Total (delta ), reused (delta ), pack-reused
Resolving deltas: % (/), 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: , done.
remote: Compressing objects: % (/), done.
remote: Total (delta ), reused (delta ), pack-reused
Receiving objects: % (/), 140.49 KiB | KiB/s, done.
Resolving deltas: % (/), 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: , done.
remote: Compressing objects: % (/), done.
remote: Total (delta ), reused (delta ), pack-reused
Unpacking objects: % (/), 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: , done.
remote: Compressing objects: % (/), done.
remote: Total (delta ), reused (delta ), pack-reused
Receiving objects: % (/), 130.80 KiB | KiB/s, done.
Resolving deltas: % (/), 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如下:
tan@ubuntu:~/openwrt$ make -j4
make[] world
make[] target/compile
make[] package/cleanup
make[] -C target/linux compile
make[] package/compile
make[] -C package/system/opkg host-compile
make[] -C package/libs/toolchain compile
make[] -C package/kernel/gpio-button-hotplug compile
make[] -C package/libs/ncurses host-compile
make[] -C package/libs/libnl-tiny compile
make[] -C package/utils/lua compile
make[] -C package/libs/libjson-c compile
make[] -C package/libs/lzo compile
make[] -C package/libs/zlib compile
make[] -C package/libs/ncurses compile
make[] -C package/boot/uboot-ar71xx compile
make[] -C package/firmware/linux-firmware compile
make[] -C package/libs/ocf-crypto-headers compile
make[] -C package/network/utils/iw compile
make[] -C package/network/services/dropbear compile
make[] -C package/libs/libpcap compile
make[] -C package/network/utils/linux-atm compile
make[] -C package/network/utils/resolveip compile
make[] -C package/utils/busybox compile
make[] -C package/libs/libubox compile
make[] -C package/utils/util-linux compile
make[] -C package/kernel/linux compile
make[] -C package/libs/openssl compile
make[] -C package/system/ubus compile
make[] -C package/system/uci compile
make[] -C package/utils/jsonfilter compile
make[] -C package/system/mtd compile
make[] -C package/system/opkg compile
make[] -C package/network/config/netifd compile
make[] -C package/system/ubox compile
make[] -C package/utils/ubi-utils compile
make[] -C package/network/services/hostapd compile
make[] -C package/network/config/swconfig compile
make[] -C package/network/services/odhcpd compile
make[] -C package/network/utils/iwinfo compile
make[] -C package/system/procd compile
make[] -C package/system/fstools compile
make[] -C package/base-files compile
make[] -C package/boot/uboot-envtools compile
make[] -C package/kernel/mac80211 compile
make[] -C package/network/utils/iptables compile
make[] -C package/network/services/dnsmasq compile
make[] -C package/network/ipv6/odhcp6c compile
make[] -C package/network/services/ppp compile
make[] -C package/network/config/firewall compile
make[] package/install
make[] package/preconfig
make[] target/install
make[] -C target/linux install
make[] 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..tar.bz2
├── binutils-linaro-2.24.-2014.09.tar.xz
├── bison-3.0..tar.xz
├── broadcom-wl-4.150.10.5.tar.bz2
├── broadcom-wl-5.100..tar.bz2
├── busybox-1.23..tar.bz2
├── cmake-2.8.12.2.tar.gz
├── compat-wireless---.tar.bz2
├── dnsmasq-2.72.tar.gz
├── dropbear-2014.65.tar.bz2
├── e2fsprogs-1.42..tar.gz
├── findutils-4.4..tar.gz
├── firewall----165029cb8c0f1545628f44143aec965e64cef021.tar.gz
├── flex-2.5..tar.bz2
├── fstools----a5fa5b6144253726dcd7e769197eed787a723f5f.tar.gz
├── gcc-linaro-4.8-2014.04.tar.xz
├── gdb-linaro-7.6-2013.05.tar.bz2
├── genext2fs-1.4..tar.gz
├── gengetopt-2.22..tar.gz
├── gmp-5.1..tar.xz
├── hostapd---.tar.bz2
├── iptables-1.4..tar.bz2
├── ipw2100-fw-1.3.tgz
├── ipw2200-fw-3.1.tgz
├── iw-3.17.tar.xz
├── json-c-0.12.tar.gz
├── jsonfilter----cdc760c58077f44fc40adbbe41e1556a67c1b9a9.tar.gz
├── libelf-0.8..tar.gz
├── libiwinfo----40f2844fadc05f4a4de7699dbc12fee295b7057b.tar.gz
├── libpcap-1.5..tar.gz
├── libtool-2.4.tar.gz
├── libubox----b8d9b382e39823850331edc2a92379173daf1be3.tar.gz
├── linux-3.18..tar.xz
├── linux-atm-2.5..tar.gz
├── linux-firmware----f404336ba808cbd57547196e13367079a23b822c.tar.bz2
├── lua-5.1..tar.gz
注意到,这些都是从网上下载的,要注意保留,以后编译的时候就不用上网下载了。
而build_dir
的作用就是存放上述这些压缩包的解压路径,也就是说,dl的包会解压到build_dir
里面,
并且编译这些包。
其中,这里有三个目录:
tan@ubuntu:~/openwrt$ tree build_dir/ -d -L
build_dir/
├── host
├── target-mips_34kc_uClibc-0.9.33.2
└── toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2
host目录是为了编译一些tools用于协助生成openwrt image
target目录是为目标主机编译用的,可以在目录上看到CPU的架构和所用的c库
toolchain是用来编译交叉编译器的
在staging_dir下面可以看到类似的三个目录:
tan@ubuntu:~/openwrt$ tree staging_dir/ -d -L
staging_dir/
├── host
├── target-mips_34kc_uClibc-0.9.33.2
└── toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2
host目录下存放了一些编译主机上的一些工具(tools)
target 目录主要存放编译出来的firmware,是给目标机器用的
toolchain目录包含了交叉编译器,你可以在里面写一个简单的c文件,并且使用交叉编译器编译它,
生成的程序可以在目标机器上运行。
虽然不完全如此,可以将staging_dir的每个文件夹对应理解成build_dir的产物
这里有编译过程的大体介绍:
http://wiki.openwrt.org/doc/howto/build
http://downloads.openwrt.org/docs/buildroot-documentation.html
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文件下还有很多ipk文件,这些文件是opkg包管理系统的文件,在openwrt
运行起来的时候可以使用opkg安装,用起来和debian的deb差不多。
另外,openwrt 官方说了,the bootloader is not part of OpenWrt
http://wiki.openwrt.org/doc/techref/bootloader
而且,bootloader对于每一个路由器都是不一样的,负责将最底层开起来。厂家也不见得会将最底层的
代码开源。
目前有很多卖修改好的openwrt路由器,一个卖点就是不死uboot,就是说
你的firmware不管怎么刷都可以恢复,它包括一个网页接口,可以上传firmware
到路由器上,这样大大方便了openwrt的调试。
openwrt的menuconfig是定制好的,项目在config**.in里面:
最后看看openwrt 的patch系统
package的很多子目录都包含这两个东西,patches 是一些patch,Makefile包含了下载地址和其他的一些信息。
当发现这些用户空间软件出问题的时候,为其加patch就可以了,
实际上linux kernel出问题时,也可以这样类似地对其加一些patch进去。
Openwrt 初探的更多相关文章
- Openwrt Image Builder/SDK 初探
image builder和SDK既可以从官网上下载,又可以自己进行编译(make menuconfig).官网上下载的是预先帮你编译好的,这样可以大量节省自己编译源码花的时间,这两个东西相当于半成品 ...
- 【玩转开源】BananaPi R2 —— 第四篇 Openwrt Luci 初探
什么是Luci呢?先直观的感受一下,打开web浏览器,输入R2的网关地址,然后出现了一个web登录界面,这个就是Openwrt Luci的应用. 那么到底什么是Luci呢?在这里我先给大家一个公式:L ...
- OpenWrt中开启usb存储和samba服务
在从官网安装的WNDR3800 15.05.1版本OpenWrt中, 不带usb存储支持以及samba, 需要另外安装 1. 启用usb支持 USB Basic Support https://wik ...
- 初探领域驱动设计(2)Repository在DDD中的应用
概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...
- (转)利用libcurl和国内著名的两个物联网云端通讯的例程, ubuntu和openwrt下调试成功(四)
1. libcurl 的参考文档如下 CURLOPT_HEADERFUNCTION Pass a pointer to a function that matches the following pr ...
- (转)利用libcurl获取新浪股票接口, ubuntu和openwrt实验成功(三)
1. 利用 CURLOPT_WRITEFUNCTION 设置回调函数, 利用 CURLOPT_WRITEDATA 获取数据指针 官网文档如下 CALLBACK OPTIONS CURLOPT_WRI ...
- (转)linux下和云端通讯的例程, ubuntu和openwrt下实验成功(二)
前言: 上节用纯linux的函数实现了和云端通讯, 本节开始利用传说中的神器libcurl 话说一个网络程序员对书法十分感兴趣,退休后决定在这方面有所建树. 于是花重金购买了上等的文房四宝. 一 ...
- (转)linux下和云端通讯的例程, ubuntu和openwrt实验成功(一)
一. HTTP请求的数据流总结#上传数据, yeelink的数据流如下POST /v1.0/device/4420/sensor/9089/datapoints HTTP/1.1Host: api. ...
- CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探
CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...
随机推荐
- fastCGI与PHP-fpm
fastCGI是nginx和php之间的一个通信接口,该接口实际处理过程通过启动php-fpm进程来解析php脚本,即php-fpm相当于一个动态应用服务器,从而实现nginx动态解析php.因此,如 ...
- ArcGIS API for JavaScript Beta初步试探(一)
这段时间一直在看https://developers.arcgis.com/javascript/beta/sample-code/index.html, 下面直接看图片: 叠加了二维arcgis s ...
- 读书笔记——Windows环境下32位汇编语言程序设计(13)关于EXCEPTION_DEBUG_INFO结构体
在动手自己尝试编写书上第13章的例子Patch3时,遇到了一个结构体EXCEPTION_DEBUG_INFO. 这个结构体在MASM的windows.inc中的定义和MSDN中的定义不一样. (我使用 ...
- poj 2342 Anniversary party 简单树形dp
Anniversary party Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3862 Accepted: 2171 ...
- LOJ Finding LCM(math)
1215 - Finding LCM Time Limit: 2 second(s) Memory Limit: 32 MB LCM is an abbreviation used for Least ...
- Class to connect postgres with python in psycopg2
For we need to connect the postgres db in project very frequently, so write the follows class: impor ...
- A python tool to static sim.log duration time
When working ALU IMS Patch team, we need to static the SU duration to add it to the patch report, th ...
- 原始的2文件的makefile错误
从来没系统的看过makefile文档,平时属于复制模板,用完即忘,下午尝试按自己的理解写一个最简单的makefile,含2个.c文件,1个.h文件,费了个把小时,参考别人的文章才弄出来,特记录. ma ...
- 迅为iTOP-4412核心板调整电压
本文转自:http://www.topeetboard.com iTOP-4412核心板使用的电源管理芯片是三星专门针对4412研发的S5M8767,8767提供9路BUCK和28路LDO输出,每路电 ...
- Linux NFS 介绍
由SUN开发,用于在不同的系统之间使用,所以其设计与主机系统无关,用户想使用远程文件时,只需要mount –t nfs就可以把远程的文件拿到本地,像使用本地文件一样使用,非常方便. 它采用C/S架构, ...