详细步骤教你如何向dd-wrt固件里写入(固化)自己的程序(例如h3c,mentohust客户端)

包含网卡/无线网的网络问题和ADSL/校园网/宽带拨号支持及代理/共享等网络使用问题
回复
xjhan914
帖子: 9
注册时间: 2012-02-10 21:38

详细步骤教你如何向dd-wrt固件里写入(固化)自己的程序(例如h3c,mentohust客户端)

#1

帖子 xjhan914 » 2012-12-01 15:06

一、概述
大家都被校园网的客户端困扰,现在有了南京工程学院的方案,或者mentohust方案,可以在Ubuntu系统的电脑上运行了。但进一步的工作就是如何能够令其在路由上工作,以达到真真正正的路由功能。以下假设你已经把电脑上完美运行的客户端进行了交叉编译,生成了要在路由上运行的小拨号程序(假设就是abcd),并且也假设你的路由器有合适的dd固件(假设就是firm.bin)。
那么要在dd固件的路由上运行abcd有三种方法:
1.如果刷写dd固件后jffs可以加载,就可以把abcd上传到/jffs目录下(本文不讨论这种情形)
2.刷写dd后,由于剩余容量太小导致无法加载jffs,那么每次启动路由后,可以将程序abcd上传到刷写了firm.bin路由的/tmp目录下,然后令其运行。简单的说,就是在内存里运行abcd。其缺点就是每次路由断电,你必须重新上传。(本文不讨论这种情形)
3.无法加载jffs时,可以考虑将abcd程序彻底固化进dd固件,并且在自启动命令里输入正确的命令方式,以达到每次路由插上电,都可以自动运行拨号程序的完美效果。以下讨论的就是如何将abcd固化进dd固件的方法。
使用的软件就是firmware-mod-kit,基本步骤是1.先用extract-ng.sh把firm.bin固件解包,会生成很多文件夹和文件。2.再把abcd复制到某一个文件夹内,且注意赋予可执行的权限。3.1把已经解出来的两个文件再次解包,生成www文件夹。这两个文件主要负责dd固件的web界面的所有元素。3.2进入到相应目录去删除不必要的语言包。3.3对www文件夹进行封包,生成那两个文件(新的)。4.用build-ng.sh进行最终的封包,生成new-firmware.bin,这个就是已经固化了abcd拨号程序的新dd固件,可以去刷写路由了!!

操作环境:Ubuntu 11.04版
参考资料:http://code.google.com/p/mentohust-wrt/ 制作支持mentohust的路由器固件
http://code.google.com/p/firmware-mod-kit/ Firmware Modification Kit
并感谢第一个项目的作者给我的指导和帮助。我只是把他没有写明白的步骤,以我自己的理解方式重述而已。

二、详细步骤
1.首先去下载firmware-mod-kit,并进行编译,生成一些可执行文件。
1.1下载firmware-mod-kit

http://code.google.com/p/firmware-mod-k ... e/checkout
的页面上,可以看到下载获取方法。请在终端黑窗口里输入以下命令:
svn checkout http://firmware-mod-kit.googlecode.com/svn/ firmware-mod-kit-read-only
耐心的等待之后,会在你的本地硬盘上生成一个目录firmware-mod-kit-read-only,其中包含branches,tags,trunk,wiki四个文件夹。特别地,进入到trunk文件夹中会看到src文件夹和build-ng.sh和extract-ng.sh等等文件。
1.2编译firmware-mod-kit
在终端黑窗口里进入到/firmware-mod-kit-read-only/trunk/src,并且输入命令
./configure
一切正常后,请继续输入命令
make
耐心等待其编译成功。

特别地,如果./configure失败,说明你的Ubuntu系统里缺少某些东西,请参看
http://code.google.com/p/firmware-mod-k ... ation?tm=6

For Ubuntu:
$ sudo apt-get install subversion build-essential zlib1g-dev liblzma-dev

2.准备dd固件(firm.bin)
将原始dd固件firm.bin复制到/firmware-mod-kit-read-only/trunk/目录下,或者另外建个文件夹(假设是/firmware-mod-kit-read-only/trunk/firm,并且以下以此种情形讲解)。现在,原始dd固件 firm.bin已经在目录/firmware-mod-kit-read-only/trunk/firm/下了。

3.解包firm.bin
在终端窗口里进入到/firmware-mod-kit-read-only/trunk/目录。输入
./extract-ng.sh ./firm/firm.bin
耐心的等待之后,会在/firmware-mod-kit-read-only/trunk/下生成一个新目录fmk/

特别地,因为需要管理员权限,可能运行中间需要你输入管理员密码

在/fmk/目录里你会看到三个文件夹image_parts,logs,rootfs.继续进入rootfs目录,会看到很多文件夹,其中有/usr/sbin.

4.把你的已经交叉编译过的客户端程序abcd复制到/firmware-mod-kit-read-only/trunk/fmk/rootfs/usr/sbin,也许复制到firmware-mod-kit-read-only/trunk/fmk/rootfs/的其他位置也行。
注意需要管理员权限,并且赋予abcd可执行的权限。

5.开始封包
在终端窗口里进入到firmware-mod-kit-read-only/trunk/目录,并且运行命令
./build-ng.sh
耐心等待之后,你会发现有错误报告,并且没有生成新的dd固件.报告为

ERROR: New firmware image will be larger than original image!
Building firmware images larger than the original can brick your device!
Try re-running with the -min option, or remove any unnecessary files from the file system.
Refusing to create new firmware image.

其意思是说,因为生成的新固件比原始固件firm.bin要大,所以为了不使你的路由变成砖头,程序拒绝生成新的固件。尝试用参数 -min,也就是命令
./build-ng.sh -min
进行封包。但我这里的试验情况是,用这个-min参数可以生成新固件了,但新固件刷些进路由后,路由仍然成砖。是我不得要领?所以,劝大家还是不要用这个参数了。为此,继续......

6.把web界面里的不必要的语言包删除,以减小最终固件的大小
6.1在firmware-mod-kit-read-only/trunk/src/webcomp-tools/目录里的readme文件中有关于web界面的说明:

There are two files involved with this system:
1) The httpd binary (/usr/sbin/httpd)
2) The www file (/etc/www)
简单的说,就是这两个文件负责dd固件的web界面的所有元素。
并且在这个readme中有使用说明:
To extract files:
$ ./webdecomp --httpd=rootfs/usr/sbin/httpd --www=rootfs/etc/www --extract

To restore modified files:
$ ./webdecomp --httpd=rootfs/usr/sbin/httpd --www=rootfs/etc/www --restore

所以,如果你在firmware-mod-kit-read-only/trunk/src/webcomp-tools/目录里没有看到webdecomp可执行文件,请在终端窗口进入到firmware-mod-kit-read-only/trunk/src/webcomp-tools/目录并且运行
make
就可以生成webdecomp命令。接下来就是用这个命令对那两个文件进行解包了。
6.2对web进行解包
在终端窗口里进入firmware-mod-kit-read-only/trunk/src/webcomp-tools/目录,并且运行命令(和readme中的使用说明有区别,主要是要保证路径正确../../fmk/)
./webdecomp --httpd=../../fmk/rootfs/usr/sbin/httpd --www=../../fmk/rootfs/etc/www --extract
很快,在firmware-mod-kit-read-only/trunk/src/webcomp-tools/目录里生成一个新文件夹www。这里边就有中英文等语言包,还有皮肤style等。
6.3删除不必要的语言包
进入到firmware-mod-kit-read-only/trunk/src/webcomp-tools/www/lang_pack/里,仅需保留英文,中文简体,中文繁体语言包,其它的就各取所需吧。

另外,如果你愿意,可以进入firmware-mod-kit-read-only/trunk/src/webcomp-tools/www/style/里把不想的style(就是那些green,yellow等文件夹)删除以保证将来的固件更小。

但删除的文件总大小一定要超过客户端 abcd的大小,以保证将来的新固件大小不超过原始固件firm.bin.
6.4对web进行封包生成新的那两个文件
在终端窗口里进入firmware-mod-kit-read-only/trunk/src/webcomp-tools/目录,并且运行命令(和readme中的使用说明有区别,主要是要保证路径正确../../fmk/)
./webdecomp --httpd=../../fmk/rootfs/usr/sbin/httpd --www=../../fmk/rootfs/etc/www --restore
很快就会完成。

7.进行最终的封包生成新的dd固件new-firmware.bin
重新运行第5步,即在终端窗口里进入到firmware-mod-kit-read-only/trunk/目录,并且运行命令
./build-ng.sh
耐心等待之后,可能会有报告啥CRC update failed错误啥的,不必理会。在firmware-mod-kit-read-only/trunk/fmk/目录里你会看到生成的新的dd固件new-firmware.bin。大功告成。
三、后记
我在tp-wr841V5的路由和d-link-dir615C1都成功固化。但悲剧的是,虽然我的客户端(h3c的)固化进/usr/sbin/目录里了,并且在自启动命令里设置正确的命令行,但路由插电,程序总是运行失败。所以,经过几次折腾,最后我还是放弃了这种固化的办法,转而令客户端在内存里运行的方式。由此,我以上的固化方法都是浮云了。
上次由 xjhan914 在 2012-12-01 16:32,总共编辑 1 次。
头像
tooktang
帖子: 674
注册时间: 2010-07-15 18:30

Re: 详细步骤教你如何向dd-wrt固件里写入(固化)自己的程序(例如h3c,mentohust客户端)

#2

帖子 tooktang » 2012-12-01 15:36

感谢 LZ 分享经验,我用 openWRT,但是用 DD 的童鞋会觉得很有用。
我是OS控…
头像
tooktang
帖子: 674
注册时间: 2010-07-15 18:30

Re: 详细步骤教你如何向dd-wrt固件里写入(固化)自己的程序(例如h3c,mentohust客户端)

#3

帖子 tooktang » 2012-12-01 15:37

另外有个疑问:除非是特别低端的路由,2M Flash,只能刷 micro DD 固件的那种,其余的刷个 mini DD 固件,基本都有 JFFS2 空间可用,没有必要每次上传到 /tmp 下啊?
我是OS控…
xjhan914
帖子: 9
注册时间: 2012-02-10 21:38

Re: 详细步骤教你如何向dd-wrt固件里写入(固化)自己的程序(例如h3c,mentohust客户端)

#4

帖子 xjhan914 » 2012-12-01 15:56

比如wr841,是4M的flash,刷入DD后,jffs不能加载,只好上传到内存中运行。
某些型号路由有mini或micro版DD,当然可以加载开启Jffs, 所以不必要我的折腾。
另外,好像可以自己编译Openwrt固件,直接把程序编译进去。但我不会啊!
头像
tooktang
帖子: 674
注册时间: 2010-07-15 18:30

Re: 详细步骤教你如何向dd-wrt固件里写入(固化)自己的程序(例如h3c,mentohust客户端)

#5

帖子 tooktang » 2012-12-01 21:09

xjhan914 写了:比如wr841,是4M的flash,刷入DD后,jffs不能加载,只好上传到内存中运行。
某些型号路由有mini或micro版DD,当然可以加载开启Jffs, 所以不必要我的折腾。
另外,好像可以自己编译Openwrt固件,直接把程序编译进去。但我不会啊!
openWRT 的固件不是固化的,所以你只需要直接安装别人编译好的 ipk 包就好了。很简单的。
如果没人编译 ipk 包,就自己交叉编译。
我是OS控…
wangzhenyu1260
帖子: 2
注册时间: 2013-09-09 17:19
系统: Ubuntu 13.04

Re: 详细步骤教你如何向dd-wrt固件里写入(固化)自己的程序(例如h3c,mentohust客户端)

#6

帖子 wangzhenyu1260 » 2013-09-29 11:01

尝试固化mentohust进入ddwrt重建成功,但路由器刷不了重建后的固件。。。用的是dir615d,不知道什么原因
robust2012
帖子: 1
注册时间: 2012-09-14 19:02
系统: win7

Re: 详细步骤教你如何向dd-wrt固件里写入(固化)自己的程序(例如h3c,mentohust客户端)

#7

帖子 robust2012 » 2013-12-10 22:44

xjhan914, 你好,看了你的帖子

(详细步骤教你如何向dd-wrt固件里写入(固化)自己的程序)并详细研读了,对我很有启示,需要和你交流,麻烦请加我QQ 9352492 谢过了
dumxz
帖子: 1
注册时间: 2013-12-23 20:52
系统: windows

Re: 详细步骤教你如何向dd-wrt固件里写入(固化)自己的程序(例如h3c,mentohust客户端)

#8

帖子 dumxz » 2013-12-23 20:54

为什么我在执行./webdecomp --httpd=../../fmk/rootfs/usr/sbin/httpd --www=../../fmk/rootfs/etc/www --restore的时候,显示没有权限?我加上sudo后可以了,但运行后显示../../fmk/rootfs/etc/www: zero size file?
wangzhenyu1260
帖子: 2
注册时间: 2013-09-09 17:19
系统: Ubuntu 13.04

Re: 详细步骤教你如何向dd-wrt固件里写入(固化)自己的程序(例如h3c,mentohust客户端)

#9

帖子 wangzhenyu1260 » 2014-03-06 11:44

ddwrt固化mentohust成功,但好像执行mentohust报错-sh: mentohust: Permission denied,楼主帮忙吖
回复