-
Notifications
You must be signed in to change notification settings - Fork 143
/
README.cn
305 lines (195 loc) · 10.6 KB
/
README.cn
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
小米路由核心系统支持包
===
现有的核心包支持小米路由(型号R1D,即带1T硬盘版本)。
核心包含有小米路由器的内核源码(内核版本2.6.36),主SoC厂商Broadcom的官方工具链
和一个在原ROM基础上叠加了 Debian 核心系统的混合系统 (ROOT FS)
概览
---
编译、TFTP部署、NFS文件系统部署视频演示: http://v.youku.com/v_show/id_XNzQ4OTU2Njg4.html
启动及核心功能视频演示: http://v.youku.com/v_show/id_XNzQ4OTkzNDgw.html
小米路由的无线部分,2.5G和5G用的芯片和华硕 ASUS RT-AC56U 一致,处理器部分也和
RT-AC56U 相似,因此核心包的内核是基于 RT-AC56U 的官方开源版本开发,后期发现其
实博通(Broadcom) 的这个系列的WiFi芯片给的Linux驱动都一样,业界惯例,都没有源码,
只有预编译好的二进制文件
WiFi驱动编译后是名为 wl.ko 的模块,位于:kernel/linux-2.6.36/drivers/net/wl/ 下,
这个与博通(Broadcom)官方SDK一致,应该也与小米拿到的一致,最多有些小Bug的fix
BCM4709 带的以太网,其 Linux 驱动是有源码的,位于:
kernel/linux-2.6.36/drivers/net/et/ 下,这个也与博通(Broadcom)官方SDK一致
更多信息,可参考这个页面: [小米路由核心分析](http://wiki.jackslab.org/%E5%B0%8F%E7%B1%B3%E8%B7%AF%E7%94%B1%E6%94%B9%E7%A7%81%E6%9C%89%E4%BA%91)
整个系统除支持原ROM的核心功能外,自带 Debian 核心环境,可用apt-get install 直接
安装你想要的软件包,相当方便
核心包编译出的 rootfs 可直接部署在路由内硬盘的第四个分区上,亦可部署在 NFS server
上
尝试使用指南
===
初次尝试建议使用 tftp 加载内核,挂载 NFS 文件系统,内核和rootfs都在PC上,不会改变原路由的结构
待得测试、调试稳定后,再将内核裁减后部署到flash.os分区上(可在miwifi目录下执行 'make nonfs' 即可生成裁减后的内核),NFS文件系统打包后,部署到 /dev/sda4 上,详细参考本页的“注意事项”
以下在 Ubuntu 12.04 验证通过
源码下载编译
---
$ sudo apt-get install lzma
确保 lzma 的版本是:
$ lzma --version
LZMA command line tool 9.22
LZMA SDK 9.22
貌似新系统里的 lzma 被 xz-utils 替代,造成内核编译后的 vmlinuz 的头缺少解压后的长度信息,进而在 CFE 里解压失败
$ git clone git://github.com/comcat/miwifi.git
$ cd miwifi/
$ make
vmlinuz 为可直接被 CFE 加载的内核镜像(内含ramfs)
jarvis-rootfs.tgz 为 rootfs 包。用户 'root' 的默认密码为 'admin',WiFi 的SSID 为 Jarvis 和 Jarvis_5G,密码为 'qwer1234'
配置网络
---
我们在PC上部署 tftp server 和 NFS server,因此需要一根网线连接路由WAN口边上的LAN口到PC网口连接的HUB上,保证PC和路由在局域网内能通信
小米路由启动时,CFE (bootloader) 会检测 nvram 中的 flag_tftp_bootup 这个参数,如果其值为 on,其会首先尝试tftp加载 192.168.1.2:/vmlinuz 这个路径。因此我们要为 PC 配一个 192.168.1.2 的IP:
$ sudo ifconfig eth0:0 192.168.1.2
另,路由启动后,其为LAN口配的地址为 192.168.31.1 ,为保证PC能访问其 web 配置界面,也为 PC 配一个 192.168.31.2 的IP:
$ sudo ifconfig eth0:1 192.168.31.2
部署内核和文件系统
---
x. 安装配置 tftp 服务器
$ sudo apt-get install tftpd tftp
$ cat /etc/xinetd.d/tftp
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
$ sudo mkdir /tftpboot
$ sudo chmod 777 /tftpboot
$ sudo /etc/init.d/xinetd restart
到此 tftp Server 安装成功,把编译好的内核 vmlinuz 拷到 /tftpboot 目录下:
$ cp /path/to/miwifi/vmlinuz /tftpboot/
用 tftp 测试 tftp server 是否正常:
$ tftp
> connect 192.168.1.2
> get vmlinuz # 获取tftp server 上的根目录下的 vmlinuz 文件
x. 安装配置 nfs 服务器
$ sudo apt-get install nfs-kernel-server
Config the nfs directory:
$ sudo mkdir -p /tftpboot/rootfs
$ cat /etc/exports
/tftpboot/rootfs *(async,rw,insecure,insecure_locks,no_root_squash)
$ sudo /etc/init.d/nfs-kernel-server restart
验证 NFS Server:
$ sudo mount -t nfs 192.168.31.2:/tftpboot/rootfs /mnt
设置nvram变量
---
PC 上 SSH 登录已经打开SSH服务的小米路由:
comcat@jackslab:$ ssh [email protected]
[email protected]'s password:
BusyBox v1.19.4 (2014-04-26 02:37:48 CST) built-in shell (ash)
Enter 'help' for a list of built-in commands.
-----------------------------------------------------
Welcome to XiaoQiang!
-----------------------------------------------------
root@XiaoQiang:/# nvram get flag_tftp_bootup
off
root@XiaoQiang:/# nvram set flag_tftp_bootup=on
root@XiaoQiang:/# nvram set rootfs=nfs # 指示内核从NFS启动
root@XiaoQiang:/# nvram commit
root@XiaoQiang:/# reboot
加载内核启动
---
CFE version v1.0.4
BSP: 6.37.14.34 (r415984) based on BBP 1.0.37 for BCM947XX (32bit,SP,)
Build Date: Wed Apr 30 18:03:21 CST 2014 (szy@shenzhiyong-ct)
...........
Device eth0: hwaddr 8C-BE-BE-20-B7-48, ipaddr 192.168.1.1, mask 255.255.255.0
gateway not set, nameserver not set
********** flag_tftp_bootup=on **********
tftp network: ifconfig eth0 -addr=192.168.1.1 -mask=255.255.255.0 -gw=192.168.1.1
Device eth0: hwaddr 8C-BE-BE-20-B7-48, ipaddr 192.168.1.1, mask 255.255.255.0
gateway 192.168.1.1, nameserver not set
kernel: boot -raw -z -addr=0x8000 -max=0x800000 192.168.1.2:vmlinuz
Loader:raw Filesys:tftp Dev:eth0 File:192.168.1.2:vmlinuz Options:(null)
Loading: ......... 6057024 bytes read
Entry at 0x00008000
Closing network.
Starting program at 0x00008000
Linux version 2.6.36.4jackslab (comcat@jackslab) (gcc version 4.5.3 (Buildroot 2012.02)
) #1 SMP PREEMPT Wed Jul 30 19:44:09 CST 2014
CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=10c53c7f
CPU: VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
Machine: Northstar Prototype
......
......
......
......
刷机指南
===
TFTP + NFS 调试系统完成后,系统稳定的话,就可以将内核部署在 /dev/mtd1 (os) 或者 /dev/mtd2 (os1) 上
指示 CFE 启动时是加载 /dev/mtd1 (flash.os1) 上的内核还是 /dev/mtd2 (flash.os2) 上的内核,可以通过 nvram 变量 flag_last_success 来完成
文件系统则部署在 /dev/sda4 上,内核启动时检测 nvram 中 rootfs 这个参数,如其值为 'sata' 则挂载 /dev/sda4 作为文件系统,如果你想用 u 盘的话,记得分四个区,把系统解压到 /dev/sda4 上,或者干脆修改内核目录下 usr/ramfs/init 脚本
以下在 Ubuntu 12.04 验证通过
源码下载编译
---
$ sudo apt-get install lzma
$ git clone git://github.com/comcat/miwifi.git
$ cd miwifi/
$ make nonfs
vmlinuz.trx 为可直接被 CFE 从flash加载的内核镜像(内含ramfs),大小小于 3MB,可以放入 mtd1/mtd2,这两个分区的大小为 3MB
jarvis-rootfs.tgz 为 rootfs 包。用户 'root' 的默认密码为 'admin',WiFi 的SSID 为 Jarvis 和 Jarvis_5G,密码为 'qwer1234'
部署内核和文件系统
---
如果是在原官方系统里部署,可以先将内核和文件系统 scp 拷贝的 /userdisk 下,这个目录默认挂载的是 /dev/sda4 是1T硬盘里最大的分区,用于用户下载等各种数据的存储
$ scp vmlinuz.trx [email protected]:/userdisk/
[email protected]'s password:
vmlinuz
$ scp jarvis-rootfs.tgz [email protected]:/userdisk/
[email protected]'s password:
jarvis-rootfs.tgz
PC 上 SSH 登录已经打开SSH服务的小米路由后,部署文件系统:
root@XiaoQiang:/# mount | grep userdisk
/dev/sda4 on /userdisk type ext4 (rw,noatime,barrier=1,data=ordered)
root@XiaoQiang:/# tar zxpf /userdisk/jarvis-rootfs.tgz -C /userdisk/
部署内核,此例中我们把自己的内核部署在 /dev/mtd2 上:
root@XiaoQiang:/# cat /proc/mtd
dev: size erasesize name
mtd0: 00040000 00010000 "boot"
mtd1: 00300000 00010000 "os"
mtd2: 00300000 00010000 "os1"
mtd3: 00890000 00010000 "squashfs"
mtd4: 00010000 00010000 "crash"
mtd5: 00100000 00010000 "overlay"
mtd6: 00010000 00010000 "board_data"
mtd7: 00010000 00010000 "nvram"
mtd8: 00fe0000 00010000 "firmware"
root@XiaoQiang:/# mtd write /userdisk/vmlinuz.trx os1
Unlocking os1 ...
Writing from /userdisk/vmlinuz.trx to os1 ...
设置nvram变量
---
nvram 变量 flag_last_success 为 0,从 flash.os1 启动;为 1,则从 flash.os2 启动
root@XiaoQiang:/# nvram set flag_tftp_bootup=off # 先把 tftp 启动关了
root@XiaoQiang:/# nvram get flag_last_success
0
root@XiaoQiang:/# nvram set flag_last_success=1 # 从 flash.os2 (/dev/mtd2) 启动
root@XiaoQiang:/# nvram set rootfs=sata
root@XiaoQiang:/# nvram commit
注意事项
===
核心包自带的文件系统(ROOTFS)的目的,主要是为了验证内核的各个子系统和驱动是否工
作正常,主要是SATA硬盘、WiFi、Ethernet、Flash等,故而系统启动后,自动启动的服务
极少,保证WiFi能联外网,局域网能工作,Web控制界面能登陆即可。其中 fw3 服务启动
时加载原有规则老失败,这应该是个Bug,现有的解决方案是直接写 iptables 的规则,绕
过去了,这个以后应该会解决。
初次使用的朋友,建议先按上面的步骤用 tftp 和 nfs 加载一下,看是否能工作,然后再
自己调整系统服务和安装自己要用的软件包,反正所有的操作都在 nfs 上,不会改变原有
的系统,待系统稳定后再把NFS的目录打个tar包部署在 /dev/sda4 上不迟
现在核心包默认使用NFS方式,这个造成了编译后生成的 vmlinuz 内核镜像超过了 3MB,如
果您尝试稳定后,打算直接把内核部署到flash.os/flash.os2上,可将
kernel/linux-2.6.36/usr/ramfs/usr/bin/busybox 删除,再将内核配置里的NFS关闭,即
可将内核镜像的大小控制在2.7MB左右
当然您要是让内核从 /dev/sda4 启动,记得设置 nvram:
# nvram set flag_tftp_bootup=off
# nvram set rootfs=sata
# nvram commit