贫乏神来了 第03话
樱市子捡到了班上的石蕗同学的学生证,想要接近石蕗的樱市子去了石蕗家.然而她肤浅的行为激怒了石蕗的家人.石蕗的弟弟龙汰因为卡片的丢失遇到了危险,红叶告诉樱市子她的幸福能量可以拯救龙汰,这要看她是否愿意...
视频点评:
深夜追漫者_:女主会成长的
you1663357489:欧尼萨马
日曰46339136:哈哈 喜欢
轉身回眸丶淚傾城36815322:红叶比女主好多了
OmaitG:吐个槽而已还需要理由啊//@小戬QvQ: 你们看了后面就知道女主为什么会这样了,现在还没看完呢你有什么理由吐槽!!!//@秦婷Kisa__:如果和其他很多女主一样是完美圣女的话还有什么看头//@lavendar0818: 我也觉得!!还是喜欢贫穷神 //@OmaitG:女主真恶心,虚荣自私还没常识
小戬QvQ:你们看了后面就知道女主为什么会这样了,现在还没看完呢你有什么理由吐槽!!!//@秦婷Kisa__:如果和其他很多女主一样是完美圣女的话还有什么看头//@lavendar0818: 我也觉得!!还是喜欢贫穷神 //@OmaitG:女主真恶心,虚荣自私还没常识
OmaitG:可怕,难道我讨厌谁就是嫉妒谁?什么逻辑//@雪小路野蔷薇73915777: 像那个说女主自私的一定是嫉妒女主—w—+//@腾讯用户09742988:你不自私 如果真让你有女主的能力 从生下来就一直幸福 突然有一天让你没有这能力 从此过上贫穷的日子 你愿意放弃嘛 可能嘛 装什么逼 你所说的自私就证明因为你没有女主那种能力所以你才会说女主自私 //@OmaitG: 女主真恶心,虚荣自私还没常识
兔兔君233:怎么感觉樱市子好可怜啊,身边一个人都没有 只有贫神 红叶
手机用户_724473798:但其实这女主心肠是好的。。就是被宠坏了。。或者是是因为自小生活环境的原因所以。。
手机用户_724473798:嫌贫爱富的女人。。。哎
精彩内容:
3.1 入门:分区/外网/OPKG
了解分区
想必,想必很多人都知道分区的概念吧,磁盘分成不同的区来工作,是这个样子的。在路由器的Flash上也是有分区的,没错~
上一章首次刷机完成后,在过一段时间会提示出这样一句话
[ 77.170000] jffs2: notice: (760) jffs2_build_xattr_subsystem: complete building xattr subsystem, 0 of xdatum (0 unchecked, 0 orphan) and 0 of xref (0 dead, 0 orphan) found.
是的,这句话的意思是,使用了jffs2文件系统完成了格式化。好啦,我们先不管啥是jffs2了。我们先说分区吧。
在Linux系统中对闪存类存储器是采用的MTD(内存技术设备)类设备驱动实现的,MTD是用于访问内存类设备(ROM,Flash)的Linux驱动子系统。他的主要目的是使Flash闪存类设备更加容易被访问,为此他在硬件和上层提供了一个抽象的接口使得在操作系统下我们可以像操作硬盘一样操作这类设备。仔细观察过linux启动信息的朋友会看到这么一句话:
[ 0.290000] 4 ofpart partitions found on MTD device spi32766.0
[ 0.290000] Creating 4 MTD partitions on "spi32766.0":
[ 0.300000] 0x000000000000-0x000000030000 : "u-boot"
[ 0.310000] 0x000000030000-0x000000040000 : "u-boot-env"
[ 0.310000] 0x000000040000-0x000000050000 : "factory"
[ 0.320000] 0x000000050000-0x000001000000 : "firmware"
[ 0.330000] 0x00000014b308-0x000001000000 : "rootfs"
[ 0.330000] mtd: partition "rootfs" must either start or end on erase block boundary or be smaller than an erase block -- forcing read-only
[ 0.350000] mtd: device 4 (rootfs) set to be root filesystem
[ 0.350000] mtd: partition "rootfs_data" created automatically, ofs=0x310000, len=0xcf0000
[ 0.360000] 0x000000310000-0x000001000000 : "rootfs_data"
没错啦,鸟语好的人当然就看到动啦,这句话的意思就是,系统创建了4个MTD分区在SPI(SPI是我们所使用的Flash接口标准,路由器一般都用它,价格便宜量又足!)设备上,这几个分区的说明如下表:
分区ID号 | 分区位置 | 分区容量 | 分区作用 |
u-boot | 0x000000000000-0x000000030000 | 192KB | 引导程序 |
u-boot-env | 0x000000030000-0x000000040000 | 64KB | 引导程序配置 |
factory | 0x000000040000-0x000000050000 | 64KB | MT7620初始参数 |
firmware | 0x000000050000-0x000001000000 | 15.68MB | 固件分区 |
rootfs | 0x00000014b308-0x000001000000 | 14.70MB | 固件分区 文件系统子集 |
rootfs_data | 0x000000310000-0x000001000000 | 12.93MB | 固件分区 文件系统子集 可写分区子子集 |
我的天啊好复杂啊,好吧,其实只是系统表达的复杂了一些而已,真实情况没那么特别复杂。由于嵌入式的Flash容量都很小,而且也没有调整的必要,所以分区都是固定的,也因此不需要"分区表"这种在电脑上才去要的东西,在路由器的Flash中,分区都是固化好的位置。
图3101
教学板的Flash容量是16MB,图3101中有容量的是显性分区,没容量是也存在的分区:
1. 分区存在子分区,比如kernel和rootfs就是firmware的子分区。而rootfs_rom、rootfs_data就是rootfs的子分区。
2. 整个分区是从0x000000000000开始到0x000001000000结束,如果你觉得看起来不爽可以用你电脑中的计算器软件将16进制转换成10进制。
3. kernel分区的容量计算公式如下,为啥这么写不解释,看前面那个表的分区位置来琢磨
( 0x00000014b308 - 0x000000050000 ) = 换算为10进制 / 1024 / 1024 = 0.98MB
4. rootfs_rom分区的容量计算公式如下,也不解释
(0x000000310000 - 0x00000014b308 ) = 换算为10进制 / 1024 / 1024 = 1.76MB
分区的容量不是一层不变的,随着固件的变化其firmware部分的容量也会改变,不过没关系,只要学会上面的公式就可以了解到分区是怎么存在的。
查看系统MTD分配
root@OpenWrt:~# cat /proc/mtd
dev: size erasesize name
mtd0: 00030000 00010000 "u-boot"
mtd1: 00010000 00010000 "u-boot-env"
mtd2: 00010000 00010000 "factory"
mtd3: 00fb0000 00010000 "firmware"
mtd4: 00eb4cf8 00010000 "rootfs"
mtd5: 00cf0000 00010000 "rootfs_data"
查看系统MTD的分区
root@OpenWrt:~# cat /proc/partitions
major minor #blocks name
31 0 192 mtdblock0
31 1 64 mtdblock1
31 2 64 mtdblock2
31 3 16064 mtdblock3
31 4 15059 mtdblock4
31 5 13248 mtdblock5
将非文件系统分区读出来
如factory分区这种分区是非文件系统的,里面保存的是配置,比如当前这台机器的MAC地址,那么就可以通过一个16进制读取指令直接读取。
如前面所讲,factory分区的设备为mtd2就是/dev/mtd2
root@OpenWrt:~# hexdump -C /dev/mtd2
看不懂吧,想看懂找芯片厂提供资料吧,芯片厂现在不公开这部分的参数,但是告诉你们一个小窍门,你看看哪个像MAC地址,这里就是写的出厂时的MAC。
文件系统
现在开始深入的了解下文件系统与上面分区的关系,系统有rootfs_rom这个隐藏的只读文件系统,也有rootfs_data这个可写的文件分区,他们是啥关系呢。这个是OpenWrt设计的有意思的一个地方。
1. 首先引导程序启动了内核完成之后,由内核加载roofs_rom只读分区部分来完成系统的初步启动。
2. rootfs_rom只读分区采用的是Linux内核支持的squashFS文件系统(一种压缩只读文件系统),加载完毕后将其挂载到/rom目录(同时也挂载为/根目录)。
3. 系统将使用JFFS2文件系统格式化的rootfs_data可写文件分区这部分并且将这部分挂载到/overlay目录。
4. 系统再将/overlay透明挂载为/根目录。
5. 最后将一部分内存挂载为/tmp目录。
挂载情况查看
root@OpenWrt:~# df
Filesystem 1K-blocks Used Available Use% Mounted on
rootfs 13248 464 12784 4% /
/dev/root 1792 1792 0 100% /rom
tmpfs 30940 15116 15824 49% /tmp
/dev/mtdblock5 13248 464 12784 4% /overlay
overlayfs:/overlay 13248 464 12784 4% /
tmpfs 512 0 512 0% /dev
透明挂载/根目录
OpenWRT的一个设计特点之一,系统先将rootfs_rom挂载为/根目录这样就具备了一个完整的系统,然后再将rootfs_data以透明方式挂载在/根目录上。这样重叠之后,的效果是:
1. 你所看到的根文件系统是由rootfs_rom和rootfs_data两个分区组合在一起呈现给你的。
2. 当你修改一个任何位置的文件的时候,所做的修改在rootfs_data里记录。
3. 当你删除一个文件的时候,所做的修改在rootfs_data里记录。
4. 当你增加一个文件的时候,所做的修改在rootfs_data里记录。
5. 当你读取文件的时候,首先检测rootfs_data里的状态,再检测rootfs_rom里的东西,一直到给你最后一个结果。
图3102
也因此得到的好处和坏处
1. 当对文件进行操作的时候,比如你修改了一个名字为abc的文件,那么同时在/rom里还有修改之前那个abc,同时在/overlay里有修改之后的abc。所占的空间是倍增的哦。
2. 系统不论任何时候,都只要通过简单的删除掉/overlay里所有文件达到复原的效果。
一个简单的演示
root@OpenWrt:~# ls /31test
ls: /31test: No such file or directory
root@OpenWrt:~# ls /overlay/31test
ls: /overlay/31test: No such file or directory
root@OpenWrt:~# touch /31test
root@OpenWrt:~# ls /31test
/31test
root@OpenWrt:~# ls /overlay/31test
/overlay/31test
root@OpenWrt:~# rm /31test
root@OpenWrt:~# ls /overlay/31test
ls: /overlay/31test: No such file or directory
不过不建议直接在/overlay里删除,否则会有不同步的情况!
基本系统演示
OpenWRT中的系统指令没有使用x86下的指令包,因为那些指令包容量太大,他使用了Busybox项目。Busybox是一个集成了一百多种常用linux命令和工具软件(openwrt下编译可以选择要哪些指令)。除了包含常规指令之外,Busybox还包含了grep find mount以及telnet http等复杂工具。其被戏称为Linux下的瑞士军刀。
看看有多少个命令是busybox实现的
root@OpenWrt:~# ls -l /bin/
常用文件夹
1. /etc/ 存放着系统全部的配置文件。
2. /etc/init.d/ 存放着启动的服务脚本。
3. /etc/config/ 存放着OpenWRT的配置文件包括网络等等。
4. /tmp/ 临时文件之外还存放着动态的配置文件。
5. /tmp/TZ 就是系统启动后所使用的时区参数。
6. 等等.....很多很多,我们以后慢慢来了解。
第一次接入网络
从后续的章节开始,我们要经常确保系统是在联网的状态。
这里我们介绍常见连接入网络的方法,使用一条可以连接外网的网线接入设备的WAN口(在教学底板靠近USB一侧的网口),接入成功后系统会有反应:
root@OpenWrt:~# [ 6815.200000] ralink_soc_eth 10100000.ethernet eth0: port 0 link up (100Mbps/Full duplex)
[ 6815.210000] br-lan: port 1(eth0.1) entered forwarding state
[ 6815.220000] br-lan: port 1(eth0.1) entered forwarding state
[ 6817.220000] br-lan: port 1(eth0.1) entered forwarding state
表示网络连接成功。
这时可以查看设备是否获得了上游路由器DHCP分配下来的IP地址(教学系统在默认情况下WAN 口为动态获取IP地址),使用命令ifconfig
root@OpenWrt:~# ifconfig
br-lan Link encap:Ethernet HWaddr 64:51:7E:33:98:44
inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fdb4:329c:dc0b::1/60 Scope:Global
inet6 addr: fe80::6651:7eff:fe33:9844/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:372 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:34464 (33.6 KiB)
eth0 Link encap:Ethernet HWaddr 64:51:7E:33:98:44
inet6 addr: fe80::6651:7eff:fe33:9844/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:431 errors:0 dropped:0 overruns:0 frame:0
TX packets:2478 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:131949 (128.8 KiB) TX bytes:816662 (797.5 KiB)
Interrupt:5
eth0.1 Link encap:Ethernet HWaddr 64:51:7E:33:98:44
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:140 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:12232 (11.9 KiB)
eth0.2 Link encap:Ethernet HWaddr 64:51:7E:33:98:45
inet addr:192.168.0.175 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::6651:7eff:fe33:9845/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:416 errors:0 dropped:0 overruns:0 frame:0
TX packets:2333 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:121890 (119.0 KiB) TX bytes:792463 (773.8 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:55313 errors:0 dropped:0 overruns:0 frame:0
TX packets:55313 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3764208 (3.5 MiB) TX bytes:3764208 (3.5 MiB)
网络设备eth0.2为WAN口设备,hoowa的板子已经获得了IP地址了。
使用ping命令测试网络是否通(键盘组合Ctrl+C中断测试)
root@OpenWrt:~# ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1): 56 data bytes
64 bytes from 192.168.0.1: seq=0 ttl=64 time=0.506 ms
64 bytes from 192.168.0.1: seq=1 ttl=64 time=0.405 ms
^C
--- 192.168.0.1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.405/0.455/0.506 ms
root@OpenWrt:~# ping www.geeqee.com
PING www.geeqee.com (114.215.133.69): 56 data bytes
64 bytes from 114.215.133.69: seq=0 ttl=53 time=33.405 ms
64 bytes from 114.215.133.69: seq=1 ttl=53 time=34.502 ms
64 bytes from 114.215.133.69: seq=2 ttl=53 time=41.986 ms
^C
--- www.geeqee.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 33.405/36.631/41.986 ms
软件包管理OPKG
在OpenWRT下使用的软件包管理技术叫做OPKG,他是一个轻量级的软件包技术,已经成为开源嵌入式的事实标准之一,他类似Centos下的yum可以实现对预编译的二进制软件下载。
OPKG语法格式
opkg [参数...] 子命令 [子参数...]
参数有:
update 下载服务器上可用的软件包列表,由于软件包列表可能会比较大因此并不保存在系统中,每次启动需要首先执行opkg update取得最新的软件包。
upgrade <包名> 升级软件包
install <包名> 安装软件包
configure <包名> 配置某一个软件包
remove <包名> 卸载软件包
list 列表出全部可用的软件包
list-installed 列表出已安装的软件包
list-upgradable 列表出可以升级的软件包
info [pkg|regexp] 显示出指定软件包的信息
status [pkg|regexp] 显示出制定软件包的当前状态
download <pkg> 下载一个软件包到当前文件夹(不安装)
--verbosity[=<level>] 显示信息等级:
0 只显示错误
1 正常信息(默认)
2 显示需要的信息
3 调试
4 调试2级
--force-overwrite 强制安装(谨慎使用)
--force-remove 强制删除(谨慎使用)
每次开机后执行OPKG安装之前都要先更新可获得软件包。
root@OpenWrt:~# opkg update
Downloading http://www.geeqee.com/axwrt/system/ramips/packages/base/Packages.gz.
Updated list of available packages in /var/opkg-lists/axwrt_base.
Downloading http://www.geeqee.com/axwrt/system/ramips/packages/luci/Packages.gz.
wget: server returned error: HTTP/1.1 404 Not Found
......
在执行过程中,会报几个错误,是有部分软件包库教学系统暂不需要因此不存在。
软件包的内核依赖问题
在OPKG安装软件包的时候,有时会提醒内核版本不匹配,提示内核版本不匹配,错误大概是这样:
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.
出现这个错误是因为服务器上的固件内核版本与设备上所安装的版本不一致,唯一的解决方法就是重新刷机。刷刷更健康的嘛,反正日后少不了刷~
OPKG的配置
查看OPKG配置文件
root@OpenWrt:~# cat /etc/opkg.conf
dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay
src/gz axwrt_base http://www.geeqee.com/axwrt/system/ramips/packages/base
src/gz axwrt_luci http://www.geeqee.com/axwrt/system/ramips/packages/luci
src/gz axwrt_management http://www.geeqee.com/axwrt/system/ramips/packages/management
src/gz axwrt_oldpackages http://www.geeqee.com/axwrt/system/ramips/packages/oldpackages
src/gz axwrt_packages http://www.geeqee.com/axwrt/system/ramips/packages/packages
src/gz axwrt_routing http://www.geeqee.com/axwrt/system/ramips/packages/routing
src/gz axwrt_telephony http://www.geeqee.com/axwrt/system/ramips/packages/telephony
dest root 安装目标根路径
dest ram 内存临时文件路径
lists_dir ext 软件包列表文件
option overlay_root 可写分区挂载位置
src/gz 下面的系列都是软件包分类获取地址
关于OPKG软件包!
在未来的章节中,我们将会再次介绍OPKG相关的内容,包括介绍如何自己制作OPKG软件包。届时,读者可以更容易的移植x86下的软件到OpenWRT中,也可以选择哪些软件包是要打到固件的ROM中,哪些是要动态安装的。
本章到这里结束了,介绍的知识都是干货,喝点水润下。关于软件包部分希望大家能多多练习,还是那句话hoowa的名言不怕弄坏系统,弄坏了就重新刷,就怕不弄。
相关图片:
↑图:DB120-WG升64M改散热送电源和TTL线,已刷最
↑图:uantum FW 64 Freewire Wireless TTL Adapt
↑图:614 V6刷了8M 64M的CFE,TTL显示出错,无法p
↑图:uantum FW 64 Freewire Wireless TTL Adapt
↑图:uantum FW 64 Freewire Wireless TTL Adapt
↑图:uantum FW 64 Freewire Wireless TTL Adapt
↑图:uantum FW 64 Freewire Wireless TTL Adapt
↑图:uantum FW 64 Freewire Wireless TTL Adapt
↑图:uantum FW 64 Freewire Wireless TTL Adapt
↑图:uantum FW 64 Freewire Wireless TTL Adapt
关键词: ttl64什么意思 ttl 64是什么系统