dongtao 发表于 2014-5-4 09:40

【硬创邦】跟hoowa学做智能路由(五):熟悉OpenWRT

从本章开始,我们要更多的了解系统的特性,以及不论是智能路由还是智能家居,我们用路由器的处理器到底能做多少事情。系统结构在上一章我们已经完成了刷机工作,这个时候系统进行了首次启动,并且格式化了它的”可写”分区。那么在设备里分区到底是怎么样进行的呢?我们首先需要知道:不同的处理器下OpenWRT分区是略微有所区别,不是所有的分区都完全相同的。在路由器的FLASH上,内核中所使用的驱动是MTD设备驱动。MTD(Memory Technology Devices,内存技术设备)是用于访问内存类设备(ROM、FLASH)的Linux驱动子系统。它的主要目的使FLASH类设备更加容易被访问,为此它在硬件和上层提供了一个抽象的接口,使得在操作系统下我们可以像操作硬盘一样操作这个设备。仔细观察过Linux启动信息的朋友会看到这么一段话:
[ 0.690000] 5 tp-link partitions found on MTD device spi0.0
[ 0.700000] Creating 5 MTD partitions on “spi0.0″:
[ 0.700000] 0×000000000000-0×000000020000 : “u-boot”
[ 0.710000] 0×000000020000-0x00000012a290 : “kernel”
[ 0.730000] 0x00000012a290-0x0000007f0000 : “rootfs”
[ 0.760000] 0×000000300000-0x0000007f0000 : “rootfs_data”
[ 0.760000] 0x0000007f0000-0×000000800000 : “art”
[ 0.770000] 0×000000020000-0x0000007f0000 : “firmware”
这些信息表示当前系统识别到的FLASH分区。我们可以用电脑中的计算器计算一下,打开计算器,选择科学型、十六进制,输入名为art的分区容量用(800000-7f0000)结果为10000(十六进制),这个时候点击十进制,系统会自动将结果转换为十进制,再除以1024结果为64(K)表示这个分区容量为64k。在openwrt的系统中现在对atheros方案实现了自动查找分区结尾。上面的几个分区,我来说明下(分区名称、分区容量、分区作用):
[*]“u-boot”:128KB,设备初始化程序+引导程序代码本身
[*]“kernel” :1MB,存放系统内核的二进制代码,按照x86下的讲法是Raw分区,就是这里只有内核的二进制,不存在文件系统。
[*]“rootfs”:6.7MB,完整的系统文件包含只读和可写
[*]“rootfs_data”:4.9MB,在rootfs中的可写部分的位置
[*]“art”:64KB,EEPROM分区,在Atheros的方案中这个分区保存了无线的硬件参数
[*]“firmware”:7.9MB,完整的固件位置包含了除”u-boot”之外全部的内容
看的晕了? 这,我马上画个简单的图给大家看看:http://img0.tuicool.com/zQnYJf.jpg这个是它的分区逻辑。请不要太在意这个地方,有点晕也没关系,继续往后面看,这个地方留着后边慢慢理解。在系统中,可以执行以下指令查看当前系统分区:
root@OpenWrt:/tmp# cat /proc/mtd
dev: size erasesize name
mtd0: 00020000 00010000 “u-boot”
mtd1: 0010a290 00010000 “kernel”
mtd2: 006c5d70 00010000 “rootfs”
mtd3: 004f0000 00010000 “rootfs_data”
mtd4: 00010000 00010000 “art”
mtd5: 007d0000 00010000 “firmware”root@OpenWrt:/tmp# cat /proc/partitions
major minor #blocks name31 0 128 mtdblock0
31 1 1064 mtdblock1
31 2 6935 mtdblock2
31 3 5056 mtdblock3
31 4 64 mtdblock4
31 5 8000 mtdblock5
每个分区在flash中的位置是/dev/mtdblockX这样的位置,比如你想把art分区里的数据读出来看看,那么就执行:
root@OpenWrt:/tmp# dd if=/dev/mtdblock4 of=/tmp/1
128+0 records in
128+0 records out
然后执行hexdump -C /tmp/1就可以看到这个分区的内容了。系统的文件结构好了,我们这一节将的非常重要。上一节说过系统在第一次启动的时候会格式化”可写分区”,这在逻辑上到底是啥关系呢?首先uboot启动了kernel完成之后,由kernel加载”ROM分区”(就是rootfs减去rootfs_data得到的那一块分区),ROM分区采用的是Linux内核支持的squashFS文件系统,squashFS文件系统是一种压缩只读文件系统。加载完毕后将其挂载到/rom目录。系统将使用JFFS2文件系统格式化rootfs_data这部分并且将这部分挂载到/overlay目录。然后将一部分内存挂载为/tmp目录。这个时候大家一定有一个问题:到底根文件系统是哪个?这个是OpenWRT设计的一个优点,它采用了一种叫Overlay透明挂载技术,首先将/rom挂载为/根文件,然后再用/overlay覆盖在/之上,这样,当你进行文件系统的变更,修改,所做的操作将在overlay中记录。rom是不改变的。而最简单的恢复出厂设置方法,即是删除掉/overlay下所有文件。http://img1.tuicool.com/v2ya6f.jpg大致上而言,系统的启动流程类似CentOS这类x86下的发行版。由于本文读者多是熟悉linux的朋友,关于系统的启动流程不做详细解释了。基本指令OpenWRT下系统的基本指令没有使用x86下的指令包,因为那些指令包容量太大。它使用的是Busybox项目。Busybox是一个集成了一百多个常用Linux命令和工具的软件包(OpenWRT下编译可以选择要哪些指令)。除了包含常规指令之外,Busybox还包含了grep、find、mount以及telnet、http等复杂工具。其被戏称为Linux下的瑞士军刀。http://img2.tuicool.com/IJbMvu.jpg通过列表大家可以看到,在bin下大部分都是软连接,这些软连接几乎都连接到Busybox中。是的,Busybox就是以检测用户执行的是什么名称来识别用户需要啥指令。http://img0.tuicool.com/RnARFv.jpghoowa要告诉大家,Busybox在80%的情况下与x86下的标准指令是完全相同的,有20%的情况一些指令的细节参数是不支持的。常用来需要配置的文件夹和内容:
/etc/ 存放着系统全部的配置文件
/etc/init.d/ 存放着启动的服务脚本
/etc/config/ 存放着OpenWRT的配置文件包括网络等等
/tmp/ 临时文件之外还存放着动态的配置文件
/tmp/TZ 就是系统启动后所使用的时区参数
…..
其它还有很多,我们就不一一介绍,用到哪个时再讲。让设备连入网络以上已经完成后,可以将电脑与设备之间那根网线可以拔掉了。将你的外网网线插入M150开发版的WAN口(WAN口位置请参考之前章节的介绍),这时系统将通过putty面板刷下屏,信息提示已插入网线。通过执行指令可以看到是否当前设备被分配了IP地址:http://img1.tuicool.com/NNJrae.jpg其中eth0就是WAN口,其它的暂时不讲解。软件包管理在OpenWRT下使用的软件包管理技术叫做OPKG,它是一个轻量级的软件包技术,已经成为开源嵌入式的事实标准,它类似CentOS下的yum,可以实现对预编译的二进制软件下载。输入opkg即可看到整个软件的完整帮助信息。语法格式:opkg [参数...] 子命令 [子参数...],参数有:
update 下载服务器上可用的软件包列表
upgrade <包名> 升级软件包
install <包名> 安装软件包
configure <包名> 配置某一个软件包
remove <包名> 卸载软件包
info 显示出指定软件包的信息
系统命令远比我介绍的要多的多,而且这些命令是我们最常用的。本着深入浅出的态度,大家根据自己的能力,希望学更多的童鞋可以自己详细查看下opkg的帮助文档。接下来我们来安装一个vmstat。在OpenWRT下如果你要对你的程序进行负载检测,vmstat是一个非常实用的工具。(由于软件包列表可能会比较大因此并不保存在系统中,每次启动需要首先执行opkg update取得最新的软件包。)
root@OpenWrt:/# opkg update
Downloading http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/Packages.gz.
Updated list of available packages in /var/opkg-lists/barrier_breaker.
root@OpenWrt:/# opkg install procps-vmstat
Installing procps-vmstat (3.2.8-1) to root…
Downloading http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/procps-vmstat_3.2.8-1_ar71xx.ipk.
Installing procps (3.2.8-1) to root…
Downloading http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/procps_3.2.8-1_ar71xx.ipk.
Installing libncurses (5.9-1) to root…
Downloading http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/libncurses_5.9-1_ar71xx.ipk.
Installing terminfo (5.9-1) to root…
Downloading http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/terminfo_5.9-1_ar71xx.ipk.
Configuring terminfo.
Configuring libncurses.
Configuring procps.
Configuring procps-vmstat.
这样就安装完成了,可以执行vmstat 1看看效果。别忘了如果要退出vmstat 1,可按键盘Ctrl+C中断。安装后软件包会被保存在/overlay的分区中,不会丢失。OPKG配置:
root@OpenWrt:/# cat /etc/opkg.conf
src/gz barrier_breaker http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages
dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay
这里有列表出opkg的配置,第一句那个地址是表示当前这台机器下载的二进制包所使用的服务地址,因为处理器指令集不一样,所以地址很丰富的。也就是说,你可以自己给自己的智能路由产品搭建一个软件包服务器。如果大家想知道有多少软件可以安装,就可以用你的浏览器直接访问那个地址,即可列表出全部的可用软件包。关于软件包在未来的章节中,我们将会再次介绍OPKG相关的内容,我们会介绍如何自己制作OPKG软件包,以及自己搭建OPKG服务器的步骤和方法。届时,你可以更容易的移植x86下的软件到OpenWRT中,也可以选择哪些软件包是要打到固件的ROM中、哪些是要动态安装的。本章到这里结束了,介绍的知识点不多,但是内容其实还是挺多的。关于软件包部分希望大家能多多练习,还是那句话,不怕弄坏了,坏了就重新刷。

badmen 发表于 2015-3-2 21:52

强烈支持楼主ing……
页: [1]
查看完整版本: 【硬创邦】跟hoowa学做智能路由(五):熟悉OpenWRT