小米路由内核开发环境搭建
(以“当前路由刷入的固件版本为 0.4.58 则先从当前版本固件内 mkxqimage -x 解压出 vmlinuz.trx 去除 TRX 头: <source lang=bash> comcat@jackslab:...”为内容创建页面) |
(→网络环境) |
||
(未显示1个用户的15个中间版本) | |||
第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 | ||
第11行: | 第121行: | ||
− | 得到的 vmlinuz 是一个 LZMA 压缩过的内核+initramfs,Build 日期为 Wed Apr 30 18:03:21 CST 2014 的CFE是可以直接加载后启动的(刷过 0.4.92版本固件的,都是这个版本的CFE) | + | 得到的 vmlinuz 是一个 LZMA 压缩过的内核+initramfs,Build 日期为 Wed Apr 30 18:03:21 CST 2014 的CFE是可以直接加载后启动的(刷过 0.4.92版本固件的,都是这个版本的CFE): |
+ | |||
+ | <source lang=bash> | ||
+ | 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 | ||
+ | ...... | ||
+ | </source> | ||
+ | |||
+ | |||
+ | 设置 nvram 参数 flag_tftp_bootup=on,则打开 CFE 首先尝试从 tftp server 加载内核: | ||
+ | |||
+ | <source lang=bash> | ||
+ | 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 | ||
+ | </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
重启小米路由进行测试