小米路由内核开发环境搭建

来自Jack's Lab
(版本间的差异)
跳转到: 导航, 搜索
(网络环境)
 
(未显示1个用户的13个中间版本)
第1行: 第1行:
 +
== 网络环境 ==
 +
 +
CFE 默认配置的 IP 为 192.168.1.1
 +
 +
故而先用网线接小米路由的LAN口(黑色的口),另一头接PC机网口,或者PC机网口所接的HUB,并为 PC 再配一个 ip 为 192.168.1.2 的地址:
 +
 +
<source lang=bash>
 +
$ sudo ifconfig eth0:1 192.168.1.2
 +
</source>
 +
 +
这样你的PC就能和小米路由在同一子网,小米路由也能直接访问你的PC服务
 +
 +
<br><br>
 +
 +
== tftp 服务准备 ==
 +
 +
先安装 tftp 服务器,Debian/Ubuntu下直接:
 +
 +
<source lang=bash>
 +
$ sudo apt-get install tftpd tftp
 +
</source>
 +
 +
tftp 服务寄生于 xinetd,因而需要在 /etc/xinetd.d/ 目录下建一个 tftp 的文件,内容为:
 +
 +
<source lang=bash>
 +
$ ls /etc/xinetd.d/
 +
chargen  daytime  discard  echo  tftp  time
 +
 +
$ 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
 +
 +
$ cp vmlinuz /tftpboot
 +
</source>
 +
 +
配置的服务根目录在 /tftpboot,放一个 vmlinuz 文件在这个目录下
 +
 +
建好后,重启一下 xinetd 服务:
 +
 +
<source lang=bash>
 +
$ sudo /etc/init.d/xinetd restart
 +
 +
$ cd /tmp
 +
 +
$ tftp localhost
 +
tftp> get vmlinuz
 +
Received 2468257 bytes in 0.1 seconds
 +
tftp> quit
 +
 +
$ ls vmlinuz
 +
vmlinuz
 +
</source>
 +
 +
tftp 客户端测了一下,获取文件正常,表示我们的 tftp 服务配置好了
 +
 +
<br><br>
 +
 +
== NFS 服务准备 ==
 +
 +
安装 nfs server:
 +
 +
<source lang=bash>
 +
$ sudo apt-get install nfs-kernel-server
 +
</source>
 +
 +
在文件 /etc/exports 加入你要作为 nfs server 对外可 mount 的目录:
 +
 +
<source lang=bash>
 +
/tftpboot/rootfs    *(async,rw,insecure,insecure_locks,no_root_squash)
 +
</source>
 +
 +
重启 nfs server:
 +
 +
<source lang=bash>
 +
$ sudo /etc/init.d/nfs-kernel-server restart
 +
</source>
 +
 +
 +
测试下,是否可 mount:
 +
 +
<source lang=bash>
 +
$ sudo mount -t nfs 192.168.31.2:/tftpboot/rootfs /mnt
 +
</source>
 +
 +
 +
打开内核如下选项:
 +
 +
  CONFIG_IP_PNP=y
 +
  CONFIG_NFS_FS=y
 +
  CONFIG_ROOT_NFS=y
 +
 +
 +
<br><br>
 +
 +
== 环境确认 ==
 +
 
当前路由刷入的固件版本为 0.4.58
 
当前路由刷入的固件版本为 0.4.58
  
第44行: 第154行:
 
root@XiaoQiang:/# nvram set flag_tftp_bootup=on
 
root@XiaoQiang:/# nvram set flag_tftp_bootup=on
 
root@XiaoQiang:/# nvram commit
 
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: ........ 5704544 bytes read
 +
Entry at 0x00008000
 +
Closing network.
 +
Starting program at 0x00008000
 
</source>
 
</source>
 +
 +
 +
CFE 从 tftp 服务加载 vmlinuz 并启动正常的话,内核验证环境就算搭好了
  
 
<br><br>
 
<br><br>
 +
 +
== 编译环境 ==
 +
 +
内核的编译,需要一个支持ARM Cortex A9的工具链,工具链的相关信息参考:[[小米路由相关工具链]]
 +
 +
 +
目前暂时用 Broadcom 推荐的 hndtools-arm-linux-2.6.36-uclibc-4.5.3
 +
 +
解压后,把 /path/to/hndtools-arm-linux-2.6.36-uclibc-4.5.3/bin/ 加到环境变量 PATH 里即可
 +
 +
  export PATH=/path/to/hndtools-arm-linux-2.6.36-uclibc-4.5.3/bin/:$PATH
 +
 +
 +
编译时来到内核源码目录下,如下命令编译内核:
 +
 +
<source lang=bash>
 +
$ make ARCH=arm CROSS_COMPILE=arm-brcm-linux-uclibcgnueabi- vmlinux -j8
 +
</source>
 +
 +
 +
编译完生成的是一个 ELF 格式的文件 vmlinux,需要做一些处理,转成这个 CFE 可认的 binary 格式,并用 lzma 压缩一下:
 +
 +
<source lang=bash>
 +
$ arm-brcm-linux-uclibcgnueabi-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S vmlinux vmlinuz
 +
$ lzma -1 vmlinuz        # 压缩后的文件为 vmlinuz.lzma
 +
$ cp vmlinuz.lzma /tftpboot/vmlinuz
 +
</source>
 +
 +
重启小米路由进行测试
 +
 
<br><br>
 
<br><br>
 
<br><br>
 
<br><br>

2014年6月20日 (五) 20:53的最后版本

目录

[编辑] 1 网络环境

CFE 默认配置的 IP 为 192.168.1.1

故而先用网线接小米路由的LAN口(黑色的口),另一头接PC机网口,或者PC机网口所接的HUB,并为 PC 再配一个 ip 为 192.168.1.2 的地址:

$ sudo ifconfig eth0:1 192.168.1.2

这样你的PC就能和小米路由在同一子网,小米路由也能直接访问你的PC服务



[编辑] 2 tftp 服务准备

先安装 tftp 服务器,Debian/Ubuntu下直接:

$ sudo apt-get install tftpd tftp

tftp 服务寄生于 xinetd,因而需要在 /etc/xinetd.d/ 目录下建一个 tftp 的文件,内容为:

$ ls /etc/xinetd.d/
chargen  daytime  discard  echo  tftp  time

$ 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

$ cp vmlinuz /tftpboot

配置的服务根目录在 /tftpboot,放一个 vmlinuz 文件在这个目录下

建好后,重启一下 xinetd 服务:

$ sudo /etc/init.d/xinetd restart

$ cd /tmp

$ tftp localhost
tftp> get vmlinuz
Received 2468257 bytes in 0.1 seconds
tftp> quit

$ ls vmlinuz
vmlinuz

tftp 客户端测了一下,获取文件正常,表示我们的 tftp 服务配置好了



[编辑] 3 NFS 服务准备

安装 nfs server:

$ sudo apt-get install nfs-kernel-server

在文件 /etc/exports 加入你要作为 nfs server 对外可 mount 的目录:

/tftpboot/rootfs    *(async,rw,insecure,insecure_locks,no_root_squash)

重启 nfs server:

$ sudo /etc/init.d/nfs-kernel-server restart


测试下,是否可 mount:

$ sudo mount -t nfs 192.168.31.2:/tftpboot/rootfs /mnt


打开内核如下选项:

 CONFIG_IP_PNP=y
 CONFIG_NFS_FS=y
 CONFIG_ROOT_NFS=y




[编辑] 4 环境确认

当前路由刷入的固件版本为 0.4.58

则先从当前版本固件内 mkxqimage -x 解压出 vmlinuz.trx 去除 TRX 头:

comcat@jackslab:/work/openwrt/xiaomi/rom/0.4.58$ dd if=vmlinuz.trx of=vmlinuz bs=1 skip=28
记录了2834404+0 的读入
记录了2834404+0 的写出
2834404字节(2.8 MB)已复制,4.10377 秒,691 kB/秒


得到的 vmlinuz 是一个 LZMA 压缩过的内核+initramfs,Build 日期为 Wed Apr 30 18:03:21 CST 2014 的CFE是可以直接加载后启动的(刷过 0.4.92版本固件的,都是这个版本的CFE):

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)
Copyright (C) 2000-2008 Broadcom Corporation.

......

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
Startup canceled
xiaomi> ^C
xiaomi> 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: ........ 5670784 bytes read
Entry at 0x00008000
Closing network.
Starting program at 0x00008000
console [ttyS0] enabled, bootconsole disabled
serial8250.0: ttyS1 at MMIO 0x18000400 (irq = 117) is a 16550
......


设置 nvram 参数 flag_tftp_bootup=on,则打开 CFE 首先尝试从 tftp server 加载内核:

root@XiaoQiang:/# nvram get flag_tftp_bootup
off
root@XiaoQiang:/# nvram set flag_tftp_bootup=on
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: ........ 5704544 bytes read
Entry at 0x00008000
Closing network.
Starting program at 0x00008000


CFE 从 tftp 服务加载 vmlinuz 并启动正常的话,内核验证环境就算搭好了



[编辑] 5 编译环境

内核的编译,需要一个支持ARM Cortex A9的工具链,工具链的相关信息参考:小米路由相关工具链


目前暂时用 Broadcom 推荐的 hndtools-arm-linux-2.6.36-uclibc-4.5.3

解压后,把 /path/to/hndtools-arm-linux-2.6.36-uclibc-4.5.3/bin/ 加到环境变量 PATH 里即可

 export PATH=/path/to/hndtools-arm-linux-2.6.36-uclibc-4.5.3/bin/:$PATH


编译时来到内核源码目录下,如下命令编译内核:

$ make ARCH=arm CROSS_COMPILE=arm-brcm-linux-uclibcgnueabi- vmlinux -j8


编译完生成的是一个 ELF 格式的文件 vmlinux,需要做一些处理,转成这个 CFE 可认的 binary 格式,并用 lzma 压缩一下:

$ arm-brcm-linux-uclibcgnueabi-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S vmlinux vmlinuz
$ lzma -1 vmlinuz        # 压缩后的文件为 vmlinuz.lzma
$ cp vmlinuz.lzma /tftpboot/vmlinuz

重启小米路由进行测试



































个人工具
名字空间

变换
操作
导航
工具箱