系统结构

在上一章我们已经完成了刷机工作,这个时候系统进行了首次启动,并且格式化了它的"可写"分区。那么在设备里分区到底是怎么样进行的呢?我们首先需要知道:不同的处理器下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] 0x000000000000-0x000000020000 : "u-boot"
[ 0.710000] 0x000000020000-0x00000012a290 : "kernel"
[ 0.730000] 0x00000012a290-0x0000007f0000 : "rootfs"
[ 0.760000] 0x000000300000-0x0000007f0000 : "rootfs_data"
[ 0.760000] 0x0000007f0000-0x000000800000 : "art"
[ 0.770000] 0x000000020000-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"和"art"之外全部的内容

看的晕了? 这,我马上画个简单的图给大家看看:

这个是它的分区逻辑。请不要太在意这个地方,有点晕也没关系,继续往后面看,这个地方留着后边慢慢理解。

在系统中,可以执行以下指令查看当前系统分区:

每个分区在flash中的位置是/dev/mtdblockX这样的位置,比如你想把art分区里的数据读出来看看,那么就执行:

然后执行hexdump -C /tmp/1就可以看到这个分区的内容了。

系统的文件结构

好了,我们这一节将的非常重要。上一节说过系统在第一次启动的时候会格式化"可写分区",这在逻辑上到底是啥关系呢?

  1. 首先uboot启动了kernel完成之后,由kernel加载"ROM分区"(就是rootfs减去rootfs_data得到的那一块分区)
  2. ROM分区采用的是Linux内核支持的squashFS文件系统(一种压缩只读文件系统),加载完毕后将其挂载到/rom目录(同时也挂载为根文件系统)。
  3. 系统将使用JFFS2文件系统格式化rootfs_data这部分并且将这部分挂载到/overlay目录。
  4. 将/overlay透明挂载为/分区。
  5. 将一部分内存挂载为/tmp目录。

这个时候大家一定有一个问题:到底根文件系统是哪个?这个是OpenWRT设计的一个优点,它采用了一种叫Overlay透明挂载技术,首先将/rom挂载为/根文件,然后再用/overlay覆盖在/之上,这样,当你进行文件系统的变更,修改,所做的操作将在overlay中记录。rom是不改变的。而最简单的恢复出厂设置方法,即是删除掉/overlay下所有文件。

大致上而言,系统的启动流程类似CentOS这类x86下的发行版。由于本文读者多是熟悉linux的朋友,关于系统的启动流程不做详细解释了。

基本指令

OpenWRT下系统的基本指令没有使用x86下的指令包,因为那些指令包容量太大。它使用的是Busybox项目。

Busybox是一个集成了一百多个常用Linux命令和工具的软件包(OpenWRT下编译可以选择要哪些指令)。除了包含常规指令之外,Busybox还包含了grep、find、mount以及telnet、http等复杂工具。其被戏称为Linux下的瑞士军刀。

通过列表大家可以看到,在bin下大部分都是软连接,这些软连接几乎都连接到Busybox中。是的,Busybox就是以检测用户执行的是什么名称来识别用户需要啥指令。

hoowa要告诉大家,Busybox在80%的情况下与x86下的标准指令是完全相同的,有20%的情况一些指令的细节参数是不支持的。

常用来需要配置的文件夹和内容:

/etc/ 存放着系统全部的配置文件
/etc/init.d/ 存放着启动的服务脚本
/etc/config/ 存放着OpenWRT的配置文件包括网络等等
/tmp/ 临时文件之外还存放着动态的配置文件
/tmp/TZ 就是系统启动后所使用的时区参数
.....

其它还有很多,我们就不一一介绍,用到哪个时再讲。

让设备连入网络

以上已经完成后,可以将电脑与设备之间那根网线可以拔掉了。

将你的外网网线插入M150开发版的WAN口(WAN口位置请参考之前章节的介绍),这时系统将通过putty面板刷下屏,信息提示已插入网线。

通过执行指令可以看到是否当前设备被分配了IP地址:

其中eth1就是WAN口,获得IP地址表示已经连接上你的网络。

从本节开始,到之后的讲解,所有的内容都要确保你的设备已经连接到网络上,确保能下载到指定的软件包。

软件包管理

在OpenWRT下使用的软件包管理技术叫做OPKG,它是一个轻量级的软件包技术,已经成为开源嵌入式的事实标准,它类似CentOS下的yum,可以实现对预编译的二进制软件下载。

输入opkg即可看到整个软件的完整帮助信息。语法格式:opkg [参数...] 子命令 [子参数...],参数有:

update 下载服务器上可用的软件包列表
upgrade <包名> 升级软件包
install <包名> 安装软件包
configure <包名> 配置某一个软件包
remove <包名> 卸载软件包
info [pkg|regexp] 显示出指定软件包的信息

系统命令远比我介绍的要多的多,而且这些命令是我们最常用的。本着深入浅出的态度,大家根据自己的能力,希望学更多的童鞋可以自己详细查看下opkg的帮助文档。

这里我们举例演示下下载usbutils软件包,该软件包是现实出当前USB总线上插入了什么设备。

更新opkg的包列表,请注意,每次操作opkg下载之前都要先执行一次这个,确保包列表是同步的:

安装usbutils包,OPKG会自动给你选择所依赖的其他包关系:

这样就安装完成了,我们执行以下lsusb看USB总线现在有啥。安装后软件包会被保存在/overlay的分区中,不会丢失:

root@OpenWrt:/# lsusb

软件包内核依赖

请注意,这一节希望大家能永远记住。

在opkg安装的时候,有时候会有内核模块安装,这个时候某些情况下软件包安装不上,提示内核版本不匹配,错误大概是这样:

root@OpenWrt:~# opkg install kmod-usb-storage
Installing kmod-usb-storage (3.3.8-1) to root...
Downloading http://182.92.3.46/hoowa/openwrt/120901/ar71xx/packages/kmod-usb-storage_3.3.8-1_ar71xx.ipk.
Collected errors:
* satisfy_dependencies_for: Cannot satisfy the following dependencies for kmod-usb-storage:
* kernel (= 3.3.8-1-6acd2a17c333f503dc86081b03fe73c0) * kernel (= 3.3.8-1-6acd2a17c333f503dc86081b03fe73c0) *
* opkg_install_cmd: Cannot install package kmod-usb-storage.

请注意那句kernel (=.... 那句表示内核版本不匹配,产生这个的主要原因是教学固件在网上的内核升级了,唯一的解决办法就是重新刷固件。

在目前已有的内核模块教学固件中都已经编译为模块了,但是在本教程彻底完成之前,是有可能会重新产生内核的,因此请大家一定记住这个问题。

OPKG配置:

这里是列表出opkg的配置文件,其中第一句的URL地址是表示当前这台机器下载的二进制包所使用的服务地址,因为处理器指令集不一样,所以地址很丰富的。也就是说,你可以自己给自己的智能路由产品搭建一个软件包服务器。如果大家想知道有多少软件可以安装,就可以用你的浏览器直接访问那个地址,即可列表出全部的可用软件包。

关于软件包

在未来的章节中,我们将会再次介绍OPKG相关的内容,我们会介绍如何自己制作OPKG软件包,以及自己搭建OPKG服务器的步骤和方法。届时,你可以更容易的移植x86下的软件到OpenWRT中,也可以选择哪些软件包是要打到固件的ROM中、哪些是要动态安装的。

本章到这里结束了,介绍的知识点不多,但是内容其实还是挺多的。关于软件包部分希望大家能多多练习,还是那句话,不怕弄坏了,坏了就重新刷。

初始Openwrt的更多相关文章

  1. 编译 openwrt 及初始配置

    主机为 ubuntu 14 x64 硬件: 优酷土豆宝 cpuMT7620A,内存128M,flash 32M有2个源,用哪个也可以git clone https://github.com/openw ...

  2. 【OpenWRT之旅】LuCI探究

    1. 多语言 1)检查: opkg list | grep luci-i18n- 2)安装语言包: opkg install luci-i18n-hungarian   2.uhttpd 这个是LuC ...

  3. OpenWrt资料汇总

    上周末折腾了一下OpenWrt,打算把Facebook的网络模拟工具部署到上面,最终以失败告终.上github看,发现已经有人给作者提了issue,作者表示部署在OpenWrt上会很有用,但确实在Op ...

  4. 第一章TP-Link 703N刷OpenWrt

    1)下载编译好的固件 openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin openwrt-ar71xx-generic-tl-wr703n ...

  5. OpenWRT 路由配置技巧

    随着最近 Google 在国内已经完全无法访问,使得通过 VPN 访问网络的需求更加强烈,本文介绍的方法可以使一个普通的路由具备稳定连接 VPN 的能力,并能够根据目标访问网站选择国内外线路,从而得到 ...

  6. OpenWrt刷机后LAN口无法连通的问题

    [路由器开发板硬件固件配置] MTK双频:MT7620a + MT7612e 内存:256 MB 闪存:16 MB 固件:MTK自带SDK中的OpenWrt固件(mtksdk-openwrt-2.6. ...

  7. openwrt多wan限上下行速脚本,基于qosv4,imq模块替换成ifb模块[ZT]

    转自: http://www.right.com.cn/forum/thread-169414-1-1.html ,本人未经测试,转来自已备用 由于树莓派2装openwrt官方没有imq模块, 好像说 ...

  8. OpenWRT下实现Portal认证(WEB认证)

    首先简单介绍一下什么是Portal认证,Portal认证,通常也会叫Web认证,未认证用户上网时,设备强制用户登录到特定站点,用户可以免费访问其中的服务.当用户需要使用互联网中的其它信息时,必须在门户 ...

  9. [Openwrt 项目开发笔记]:Openwrt必要设置(二)

    [Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 前面的两篇blog中,我将如何搭建Openwrt ...

随机推荐

  1. IIS应用程序池自动回收问题的解决办法

    windows 2012 的w3wp.exe(IIS Worker Process)进程不及时释放导致占用内存过高,以下解决方法: IIS可以设置定时自动回收,默认回收是1740分钟,也就是29小时. ...

  2. Beta阶段冲刺---Day1

    一.Daily Scrum Meeting照片 二.讨论项目每个成员的昨天进展 由于今天是Beta阶段冲刺的第一天,因此每个成员没有昨日进展. 我们在昨天把未来五天的其他科目的作业都一起做完了(手动斜 ...

  3. 继承and派生

    1.什么是继承?(python2与python3) 在程序中继承是一种新建子类的方式,新创建的类称之为子类\派生类,被继承 的类称之为父类\基类\超类 继承描述的是一种遗传关系,儿子可以重用爹的属性 ...

  4. divide&conquer:find max array

    package max_subarrayy;import java.lang.Math;public class max_subarrayy { private static int[] array; ...

  5. git解决not a git repository

    意思是说没有库,需要你创建 git init zzz zzz文件夹就会出现在你的项目中,里面就会有.git文件,将里面的.git剪切到与项目同一级中 关注微信小程序

  6. Oracle流程控制语句

    1.选择语句 1.1 IF...THEN...END IF语句 DECLARE MY_AGE INT; IF MY_AGE IS NULL THEN DBMS_OUTPUT.put_line('AGE ...

  7. L1-028. 判断素数

    本题的目标很简单,就是判断一个给定的正整数是否素数. 输入格式: 输入在第一行给出一个正整数N(<=10),随后N行,每行给出一个小于231的需要判断的正整数. 输出格式: 对每个需要判断的正整 ...

  8. 小白学习Python遇到的一些2.7与3.X之间的不同问题

    1.输入字母出错问题 原本跟着视频一起学习,currency_str_value=input(‘请输入带单位货币金额’) 但是运行的时候,输入数字就没有问题,只要带上了字母就会报错,后来百度,pyth ...

  9. 适配手机端之 rem

    (function() { var psdWidth = 1080, maxRem = 100, ch = document.documentElement.clientHeight || docum ...

  10. Spring 消息

    RMI.Hessian/Burlap的远程调用机制是同步的.当客户端调用远程方法时,客户端必须等到远程方法完成之后,才能继续执行.即使远程方法不向客户端返回任何消息,客户端也要被阻塞知道服务完成. 消 ...