NAP6官方旗舰店
搜索
NAP6»论坛 刷机 DD-Wrt 帖子
发新帖
午饭无线 推广广告R7800 完胜 华硕路由器NETGEAR Vs ASUS T-Mobile定制版NETGEAR团购
开启左侧

搭建DD-Wrt固件编译环境教程

[复制链接]
1532 1

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
我这两天在折腾DD-WRT(哦,搞错了,是DD-WRT这两天在折腾我),看了看http://www.dd-wrt.com/wiki/index.php/Development上面的说明,照着做了,编译没通过,而且发现DD-WRT中原来自带的一些脚本已经很老了,没有多想,于是又在其论坛上查找,发现http://www.dd-wrt.com/phpBB2/viewtopic.php?t=28348上面讲解得很详细,但一路走下来还是碰到了几个问题,最终解决,于是我在这里叙述下自己一路怎么走下来的,作为总结,权当翻译和补充好了,希望能给自己和需要了解这方面问题的朋友带来一些帮助。

我这里用的目标板是
Chip : Broadcom 5354
SDRAM: 16M
Flash: 4M
Bootloader需自备。
我的编译平台是Debian 2.6.18-6-686,欲编译 kernel v24

具体步骤如下:
1.  安装编译环境:
  1. sudo apt-get install gcc g++ binutils patch bzip2 flex bison make gettext unzip zlib1g-dev libc6 libncurses5-dev libstdc++5 automake automake1.7 automake1.9 openssl
复制代码

2.  建立一个工作目录:mkdir ~/dd-wrt,然后在此目录下放置和编译,
  1. cd ~/dd-wrt
复制代码

3.  获取ToolChain并将其解压到工作目录:
  1. wget http://www.dd-wrt.com/dd-wrtv2/downloads/others/sourcecode/toolchains/toolchains.x86.debian.sp1.tar.bz2
复制代码

拿下来之后tar -jxvf toolchains.x86.debian.sp1.tar.bz2。
4.  获取源代码:若要拿下一份完整的,可以这样做,
  1. svn co http://svn.dd-wrt.com/DD-WRT ./DD-WRT
复制代码

或者
  1. svn co svn://svn.dd-wrt.com/DD-WRT ./DD-WRT
复制代码

由于带宽问题,恐怕需要很长时间,我上次是在下班后让它自己慢慢拿的,第二天早上过来看,已经好了。若确定只编译某一个kernel,也可以只拿需要的一部分,可以这样做,
  1. mkdir ./DD-WRT
  2. cd DD-WRT/
  3. svn co -N svn://svn.dd-wrt.com/DD-WRT
  4. svn co svn://svn.dd-wrt.com/DD-WRT/tools
  5. svn co svn://svn.dd-wrt.com/DD-WRT/opt
  6. cd src/
  7. svn co -N svn://svn.dd-wrt.com/DD-WRT/src
  8. svn co svn://svn.dd-wrt.com/DD-WRT/src/include.bcm
  9. svn co svn://svn.dd-wrt.com/DD-WRT/src/include.v23
  10. svn co svn://svn.dd-wrt.com/DD-WRT/src/include.v24
  11. svn co svn://svn.dd-wrt.com/DD-WRT/src/led
  12. svn co svn://svn.dd-wrt.com/DD-WRT/src/ses
  13. svn co svn://svn.dd-wrt.com/DD-WRT/src/shared
  14. svn co svn://svn.dd-wrt.com/DD-WRT/src/router
  15. svn co svn://svn.dd-wrt.com/DD-WRT/src/squashfs-tools
  16. svn co svn://svn.dd-wrt.com/DD-WRT/src/switch
  17. svn co svn://svn.dd-wrt.com/DD-WRT/src/tools
  18. svn co svn://svn.dd-wrt.com/DD-WRT/src/wl
复制代码

这样下来,若在DD-WRT/和DD-WRT/src/下面未发现Makefile,需要做,
  1. cp ./DD-WRT/DD-WRT/Makefile ./DD-WRT/
  2. cp ./DD-WRT/src/Makefile ./DD-WRT/src/
复制代码

5.  修改几个文件:
vi DD-WRT/src/router/rules/dropbear.mk
在第一行和第二行之间添加
zlib && make
vi DD-WRT/src/router/rules/openvpn.mk
在第一行和第二行之间添加
cd openssl && make
vi DD-WRT/src/router/rules/tcpdump.mk在
第一行和第二行之间添加
cd libpcap && make

由于libpcap_noring的Makefile牢固地绑定了linux.v23分枝,所以可能需要做,
  1. vi DD-WRT/src/router/libpcap_noring/Makefile
复制代码

换第53行
  1. CCOPT = $(COPTS) -fomit-frame-pointer -fpic -fPIC -I../../brcm/linux.v23/linux/include为CCOPT = $(COPTS) -fomit-frame-pointer -fpic -fPIC -I$(LINUXDIR)/include
复制代码

在编译SNMP的时候,可能遇到不能创建临时文件夹的问题,所以可能需要做
  1. vi DD-WRT/src/router/snmp/configure
复制代码

换第2325行
  1. (umask 077 && mkdir $tmp)为(umask 077 && mkdir -p $tmp)
复制代码

在编译使用于本地环境的工具mksquashfs-lzma时,可能遇到
  1. g++ mksquashfs.o read_fs.o sort.o -L./lzma/C/7zip/Compress/LZMA_Lib -llzma -lpthread -o mksquashfs-lzma
  2. /usr/bin/ld: skipping incompatible ./lzma/C/7zip/Compress/LZMA_Lib/liblzma.a when searching for -llzma
  3. /usr/bin/ld: cannot find -llzma
  4. collect2: ld returned 1 exit status
  5. make: *** [mksquashfs-lzma] Error 1
复制代码

的问题,此时需要做,
  1. vi DD-WRT/src/squashfs-tools/lzma/C/7zip/Compress/LZMA_Lib/Makefile
复制代码

换第2行
  1. CXX = g++ -O3  -funroll-loops -mtune=opteron -march=opteron -mfpmath=sse -m3dnow -msse2 -mmmx -msse -msse3 -m64 -O3 -Wall -finline-functions为CXX = g++ -03 -funroll-loops -03 -Wall
复制代码

即便编译通过,最后生成的工具在执行时可能出现故障,所以还需要做,
  1. vi DD-WRT/src/squashfs-tools/Makefile
复制代码

换第2行
  1. CFLAGS := -I$(INCLUDEDIR) -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -funroll-loops -mtune=opteron -march=opteron -mfpmath=sse -m3dnow -msse2 -m64 -O3 -D_LZMA_PARAMS
复制代码


  1. CFLAGS := -I$(INCLUDEDIR) -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -O2 -D_LZMA_PARAMS。
复制代码

6.  调整源代码,编译本地工具和确定编译对象:我在这里综合了本文开始处提到的两份参考资料,改写了脚本,命名为ready_ddwrt.sh,内容如下:
  1. #!/bin/sh
  2. #
  3. # 标题: ready_ddwrt.sh
  4. #
  5. # 此脚本目的在于为编译做准备
  6. #
  7. MINPARAMS=1
  8. if [ $# -lt "$MINPARAMS" ]
  9. then
  10. echo usage:
  11. echo    ready_ddwrt.sh [ddwrt_base_path]
  12. echo
  13. echo i.e.:
  14. echo ready_ddwrt.sh /home/tomlee/DD-WRT_081113/DD-WRT
  15. echo
  16. exit 1
  17. fi

  18. ME=`whoami`
  19. DDROOT=$1

  20. echo I am $ME
  21. echo DD-WRT is at $DDROOT

  22. echo ................................................................
  23. echo creating some symlinks
  24. echo ................................................................
  25. # 连接自己选定要编译的kernel
  26. ln -s $DDROOT/src/linux/brcm/linux.v24_2 $DDROOT/src/linux/linux
  27. echo done

  28. #Next some tools from the DD-WRT source need to be recompiled to our native environment.
  29. echo ................................................................
  30. echo "re-building some tools"
  31. echo ................................................................
  32. cd $DDROOT

  33. #Under DD_WRT/src/router/tools, do the following
  34. #Code:
  35. cd src/router/tools/
  36. rm jsformat
  37. make jsformat
  38. cd -

  39. #Under DD-WRT/src/squashfs-tools, do the following
  40. #Code:
  41. cd src/squashfs-tools/
  42. rm mksquashfs-lzma
  43. make
  44. cp mksquashfs-lzma ../linux/brcm/linux.v24_2/scripts/squashfs
  45. cd -

  46. #Under DD-WRT/tools, do the following
  47. #Code:
  48. cd tools/
  49. rm ./strip
  50. gcc strip.c -o ./strip
  51. rm ./write3
  52. gcc write3.c -o ./write3
  53. rm ./write4
  54. gcc write4.c -o ./write4
  55. rm ./webcomp
  56. gcc -o webcomp -DUEMF -DWEBS -DLINUX webcomp.c
  57. cd -

  58. # make bb_mkdep
  59. #cd src/router/busybox/scripts
  60. #rm bb_mkdep
  61. #make bb_mkdep
  62. #cd ../../../..

  63. echo done
复制代码

7.  建立编译环境,提供ToolChain和目标文件放置处的链结:我在这里同样结合了提到的两份参考资料,改写了脚本,命名为read_ddwrt_root.sh,内容如下:
  1. #!/bin/sh
  2. #
  3. # 标题: ready_ddwrt_root.sh
  4. #
  5. # 此脚本的目的在于提供ToolChain和目标文件放置处的链结

  6. MINPARAMS=2
  7. if [ $# -lt "$MINPARAMS" ]
  8. then
  9. echo
  10. echo This script needs root access.
  11. echo
  12. echo usage:
  13. echo    ready_ddwrt_root.sh [ddwrt_base_path] [toolchain_base_path]
  14. echo
  15. echo i.e.:
  16. echo    ready_ddwrt_root.sh /home/tomlee/DD-WRT_081113/DD-WRT /home/tomlee/DD-WRT_081113/toolchains
  17. echo
  18. exit 1
  19. fi

  20. ME=`whoami`
  21. DDROOT=$1
  22. TCHAIN=$2

  23. echo I am $ME
  24. echo DD-WRT is at $DDROOT
  25. echo mipsl-uclibc-x toolchain is at $TCHAIN

  26. echo ................................................................
  27. echo creating some symlinks
  28. echo ................................................................
  29. # 在源代码中可能引用到多个ToolChain,可能由于历史问题造成,其实就用到两份
  30. mkdir -p /opt
  31. rm /opt/3.3.4
  32. rm /opt/3.3.6
  33. rm /opt/3.4.4
  34. rm /opt/3.4.6
  35. rm /opt/4.1.0
  36. ln -s $TCHAIN/3.4.6-uclibc-0.9.28 /opt/3.3.4
  37. ln -s $TCHAIN/3.4.6-uclibc-0.9.28 /opt/3.3.6
  38. ln -s $TCHAIN/3.4.6-uclibc-0.9.28 /opt/3.4.4
  39. ln -s $TCHAIN/3.4.6-uclibc-0.9.28 /opt/3.4.6
  40. ln -s $TCHAIN/4.1.0-uclibc-0.9.28 /opt/4.1.0
  41. rm /GruppenLW
  42. # 最终目标文件放这里
  43. ln -s $DDROOT/image /GruppenLW

  44. echo All done!
复制代码

至此,准备工作完毕,接下来就是编译了。参考源代码DD-WRT/opt/下面的多个脚本可以发现DD-WRT可生成多种模式的目标文件,且不需要自己手动配置,ls DD-WRT/src/router/.config*,看到的就是原来就准备好的一些配置文件。
我在准备编译的是v24 std 模式,参考其他脚本,自己改写一个,命名为install_std.v24_2.sh,内容如下:
  1. #!/bin/sh
  2. cd ../src/router
  3. cp .config_openvpn.v24 .config
  4. cp ../linux/linux/.config_std ../linux/linux/.config

  5. export MYPATH=$PATH
  6. export PATH=/opt/3.4.6/bin:$MYPATH

  7. make rflow

  8. export PATH=/opt/4.1.0/bin:$MYPATH

  9. make configure

  10. rm -rf mipsel-uclibc/install
  11. make rc-clean
  12. make services-clean
  13. make shared-clean
  14. make httpd-clean
  15. rm busybox/busybox
  16. rm busybox/applets/busybox.o
  17. cd ..
  18. make
  19. cd ../opt
  20. mkdir ../src/router/mipsel-uclibc/target/etc/config
  21. ./sstrip/sstrip ../src/router/mipsel-uclibc/target/bin/*
  22. ./sstrip/sstrip ../src/router/mipsel-uclibc/target/sbin/rc
  23. ./sstrip/sstrip ../src/router/mipsel-uclibc/target/usr/sbin/*

  24. cp ./bin/ipkg ../src/router/mipsel-uclibc/target/bin

  25. cp ./libgcc/* ../src/router/mipsel-uclibc/target/lib
  26. cd ../src/router/mipsel-uclibc/target/lib
  27. ln -s libgcc_s.so.1 libgcc_s.so
  28. cd ../../../../../opt
  29. cp ./etc/preinit ../src/router/mipsel-uclibc/target/etc
  30. cp ./etc/postinit ../src/router/mipsel-uclibc/target/etc
  31. cp ./etc/ipkg.conf ../src/router/mipsel-uclibc/target/etc
  32. cp ./etc/config/* ../src/router/mipsel-uclibc/target/etc/config
  33. cp ./usr/lib/smb.conf ../src/router/mipsel-uclibc/target/usr/lib
  34. cd ../src/router/mipsel-uclibc/target/www

  35. ln -s ../tmp/smbshare smb

  36. cd ../../../../../opt


  37. ./strip_libs.sh


  38. ../src/linux/brcm/linux.v24_2/scripts/squashfs/mksquashfs-lzma ../src/router/mipsel-uclibc/target target.squashfs -noappend -root-owned –le

  39. ./loader-0.02/lzma e ../src/linux/brcm/linux.v24_2/arch/mips/bcm947xx/compressed/piggy vmlinuz
  40. ./loader-0.02/lzma e ../src/linux/brcm/linux.v24_2/arch/mips/bcm947xx/compressed/piggy vmlinuzmicro

  41. ../tools/trx -o dd-wrt.v24_2.trx ./loader-0.02/loader.gz ../src/router/mipsel-uclibc/vmlinuz target.squashfs

  42. cp dd-wrt.v24_2.trx /GruppenLW/dd-wrt.v24_std_generic.bin

  43. echo All done!
复制代码

好了,下面要做的事情就是执行这三个脚本,然后等待目标文件被生成:
  1. ./ready_ddwrt.sh
  2. ./ready_ddwrt_root.sh(这个需要root权限来执行)
  3. cd DD-WRT/opt/
  4. ./install_std.v24_2.sh
复制代码


编译结束后,我们可以从/GruppenLW/中取出目标文件,若目标板已经有bootloader并支持tftp的话,也可以直接yuzhu@debian:/GruppenLW$ tftp -i 192.168.1.xxx(目标班子的LAN IP)put xxx.bin(目标文件)
延伸:等待板子起来后,可通过console登录,登录名:root,登录密码:admin。或许会发现WAN口拿不到IP,只有出的数据包,此时可能需要配置板子的VLAN,root@DD-WRT:~# ifconfig查看WAN口所在VLAN,然后执行:
  1. root@DD-WRT:~# nvram set vlanx(WAN口所在VLAN)ports="x x"(具体需参考板子,我这里是4 5)
  2. root@DD-WRT:~# nvram commit
  3. root@DD-WRT:~# reboot
复制代码

结束:感谢我们老大在此期间给予的极度宽容和巨大帮助,也感谢其他直接或间接给予我支持和帮助的朋友们。

精彩评论1

奔跑的蚂蚁  班长  发表于 2017-1-20 14:34:31 | 显示全部楼层
用ubuntu 64bits编译。会出现页面不全,压缩成www问时候,没写齐全,有人遇到吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精彩推荐

热点动态

精彩图文

快速回复 返回顶部 返回列表