移植python到小米路由器记录。

最近抢了一个小米路由器,研究了一下,总的来说现在看起来功能还很少。现在比较有用的功能就是,远程下载功能,支持迅雷,电驴等,不过现在看电影啥的都是直接在线看的,基本上也很少用。检测连接的智能设备,这个功能可以随时查看是否有人曾网,当然也可以用来在远程监控家里都有谁在用路由器。以后应该会有更多的功能扩展,不过这应该是一个漫长的过程,我先自己弄点东西上去玩玩,首先把常用的python移植上去。

记录移植的过程,给需要的人,也方便自己以后查看。


首先通过ssh连接到路由器上面,小米路由器默认是没有开启ssh的需要手动开启。开启方法如下:

登录到路由器上面,

http://miwifi.com/cgi-bin/luci/;stok=6aab8cd9505eb84bef6af9c60f7af288/web/home

把链接最后的/web/home

用下面的字符串替换

 /api/xqsystem/upgrade_rom?url=%3Bnvram+set+ssh_en%3D1%3Bnvram+commit%3B%2Fetc%2Finit.d%2Fdropbear+start%3B

如果浏览器返回 {"code":0}:就表示成功了

可以通过ssh [email protected]连接到路由器上,用密码是admin。

编译arm 上面的python网上文章很多,我主要是参考这篇http://randomsplat.com/id5-cross-compiling-python-for-embedded-linux.html。

本来想编译最新的2.7.6但是懒得制作补丁就直接从网站上面下载2.7.3补丁和python2.7.3来编译。

python的交叉编译和其他的交叉编译有点不一样的是需要先编译个x86版本的的python语法解释器。

./configure

make python Parser/pgen

mv python hostpython

mv Parser/pgen Parser/hostpgen

make distclean

然后打补丁交叉编译python

patch -p1 < Python-2.7.2-xcompile.patch

配置arm的交叉编译环境。

一开始我直接下的arm-4.3.3来编译,编译好后放到路由器上面提示-ash 找不到程序,查找了一下发现时编译器太旧的缘故。看了一下小米是基于openwrt开发的我这边正好也有openwrt的编译环境,于是想简单配置一下,用openwrt的编译出来的交叉编译器来编译python.

修改如下

make menuconfig

Target  System 选择"Broadcom BCM47XX/53XX with arm cpu",其他默认好了。

然后

make V=99 -j4

如果以前没有编译过openwrt可能比较慢。

编译成功后,切换到python目录下,导出编译环境变量

export PATH=$PAHT:~/openwrt/staging_dir/toolchain-arm_cortex-a9_gcc-4.8-linaro_uClibc-0.9.33.2_eabi/bin/
export STAGE_DIR=~/openwrt/staging_dir/

这里换成自己的openwrt目录就好了,默认的gcc 是4.6版本,我这边修改成了4.8,我是直接改.config文件的(因为不知到在哪里修改,所以就直接修改.config文件了)

CONFIG_GCC_VERSION_4_8_LINARO=y
CONFIG_GCC_VERSION="4.8-linaro"
CONFIG_GCC_VERSION_4_8=y
然后运行

make HOSTPYTHON=./hostpython HOSTPGEN=./Parser/hostpgen BLDSHARED="arm-openwrt-linux-gcc -shared" CROSS_COMPILE=arm-openwrt-linux- CROSS_COMPILE_TARGET=yes     HOSTARCH=arm-linux BUILDARCH=x86_64-linux-gnu

编译没有问题,放到到小米设备上面结果提示找不到__ctype_b等符号,把小米的设备上面的libc.so.0导出来用arm-openwrt-linux-readelf查看发现libc.so.0导出的符号是__ctype_b_loc。在网上找了半天,都说是编译器太旧,可我用的已经是4.8比较新了,所以猜不是这个问题。

于是翻uClibc的代码,发现这个变量是通过一个__UCLIBC_HAS_XLOCALE__宏来控制的,觉得肯定是编译uClibC有开关,于是用find命令终于在 toolchain/uClibc/config-0.9.33.2/common文件找到了这个配置UCLIBC_HAS_XLOCALE,把这个开关打开

UCLIBC_HAS_XLOCALE=y

重新编译openwrt,这里需要运行make dirclean,经过漫长的过程,编译Ok后,按照上面编译python的步骤重新来一次,放到小米路由器上运行python命令果然没有问题看到了python的交互界面。

接下来就是稍微配置一下环境变量,我把python放到了路由器上的/userdisk/python目录下

修改/etc/profile 文件在里面添加。

export PYTHONHOME=/userdisk/python/
export PATH=$PATH/userdisk/python/bin

添加上面的就OK了,下一步想把goagent放上去,这个等我有时间在来移植吧。




你可能感兴趣的:(openwrt)