最近买了MT7621路由,还带sata口,就想适配一个系统,由于:
1.Openwrt官方trunk里面kmod-mt76驱动居然还停留在2016年6月,实测2.4G比较弱,所以不予考虑了,再看LEDE的snapshot,更新到2017年2月了,当然要选择LEDE了。
2.LEDE目前全面切换到了MUSL库,导致迅雷xware mipsel的32位uclibc版本直接不能用了,为了适配,所以必须编译一个基于uClibc库的系统,但是LEDE/OPENWRT的toolchain默认菜单里面都只有musl和glibc了,uclibc被标记为了broken。。。。所以必须自行研究。

折腾了大约1周,终于搞定了,步骤如下:
1.下载LEDE源码,这个很简单:

git clone https://git.lede-project.org/source.git
cd source
./scripts/feeds update -a
./scripts/feeds install -a

2.修改Toolchain,以便使用uClibc:
(1).修改/toolchain/Config.in

--- a/toolchain/Config.in
+++ b/toolchain/Config.in
 
 	config LIBC_USE_UCLIBC
 		select USE_UCLIBC
-		bool "Use uClibc"
+		bool "Use uClibc-ng"
 		depends on !(aarch64 || aarch64_be)
-		depends on BROKEN || !(arm || armeb || i386 || x86_64 || mips || mipsel || mips64 || mips64el || powerpc)

(2).修改/toolchain/uClibc/Makefile

--- a/toolchain/uClibc/Makefile
+++ b/toolchain/uClibc/Makefile

 define Host/SetToolchainInfo
 	$(SED) 's,^\(LIBC_TYPE\)=.*,\1=$(PKG_NAME),' $(TOOLCHAIN_DIR)/info.mk
-	$(SED) 's,^\(LIBC_URL\)=.*,\1=http://www.uclibc.org/,' $(TOOLCHAIN_DIR)/info.mk
+	$(SED) 's,^\(LIBC_URL\)=.*,\1=http://www.uclibc-ng.org/,' $(TOOLCHAIN_DIR)/info.mk
 	$(SED) 's,^\(LIBC_VERSION\)=.*,\1=$(PKG_VERSION),' $(TOOLCHAIN_DIR)/info.mk
 	$(SED) 's,^\(LIBC_SO_VERSION\)=.*,\1=$(LIBC_SO_VERSION),' $(TOOLCHAIN_DIR)/info.mk
 endef

(3).修改toolchain/uClibc/headers/Makefile

--- a/toolchain/uClibc/headers/Makefile
+++ b/toolchain/uClibc/headers/Makefile
 
 		CC="$(TARGET_CC)" \
 		CPU_CFLAGS="$(TARGET_CFLAGS)" \
 		ARCH="$(CONFIG_ARCH)" \
-		pregen \
 		install_headers
 endef

(4).如果要修改使用的uclibc-ng版本,需要修改toolchain/uClibc/common.mk里面的版本号和对应sha值,默认1.0.22不用修改了。

上述修改完成后,后续make menuconfig里面就可以选择到uclibc-ng了。

3.编译系统

make menuconfig

通过advanced configuration options (for developers) > Toolchain Options > c library > uclibc-ng
其他自己选择。保存.config后,输入:

nohup ./autocompile.sh &

自动编译脚本autocompile.sh 内容为:

if [ "$1" != "-f" ] ; then
        IGNORE_ERRORS=1 make 2>&1| tee errors.txt

        rm build_*.txt
fi

for i in $(grep "failed to build" errors.txt | sed 's/^.*ERROR:[[:space:]]*\([^[:space:]].*\) failed to build.*$/\1/' ) ; do
        if [ "$i" != "" ] ; then
                echo Compiling: ${i}
                make ${i}-compile V=99 > build_${i##*/}.txt 2>&1 || echo ${i} : Build failed, see build_${i##*/}.txt
        fi
done

等几个小时以后就可以在source/bin目录下找到编译完成的系统了,编译过程中另外一个ssh登录,通过errors.txt和nohup.out查看编译进度,原ssh窗口可以关闭。

4.安装系统,配置调试迅雷
可以通过命令行sysupgrade -v xxxx.bin或者通过luci网页升级系统。
升级完成后,由于uclibc-ng 1.0.18及之后版本将libpthread, libcrypt, libdl, libm, libutil等库合并到了libuClibc中,需要link一些libuClibc,以便迅雷xware可以使用:

cd /lib
ln -s libuClibc-1.0.22.so libdl.so.0
ln -s libuClibc-1.0.22.so  libpthread.so.0 

然后将Xware1.0.31_mipsel_32_uclibc上传路由,运行:

root@LEDE:~/xunlei# ./portal
initing...
try stopping xunlei service first...
killall: ETMDaemon: no process killed
killall: EmbedThunderManager: no process killed
killall: vod_httpserver: no process killed
setting xunlei runtime env...
port: 9000 is usable.

YOUR CONTROL PORT IS: 9000

starting xunlei service...
etm path: /root/xunlei
execv: /root/xunlei/lib/ETMDaemon.

getting xunlei service info...
Connecting to 127.0.0.1:9000 (127.0.0.1:9000)

THE ACTIVE CODE IS: 

常用软件例如chinadns可使用imagebuilder编译。
**</p>

参考文档:
1.http://lists.infradead.org/pipermail/lede-dev/2016-June/001145.html
2.https://lists.openwrt.org/pipermail/openwrt-devel/2009-June/004411.html
3.https://www.mail-archive.com/lede-dev@lists.infradead.org/msg05838.html