海信MP800H官方固件里的
busybox版本是1.1.3,是2006年发布的,确实有点老旧。最新的稳定版是2009年12月发布的1.15.3,与1.1.3版相比修正了很多bug并增加了一些新的应用程序(applet),特别是增加了ftpd。当然也有一些应用被删除了:e2fsprogs(ext2/ext3文件系统工具: mke2fs, e2fsck, tune2fs等),原因是它相对于busybox来说太大了。其实e2fsprogs并非播放机必需的,而且这些工具可以在台式机上获得。因此我决定要把busybox升级到1.15.3。
华硕公布的源码中busybox-1.1.3有一部分被修改过,其中init增加了对SIGABRT(6)信号的处理,当init进程收到此信号时(kill -6 1),将触发固件升级程序。详细过程请看/etc/reexec_init下的脚本。我希望能保留该功能,将它移植到1.15.3(见补丁:
busybox-1.15.3-reexec_init.patch.zip)
另外,目前busybox测试版1.16.0中新增了ntpd,我把它给backport到1.15.3(见补丁:
busybox-1.15.3-ntpd.patch.zip)。ntpd 对MP800H来说相当重要,因为播放机没有电池为时钟供电,只要重新加电系统时间就会重置,有了ntpd就可实现与ntp服务器自动时间同步。
编译busybox-1.15.3
1) 下载源码
http://www.busybox.net/downloads/busybox-1.15.3.tar.bz22) 解压
1 $ tar jxf busybox-1.15.3.tar.bz2
3) 打补丁
1 $ ls -l
2 总用量 113
3 drwxr-xr-x 31 user users 1224 2009-12-13 05:18 busybox-1.15.3
4 -rw-r--r-- 1 user users 108352 2010-03-16 14:51 busybox-1.15.3-ntpd.patch
5 -rw-r--r-- 1 user users 3216 2010-03-16 14:51 busybox-1.15.3-reexec_init.patch
6 $ cd busybox-1.15.3/
7 $ patch -p1 < ../BusyBox-1.15.3-ntpd.patch
8 patching file include/applets.h
9 patching file include/libbb.h
10 patching file include/usage.h
11 patching file libbb/messages.c
12 patching file networking/Config.in
13 patching file networking/Kbuild
14 patching file networking/ntpd.c
15 patching file networking/ntpd_simple.c
16 $ patch -p1 < ../BusyBox-1.15.3-reexec_init.patch
17 patching file init/Config.in
18 patching file init/init.c
4) 配置busybox
1 $ make menuconfig
配置完成后会生成一个.config文件,注意前面有个点。这是我的配置文件:
config-busybox-1.15.3.zip5) 编译
1 $ make
6) 安装到指定的目录,比如/home/user/dist/busybox
1 $ make CONFIG_PREFIX=/home/usr/dist/BusyBox install
补充:
用华硕提供的工具链sdelinux-5.03.06-1进行编译时会报ULLONG_MAX undeclared的错误。解决办法是对其中一个头文件打下面的补丁:
头文件:/usr/local/lib/gcc-lib/mipsel-linux/2.96-sdelinuxmips-040127/include/limits.h
补丁如下:
--- limits.h.orig 2004-02-12 20:38:47.000000000 +0800
+++ limits.h 2010-03-02 08:53:11.984943511 +0800
@@ -94,5 +94,12 @@
#define ULONG_LONG_MAX (LONG_LONG_MAX * 2ULL + 1)
#endif
+/* Minimum and maximum values a `signed long long int' can hold. */
+#define LLONG_MAX 9223372036854775807LL
+#define LLONG_MIN (-LLONG_MAX - 1LL)
+
+/* Maximum value an `unsigned long long int' can hold. (Minimum is 0.) */
+#define ULLONG_MAX 18446744073709551615ULL
+
#endif /* _MACH_MACHLIMITS_H_ */
#endif /* _LIMITS_H___ */