记录一下Openwrt产品定制开发过程,(一)环境配置和目录结构说明

(一)环境配置和目录结构说明

1 环境配置

1.1 系统特点

与其他系统不一样,Openwrt的firmware开发系统比较特别,其基本不包含任何可执行程序,甚至源代码,它依靠一套脚本自动下载源代码、应用及其补丁来构建包括交叉编译器等整个体系,依靠脚本dowloading、patching、compiling一切并完成编译构建。通过修改template,我们就可以改变此过程中的任何步骤。

例如,如果一新的kernel发布了,只需要简单地修订其中的一个makefile文件就会download最新的kernel,patch,编译新的firmware。这不仅适用于kernel,也适用于openwrt的所有模块。这使得openwrt保持最新的编译器、最新的内核及最新的应用。你甚至可以利用这一系统编译构建与OpenWrt无关的其他APP和系统。

1.2 开发环境配置

1.2.1 OS及相关工具和库

l 安装ubuntu

l 安装最新版本的ubuntu系统,并更新组件。

$ sudo apt-get update

$ sudo apt-get upgrade

l 安装SVN、GIT工具

$ sudo apt-get install subversion

$ sudo apt-get install git-core

l 安装编译工具和依赖库

$ sudo apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils ncurses-term zlib1g-dev libncurses5-dev gawk libz-dev

1.2.2 下载 OpenWrt 源码

新建一个工程目录文件夹,使用 svn 工具下载源码。

$ mkdir openwrt

$ cd openwrt/

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

$git clone

国内镜像: svn://svn.openwrt.org.cn/openwrt/trunk

1.2.3 更新支持软件和工具

为了使 OpenWrt 支持更多的软件,需要更新和安装系统预定义的软件。使用普通用户权限执行即可,用 root 可能出错。

$ cd trunk

$ ./scripts/feeds update -a

$ ./scripts/feeds install -a

1.2.4 编译OpenWrt源码

与Linux类似,OpenWrt编译前需要对目标系统进行配置,同样使用menuconfig进行配置。

主要需要配置的是CUP型号和CUP子型号以及路由器型号,其他配置按照自己系统的需要选取。

$ make menuconfig

Target System -> Ralink RT288x/RT3xxx

Subtarget -> RT3x5x/RT5350 based boards

Target profile -> HAME-MPR-A2

保存退出后就可以进行编译,编译命令是:

$ make V=99 -j2

V=99表示显示所有信息;

-j表示有几个线程同时编译;

编译结果在./bin/your_target/目录下。

其中,openwrt-xxx-sysupgrade.bin就是可以下载到板上的固件可执行文件。

1.2.5 几个注意事项

注意:多线程编译可能会在中间文件依赖上产生问题,当出现编译问题时,可采取以下措施找出原因进行修正。

1、更新所有模块和软件后再次进行编译。具体命令是apt-get update/upgrade, feed update/install

2、使用-j1,单线程编译查看log发现具体原因,可以多尝试几次-j1编译。一般来说如果按照上述步骤进行环境搭建和代码下载不应该出现编译问题。

3、出现如下openssl编译问题时可以重新安装libssl库来解决。

Build dependency: Please install the openssl library (with development headers) Prerequisite check failed. Use FORCE=1 to override.

make[1]: *** [tmp/.prereq-build] Error 1

$ sudo apt-get install libssl-dev libssl

1.3 调试环境配置

1.3.1 串口配置

OpenWrt的调试是通过串口进行,所以首先要保证USB2COM的驱动已经安装,当前最流行的该类芯片是PL2303,Ubuntu已经预装了该驱动,而其他驱动芯片可以通过命令进行查询。

l 查询USB2COM驱动是否安装

$ lsmod

Module Size Used by

pl2303 20480 0

usbserial 49152 1 pl2303

l 检查COMM工作状态

然后测试该COM是否工作。插上USB转串口(如果是开发板,可能需要将单板上电)

$ dmesg|grep tty

[19641.] usb 1-1: pl2303 converter now attached to ttyUSB0

[19652.] pl2303 ttyUSB0: pl2303 converter now disconnected from ttyUSB0

[19669.] usb 1-1: pl2303 converter now attached to ttyUSB0

l 安装、配置terminal程序

安装:

$ sudo apt-get install minicom

配置:

1. 在终端中输入minicom以启动minicom;

2.先按下Ctrl+ a, 放开,再按o,出现配置菜单.

3.选择 Serialport setup, 此时所示图标在“Changewhich setting”中,键入“A”,此时光标移到第A项对应处:串口COM1对应ttyS0,COM2对应ttyS1.(注意选择)

具体的配置信息如下所示:

Serialport setup[Enter]

+-------------------------------------------------------------+

|A - Serial Device :/dev/ttyUSB0 |

| B - Lockfile Location :/var/lock |

| C - Callin Program : |

| D - Callout Program -: |

| E - Bps/Par/Bits :8N1 |

| F - Hardware Flow Control : No |

| G - Software Flow Control : No |

| |

| Change whichsetting? |

+-------------------------------------------------------------+

注意: 如果没有使用USB转串口,而是直接使用串口,那么SerialDevice要配置为/dev/ttyS0(如果使用USB转串口,则需要查看dev下是否存在ttyUSB0,若没有,则创建一个:mknod/dev/ttyUSB0 c 188 0)

对波特率,数据位和停止位进行配置,键入“E”,波特率选为8N1 (奇偶校验无,停止位1),

硬/软件流控制分别键入“F”“G”并且都选NO.

在确认配置正确之后,可键入回车返回上级配置界面,并将其保存为默认配置。(即savesetup as dfl),之后重启minicom是刚才配置生效,在连上开发板的串口线后,就可在minicom中打印正确的串口信息了。

1.3.2 xmodem协议烧写内核

这时候如果通过串口用xmodem协议烧写内核时会提示没有xmodem协议。

所以还必须安装软件包:lrzsz

sudoapt-get install lrzsz

这时候就可以正常地用minicom通过串口烧写内核了。

1.3.3 几个注意事项和组合键

下次在输入minicon即可直接进入。

命令minicom是进入串口超级终端画面,而minicom-s为配置minicom。

说明/dev/ttyS0对应为串口0为你连接开发板的端口。

注意:非正常关闭minicom,会在/var/lock下创建几个文件LCK*,这几个文件阻止了minicom的运行,将它们删除后即可恢复

组合键的用法是:先按Ctrl+A组合键,然后松开这两个键,再按Z键。另外还有一些常用的组合键。

(1)S键:发送文件到目标系统中;

(2)W键:自动卷屏。当显示的内容超过一行之后,自动将后面的内容换行。这个功能在查看内核的启动信息时很有用。

(3)C键:清除屏幕的显示内容;

(4)B键:浏览minicom的历史显示;

(5)X键:退出mInicom,会提示确认退出。

(6)O键:进行minicom配置。

Ctrl+ A --> O

+-----[configuration]------+

| Filenames andpaths |

| File transfer protocols-|

| Serial port setup |

| Modem and dialing |

| Screen and keyboard |

| Savesetup as dfl |

| Savesetup as.. |

|Exit |

+--------------------------+

选择"Filenamesandpaths"

+-----------------------------------------------------------------------+

|A - Download directory :/home/crliu |

| B - Upload directory :/tmp |

| C - Script directory : |

| D - Script program :runscript |

| E - Kermit program : |

| F - Loggingoptions |

| |

| Change whichsetting? |

+-----------------------------------------------------------------------+

(1)A- download 下载文件的存放位置(开发板--->PC)

开发板上的文件将被传输到PC机上的/home/crliu目录下。

(2)B- upload 从此处读取上传的文件(PC--->开发板)

PC机向开发板发送文件,需要发送的文件在/tmp目录下(PC机上的目录)。做了此项配置后,每次向开发板发送文件时,只需输入文件名即可,无需输入文件所在目录的绝对路径。

1.3.4 下载服务器配置

下载服务除了可以采取上述xmodem协议工具进行外,比较通行的还可采用tftp服务器来进行。在本系统上tftp可以按照以下步骤建立。

l 安装tftp

$ sudo apt-get install xinetd tftp tftpd

l 配置tftp

$ sudo vi /etc/xinetd.d/tftp

写入如下内容:

service tftp

{

socket_type = dgram

protocol = udp

wait = yes

user = root

server = /usr/sbin/in.tftpd

server_args = -s /var/tftpboot/

disable = no

per_source = 11

cps = 100 2

flags = IPv4

}

其中/var/tftpboot目录是tftp服务器的目录,设置其访问权限为777:

$ sudo mkdir -pv /var/tftpboot/

$ sudo chmod 777 /var/tftpboot/ -R

l 启动xinetd服务

$ sudo /etc/init.d/xinetd start或者restart

启动服务后可进行简单的测试来验证tftp是否工作。

在/tftpboot目录下创建一个test.txt文件,启动另外一个终端,输入:

$ tftp 127.0.0.1

tftp> get test.txt #获取ky文件

tftp> q #退出tftp

在终端输入ls命令,可以看到当前目录下看到ftp获取到的test.txt文件。

1.3.5 下载bin到flash

确保com口正确的配置好。

连接usb线,上电启动,几秒钟后uboot将启动,在如下界面输入“2”进入下载firmware界面。

然后会进入tftp下载服务器配置界面,按照提示配置本机和tftp服务器地址以及bin文件的全文件名,开始下载。

下载结束后系统重新启动。

启动成功界面如下。

1.4 常用操作

OpenWrt单板启动后,要开始开发调试还需要对板上的OpenWrt系统进行一些必要的配置。其配置方法和一般的Linux操作类同。

1.4.1 配置网络

l 通过terminal配置

root@OpenWrt:/etc/config# vi /etc/config/network

config interface lan

option ifname eth0.1

option force_link 1

option macaddr 7a:25:44:7f:3c:d4

option type bridge

option proto static

option ipaddr 192.168.0.111 <===

option netmask 255.255.255.0

option ip6assign 60

l 通过代码修改:

cd openwrt/trunk/package/base-file/files/bin/

vi config_generate

1.4.2 安装应用

OpenWrt有自己的包管理器opkg,安装应用无论是自己开发的还是OpenWrt软件源的都可以用opkg install appname来进行。

需要提醒的是,安装前可以通过update命令更新系统。

以安装LUCI应用为例:

root@OpenWrt:/# opkg update

root@OpenWrt:/# opkg install luci

root@OpenWrt:/# /etc/init.d/uhttpd enable //打开uhttp服务

root@OpenWrt:/# /etc/init.d/uhttpd start //自启动uhttpd

1.4.3 定制编译

定制编译是通过make menuconfig来设在所需的kernel和Application级别的配置来实现的。以将LUCI编译进firmware为例:

l 确认LuCI包已经下载

1.升级openwrt: ./feeds update

2.安装luci: ./feeds install -a -p luci

l 在menuconfig中进入LuCI配置入口。

将如下配置选中。

Network -->

<*> uhttpd

LuCI -->

Collections -->

< * > luci

Applications-->

<* > luci-app-ddns

<* > luci-app-firewall

<* > luci-app-ntpc

<* > luci-app-samba

Translations -->

<* > luci-i18n-chinese

l 编译固件

$ make V=99

2 目录、文件说明

第一章提到过OpenWrt系统提供的是一套管理脚本,而不是源代码。源代码在编译的过程中被下载到本地进行配置、编译。

初始的目录结构如下:

2.1 重要目录说明

OpenWrt最重要的几个目录如下:

l tools:编译所需的通用工具。目录里包含了获取和编译这些工具的命令。里面是一些Makefile,有的可能还有patch。每个Makefile里都有一句 $(eval $(call HostBuild)),表示编译这个工具是为了在主机上使用的。

l toolchain:交叉编译所需工具。包含一些命令去获取kernel headers, C library, bin-utils, compiler, debugger等等。

l package:已有的应用,可以通过./script/feeds update来获取,通过install命令安装。包括了各个软件包的Makefile。openwrt定义了一套Makefile模板,各软件参照这个模板定义了自己的信息,如软件包的版本、下载地址、编译方式、安装地址等。

l scripts:编译所需的各类工具脚本。

l dl (download):从网络上下载下来的软件包源码,编译时会解压到build_dir目录。

l include:存放 *.mk 文件。这里的文件上是在Makefile里被include的。

2.2 编译开始后创建的重要目录

make 创建-->

./

|_./build_dir/ ==>保存各类与编译相关的工具(源码)

|_./build_dir/host ==>临时目录:保存独立工具(源码)用于编译target

|_./build_dir/target-xxx ==>保存工具(源码)用于编译target

|_./build_dir/toolchain-xx ==>用户编译特定目录的工具(源码)

|_./staging_dir/ ==>toolchain编译结果

|_./staging_dir/host ==>编译出来的临时目录:保存独立工具

|_./staging_dir/target-xxx ==>编译出来的工具用于编译target

|_./staging_dir/toolchain-xx ==>编译出来的工具

|_./bin/ ==>firmware

|_./bin/mytarget/ ==>自定义的目标板image文件

./bin/目录下有几类文件和目录:

l Bin:最终的firmware映像文件,其中“xxx-sysupgrade.bin”为直接刷机文件。

l Elf:带有调试信息的映像文件。

l ./bin/packages/:各个应用和模块的可安装包。可以用命令安装opkg install xxx.ipk

在openwrt中所有功能就是一个个的应用ipk, 我们可以使用:

$ ./scripts/feeds update #来对软件包进行更新.

$ ./scripts/feeds search nmap #查找软件包nmap

Search results in feed ’packages’:

nmap Network exploration and/or security auditing utility

$ ./scripts/feeds install nmap #安装nmap这个软件

=====未完待续======

下一节:Make 过程