小米路由器(R1D) 是基於 OpenWrt 深度定製的一款智能路由器
因為屬於深度定製的架構,加上沒有 open source 並且使用非常舊的版本和 kernel
又鸚鵡對 openwrt 的系統架構完全不熟悉,只有基礎的 linux 底子
所以早前在 cross complie (交叉編譯) 時其實遇到很多問題
雖然最後成功編譯出 privoxy,但也早就忘了環境建置的過程和步驟
這次因為企圖嘗試編譯出 核心模組(kernel module)
所以不單單只是 toolchain 搞定就好,還需要 kernel 的 source
對於沒有自己從 source code 編譯過 kernel 的我來說,其實也只能慢慢爬文
所以就順道寫成文章,省去日後重新建置的時間
小米路由器系統資訊
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
root@XiaoQiang:~# uname -a Linux XiaoQiang 2.6.36 #1 SMP PREEMPT Wed May 11 21:44:23 CST 2016 armv7l GNU/Linux root@XiaoQiang:~# cat /etc/openwrt_version 12.09.1 root@XiaoQiang:~# cat /etc/openwrt_release DISTRIB_ID="OpenWrt" DISTRIB_RELEASE="Attitude Adjustment" DISTRIB_REVISION="unknown" DISTRIB_CODENAME="attitude_adjustment" DISTRIB_TARGET="brcm4709/R1D" DISTRIB_DESCRIPTION="OpenWrt Attitude Adjustment 12.09.1" root@XiaoQiang:~# |
OpenWrt 官方版本:Attitude Adjustment 12.09
稍微了解 OpenWrt 的開發環境後,下載官方提供的 ImageBuilder
但其中使用的 kernel 是 3.3.8,與小米官方使用的 2.6.36 不同
所以決定自行下載小米的 toolchain 和 kernel 2.6.36 的 source code
kernel 2.6.36 在 The Linux Kernel Archives 可以下載
小米路由器 toolchain 載點:32位元 (131MB) / 64位元 (78MB)
其他 library 載點參考: 小米路由器插件开发文档
因為鸚鵡原本已經有使用 Oracle VM VirtualBox 弄一個 CentOS 7 x64 來當測試平台
所以直接把 64位元 的包解壓縮後卻發現根本是 32位元 的…
解決方式是安裝了 glibc.i686
1 2 3 |
[root@localhost arm-xiaomi-linux-uclibcgnueabi]# ./bin/arm-xiaomi-linux-uclibcgnueabi-gcc -v -bash: ./bin/arm-xiaomi-linux-uclibcgnueabi-gcc: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory [root@localhost arm-xiaomi-linux-uclibcgnueabi]# yum install glibc.i686 |
因為 64位元 與 32位元 的包檔案大小差異不小
所以乾脆直接使用 32位元 的包,使用 unzip 來解壓縮卻發生錯誤,結果原來是 tar 格式
1 2 3 4 5 6 7 8 9 10 11 |
[root@localhost download]# unzip r1d_x86_xiaomi_toolchain.zip Archive: r1d_x86_xiaomi_toolchain.zip End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes one disk of a multi-part archive. In the latter case the central directory and zipfile comment will be found on the last disk(s) of this archive. unzip: cannot find zipfile directory in one of r1d_x86_xiaomi_toolchain.zip or r1d_x86_xiaomi_toolchain.zip.zip, and cannot find r1d_x86_xiaomi_toolchain.zip.ZIP, period. [root@localhost download]# file r1d_x86_xiaomi_toolchain.zip r1d_x86_xiaomi_toolchain.zip: POSIX tar archive (GNU) [root@localhost download]# |
用 tar 解開(tar xvf r1d_x86_xiaomi_toolchain.zip)即可
路徑說明:
toolchain 路徑:/miwifi/toolchain
toolchain 下載至:/miwifi/toolchain/download (檔名 r1d_x86_xiaomi_toolchain.zip)
1 2 3 4 5 |
[root@localhost toolchain]# cd ~ [root@localhost ~]# cd /miwifi/toolchain/ [root@localhost toolchain]# tar xvf ./download/r1d_x86_xiaomi_toolchain.zip [root@localhost toolchain]# export PATH=/miwifi/toochain/arm-xiaomi-linux-uclibcgnueabi/bin:$PATH [root@localhost toolchain]# |
嘗試編譯時 顯示錯誤,找不到 libz.so.1,安裝 libz.i686 後可正常編譯
編譯了一個 hello.c 放到 路由器上 可正常執行
下一步:開始使用 cross complier 編譯 核心模組