首页 > Linux, OpenWrt > 编译Netgear WNDR4300路由器用Gargoyle(石像鬼)固件

编译Netgear WNDR4300路由器用Gargoyle(石像鬼)固件

2015年2月25日 LTNS     访问次数 297 发表评论 阅读评论

Gargoyle石像鬼固件 作为 OpenWrt 的Web前端之一,其管理界面简单易用,且拥有非常强大的 QoS带宽管理功能,加上常用的功能皆已内置,所以比较适合不太爱折腾且对 QoS有需求的 OpenWrt爱好者。

不过对应 Netgear WNDR4300 这款无线路由器的石像鬼官方固件未用足 128M Nand Flash,导致 overlay分区远远小于90MB;另外,官方固件也缺少一些内核模块如kmod-fs-cifs等(这类内核模块很难通过opkg方式安装),于是决定按照 Gargoyle官网的 编译教程 重新制作一个固件,在此作个新手折腾记录。

Netgear_WNDR4300

制作固件需要一个编译环境,我选择了 Ubuntu 12.04.5 LTS Desktop x64 这个Linux操作系统(更新的版本也可以用,不过 12.04对我而言足够了),然后据此通过 Vmware Workstation 软件安装了 Ubuntu虚拟机(具体方法网上有很多,这里就不再赘述了),当然也可以在某个实体电脑上安装操作系统。

启动 Ubuntu后进入 Terminal,安装编译所需的必要软件,以x64的为例

sudo apt-get update
sudo apt-get install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full

注:后面的编译过程则不再需要root权限了。

 
编译固件

1. 下载 Gargoyle源代码

cd     #切换到用户根目录
#git clone git://gargoyle-router.com/gargoyle.git
#如上命令会提示出错,Git服务器似乎有问题,于是改用如下命令
git clone http://gargoyle-router.com/git/gargoyle.git

2. 然后开始编译

cd gargoyle
#make custom     #从第二次编译开始,可用该行命令
make custom V=99 2>&1 |tee build.log |grep -i error     #仅第一次编译时用,以便生成详细日志并在屏幕上显示其中的出错内容

注:如想编译旧版本,如1.7.0,可在进入gargoyle子目录后、编译之前,执行命令 git checkout 1.7.0,具体版本号可查询 官网

这时会从 OpenWrt的SVN服务器下载固件和软件包的源代码,下载过程会耗时数个小时,之后就会进入 menuconfig编译配置界面,各项编译参数的大致说明可参考 这里
OpenWrt_menuconfig
注:第一次编译所用的命令包含了V=99,这会导致在 menuconfig界面的操作会紊乱,这时可按 ctrl + c 组合键退出编译进程,检查日志文件 ~/gargoyle/build.log里面没有错误后,即可开始第二次编译(其实在开始第二次编译前,还可以顺便按 这里的教程 实现 WNDR4300路由器 overlay大于90M,详见文章末尾的补充)。也就是说,第一次编译时所用的命令只适用于记录进入 menuconfig界面之前的日志。

配置完成并保存、退出 menuconfig界面后,编译会自动继续下去,耗时很长,完成后就可以在 ~/gargoyle/images/custom/目录下看到编译得到的固件了,~/gargoyle/built/custom/default/则是软件包所在目录。

3. 如要再次进行编译,直接从步骤2开始即可,但默认不会进入 menuconfig界面(以至无法修改编译配置),对此,有三个方法可用。
方法一:改用 make FULL_BUILD=true custom 这个编译命令;

方法二:或手工修改编译配置文件 ~/gargoyle/custom-src/.config 的权限

cd ~/gargoyle/custom-src
chmod 666 .config     #允许写入配置文件
make menuconfig       #进入menuconfig界面,修改完成后保存、退出,编译不会自动进行
chmod 444 .config     #禁止写入权限,防止对编译配置文件的修改被覆盖
cd ..
make custom           #开始编译

编译时会提示配置文件的写入被拒绝,直接回车即可,这时就会按修改过的配置文件进行编译了

IOError: [Errno 13] Permission denied: ‘/home/ltns/gargoyle/custom-src/.config’
Using shell script to set i18n language
mv: try to overwrite `/home/ltns/gargoyle/custom-src/.config’, overriding mode 0444 (r–r–r–)?

方法三:或删去 ~/gargoyle/custom-src/这个目录,然后重复如上的步骤2。此方法可靠,但耗时很长。

 

可能遇到的问题

问题1.
在进入 menuconfig界面之前 OpenWrt固件或软件包的源代码从 SVN服务器下载出错(比如从日志文件 ~/gargoyle/build.log 中读到),但因为再次编译时不会重新下载,即便删掉 ~/gargoyle/custom-src/这个目录也没用。

这时可参考脚本文件 ~/gargoyle/build.sh 里的内容,执行如下命令实现 SVN下载的断点续传(比如43694就是当前版本的 Gargoyle所基于的 OpenWrt源代码版本)

#OpenWrt固件 SVN下载出错后的断点续传
cd ~/gargoyle
svn info barrier_breaker
svn update -r 43694 barrier_breaker
 
cd barrier_breaker
find . -name ".svn" | xargs -r rm -rf
cd ..
mv barrier_breaker downloaded/barrier_breaker-43694
rm -rf downloaded/barrier_breaker-43694/dl
ln -s downloaded downloaded/barrier_breaker-43694/dl
 
#OpenWrt软件包 SVN下载出错后
cd ~/gargoyle
svn info downloaded/barrier_breaker-packages-43694
svn update -r 43694 downloaded/barrier_breaker-packages-43694
#更新可能出错 “Failed to add directory 'downloaded/barrier_breaker-packages-43694/utils': an unversioned directory of the same name already exists”
 
#删去冲突目录,最好是在 Ubuntu图形界面的文件浏览器中操作,以防误删
rm -rf downloaded/barrier_breaker-packages-43694/utils
#其他目录如ipv6 libs net land skels mail admin sound,及文件.gitignore 可能也得删
svn update -r 43694 downloaded/barrier_breaker-packages-43694
 
cd downloaded/barrier_breaker-packages-43694
find . -name ".svn" | xargs rm -rf

当然也可以把 ~/gargoyle/整个目录删掉然后从头来过,但这样耗时太长,而且也不能保证就一定能完整地从 SVN服务器下载成功。

(后面遇到的问题,都是在退出 menuconfig界面之后的编译过程中遇到过的)

 
问题2.
编译配置文件出错提示

WARNING: your configuration is out of sync. Please run make menuconfig, oldconfig or defconfig!

那么这之前在 menuconfig界面对编译配置所做的修改就不会生效,根据 Gargoyle官网讨论贴,这时可采用前面的步骤3里提及的方法二或方法三加以解决。

 
问题3.
提示下载出错,比如

Download failed.
–2015-02-16 10:57:18– http://downloads.openwrt.org/sources/libexif-0.6.21.tar.bz2

make[4]: *** [/home/ltns/gargoyle/custom-src/dl/libexif-0.6.21.tar.bz2] Error 2

openwrt.org网站上并不存在该版本软件的源代码包,可以上网搜索后从其他网站下载,然后移动至 ~/gargoyle/custom-src/dl/目录下,重新进行编译即可。

另外,还曾遇到过如下的下载出错提示

Download failed
–2015-02-19 19:13:18– http://mirror2.openwrt.org/sources/linux-.tar.xz

网站确实没有这个源码包,网上也搜不到,不过不像其他出错提示那样会导致编译终止,这个出错提示不会终止编译,而且编译得到的固件似乎也能正常使用。

 
问题4.
menuconfig界面里没有比如 dnsmasq-full这个软件包供选择,但还可以手工在编译配置文件 ~/gargoyle/custom-src/.config 中添加一行

...
# CONFIG_PACKAGE_dnsmasq is not set
CONFIG_PACKAGE_dnsmasq-full=y
CONFIG_PACKAGE_dropbear=y

注:如是通过 make custom命令进入 menuconfig界面的话,因退出界面后编译会自动继续下去,所以须在 menuconfig界面退出之前、编译配置保存之后去手工修改这个配置文件,否则修改的内容会被覆盖掉或者来不及生效。

还需要在 menuconfig界面里勾选 libgmp和 libnettle这两个软件,否则编译时会提示 dnsmasq-full缺少相应的依赖库。

 
问题5.
提示某个软件包版本不匹配

checking for LIBMNL… no
configure: error: Package requirements (libmnl >= 1.0.3) were not met:

Requested ‘libmnl >= 1.0.3′ but version of libmnl is 1.0.1
You may find new versions of libmnl at http://netfilter.org/projects/libmnl/

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables LIBMNL_CFLAGS
and LIBMNL_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
make[4]: *** [/home/ltns/gargoyle/custom-src/build_dir/target-mips_34kc_uClibc-0.9.33.2/libnetfilter_conntrack-1.0.3/.configured_] Error 1

即便自行从 netfilter.org网站下载1.0.3的版本移动至 ~/gargoyle/custom-src/dl/目录下也不行,原因在于 OpenWrt的 libmnl源码包已是1.0.3的版本,而Gargoyle里的还是1.0.1,所以须用前者的覆盖,然后重新编译

cd ~/gargoyle
cp downloaded/barrier_breaker-43694/package/libs/libmnl/Makefile package/libmnl/Makefile
cp downloaded/barrier_breaker-43694/package/libs/libmnl/Makefile package-prepare/libmnl/Makefile
make custom

 

问题6.
提示 *weburl*.ko 文件缺失

ERROR: module ‘/home/ltns/gargoyle/custom-src/build_dir/target-mips_34kc_uClibc-0.9.33.2/linux-ar71xx/linux-3.10.49/net/ipv4/netfilter/*weburl*.ko’ is missing.
make[4]: *** [/home/ltns/gargoyle/custom-src/bin/ar71xx/packages/base/kmod-ipt-weburl_3.10.49-1-0061a6b1cbb3de3557b8a0c3fc2a3846_ar71xx.ipk] Error 1

可能是勾选的模块或软件包有冲突,具体是哪个未知,我通过尽量少勾选、只选择必需的模块和软件包解决了这个问题。如果发现在menuconfig界面里有的模块或软件包无法取消勾选,则可以像处理问题4那样去手工修改配置文件。

这里提供刷了原版Gargoyle固件后的 文件和软件包清单、以及我自用的 ~/gargoyle/custom-src/.config 编译配置文件供参考,在近似 Gargoyle官方 WNDR4300固件的基础上,删去了 tor openvpn webcam,添加了中文界面语言包、kmod-fs-cifs,另外,还把 dnsmasq替换成了 dnsmasq-full,等等。

 

补充:
这里的教程 修改文件 ~/gargoyle/downloaded/barrier_breaker-43694/target/linux/ar71xx/image/Makefile(修改前请先做好备份),以实现 WNDR4300路由器 overlay分区大于90MB的功能

wndr4300_mtdlayout=mtdparts=ar934x-nfc:256k(u-boot)ro,256k(u-boot-env)ro,256k(caldata),512k(pot),2048k(language),512k(config),3072k(traffic_meter),2048k(kernel),23552k(ubi),25600k@0x6c0000(firmware),256k(caldata_backup),-(reserved)

#改为(将ubi和firmware增加96M,完全使用128M flash)

wndr4300_mtdlayout=mtdparts=ar934x-nfc:256k(u-boot)ro,256k(u-boot-env)ro,256k(caldata),512k(pot),2048k(language),512k(config),3072k(traffic_meter),2048k(kernel),121856k(ubi),123904k@0x6c0000(firmware),256k(caldata_backup),-(reserved)

 
如果不是在第一次编译时就修改了该文件,那么因为原文件已被复制到 ~/gargoyle/custom-src/target/linux/ar71xx/image/目录下,所以该目录下的同名文件也需要修改。

 

15.02.27更新
Gargoyle路由器插上U盘会自动加载,但不能正常显示中文目录名和文件名,可修改 /etc/init.d/usb_storage这个脚本文件,或在编译前修改 ~/gargoyle/package-prepare/plugin-gargoyle-usb-storage/files/etc/init.d/~/gargoyle/package/plugin-gargoyle-usb-storage/files/etc/init.d/ 这两个目录下的同名文件

	mount -t vfat -o umask=0,dmask=0,iocharset=utf8 "$d" "/tmp/usb_mount/$id" || umount "/tmp/usb_mount/$id" 2>/dev/null

 
 

参考文章
http://www.gargoyle-router.com/wiki/doku.php?id=developer_documentation
http://www.right.com.cn/forum/thread-133071-1-1.html

 

  1. yding
    2015年3月26日17:37 | #1

    你好,能否分享你编译好的版本呢?y********@me.com 多谢多谢! :)

  2. LTNS
    2015年3月26日20:55 | #2

    @yding
    发邮件被退信了,请到百度盘下载吧
    http://pan.baidu.com/s/1gd2AXnt

  3. yding
    2015年3月27日09:42 | #3

    @LTNS
    谢谢!

  4. yding
    2015年4月1日15:34 | #4

    能否研究一下hfs+日志格式的读写挂载问题?不用关日志的方式

  5. LTNS
    2015年4月2日17:38 | #5

    @yding
    我没有Mac OS X相关的设备所以没这个需求,不折腾了

  6. zzzoe
    2015年5月12日12:53 | #6

    你好.石像鬼的配置界面,把无线和有线在一个页面配置,保存无线设置时有线的设置也被提交一下.宽带都断了重连.能向官方反应下吗.或有别的解决方法吗.打命令还是算了吧

  7. LTNS
    2015年5月13日23:24 | #7

    @zzzoe
    你可以到官方论坛去反映一下
    http://www.gargoyle-router.com/phpbb/index.php

    路由器设置完成后我很少再修改,所以这方面的问题对我而言影响不大。

  8. maz_1
    2015年5月20日01:02 | #8

    感觉gargoyle除了qos并没有什么吸引我的地方,所以我都是给原版openwrt打上gargoyle的iptables补丁来用的,现在luci也有gargoyle qos的配置界面了

  9. Open
    2015年5月26日15:32 | #9

    求助一下,怎么设置为支持8M或者16M呢?编译的时候添加一个OpenVPN或者其他的插件,编译出来固件,好多型号的Bin文件都没有。

  10. LTNS
    2015年5月28日17:44 | #10

    @Open
    编译出来的固件小于8M或16M(可能还要减去bootloader需要的空间)应该就算是支持8M或16M的路由器了吧。另外,编译时添加一个OpenVPN或者其他的插件,可能还需要相应的依赖包,具体你得看下编译过程中是否有相应的出错提示。

  11. Open
    2015年5月28日23:40 | #11

    @LTNS

    编译过程中没有出错,一次编译完成,依赖包也搞定了,就是有一点,比如我添加了一些插件,编译出来的固件是5M大小,那么像wr703N这些硬件本身只有4M的,的固件就没有了,而硬件闪存是8M的型号,比如dir505等,固件就有。

  12. 回忆
    2016年4月14日02:08 | #12

    自己编译真的很费时费力的,暂时不折腾路由器了,手上有好几个了,一般用户还是刷现成的openwrt固件好了,功能用好就不错了

  1. 2015年3月7日15:07 | #1
2 * 4 = (必填)