编译bcm47xx OpenWRT

今天上博客看了一下,才发现自己写了这个标题并且发布了空白文章,回想了下估计是自己把保存的草稿发布了出去。由于自己偶尔在不同的电脑上网,有时候遇到问题需要网上查找资料并记录下来,发现博客的草稿功能不错,每写一段东西都会自动保存,成了我的网络记事本。

今天上博客看了一下,才发现自己写了这个标题并且发布了空白文章,回想了下估计是自己把保存的草稿发布了出去。由于自己偶尔在不同的电脑上网,有时候遇到问题需要网上查找资料并记录下来,发现博客的草稿功能不错,每写一段东西都会自动保存,成了我的网络记事本。

至于说编程这个OPENWRT也没什么好写的,找资料的时候发现没找到相关的东西,而官方最新版本的OPENWRT,提供了CONFIG配置文件,我反正是直接用官方的默认驱动编译,无线有线都正常,

关于安装最新ipk包提示postinst出错解决方法

很多朋友从openwrt官方trunk版本下载package到自己的路由上安装时,会有类似postinst script returned status 127.或者XXX.postinst: line 4: default_postinst: not found这些错误提示,这是路由版本跟软件包不对应造成,其实这错误并不会影响软件包的安装成功,所以当看到这类错误时,只要不是提示依赖错误,一般不影响。

原因是因为这些软件包是基于trunk 代码编译,所以目前编译出的 ipk 包默认带有

Package/postinst 脚本或Package/prerm 脚本,而其他版本没有,如PandoraBox。

很多朋友从openwrt官方trunk版本下载package到自己的路由上安装时,会有类似postinst script returned status 127.或者XXX.postinst: line 4: default_postinst: not found这些错误提示,这是路由版本跟软件包不对应造成,其实这错误并不会影响软件包的安装成功,所以当看到这类错误时,只要不是提示依赖错误,一般不影响。

原因是因为这些软件包是基于trunk 代码编译,所以目前编译出的 ipk 包默认带有Package/postinst脚本或Package/prerm脚本,而其他版本没有,如PandoraBox。

#!/bin/sh
[ "${IPKG_NO_SCRIPT}" = "1" ] && exit 0
. ${IPKG_INSTROOT}/lib/functions.sh
default_postinst $0 [email protected]

#!/bin/sh
. ${IPKG_INSTROOT}/lib/functions.sh
default_prerm $0 [email protected]

而若不是最新编译的固件,其/lib/functions.sh中是没有>default_postinst或default_prerm函数的,所以会造成 127错误。

如果不想看到些提示,可在路由上执行命令:

echo -e "\ndefault_postinst() {\n\
\treturn 0\n\
}\n\
default_prerm() {\n\
\treturn 0\n\
}" >> /lib/functions.sh

如果想用trunk的SDK编译安装包而装在其他版本上不提示出错,可以在编译 IPK 前修改include/package-ipkg.mk,删除如下部分

        ( \
                echo "#!/bin/sh"; \
                echo "[ \"\$$$${IPKG_NO_SCRIPT}\" = \"1\" ] && exit 0"; \
                echo ". \$$$${IPKG_INSTROOT}/lib/functions.sh"; \
                echo "default_postinst \$$$$0 \[email protected]"; \
        ) > $$(IDIR_$(1))/CONTROL/postinst
        ( \
                echo "#!/bin/sh"; \
                echo ". \$$$${IPKG_INSTROOT}/lib/functions.sh"; \
                echo "default_prerm \$$$$0 \[email protected]"; \
        ) > $$(IDIR_$(1))/CONTROL/prerm
        chmod 0755 $$(IDIR_$(1))/CONTROL/prerm

从而避免 IPK 中出现postinst和prerm这两个脚本。

通过路由器防DNS劫持-自动翻墙

这两天上网找资料比较多,偶尔也用一下GOOGLE,这个一般都用浏览器插件配合SS代理上。但如果用手机的话,明显麻烦一点,例如sourceforge.net直接就上不去。于是想用路由来搞定。

在v2ex上找到了aa65535提供的方案:http://sourceforge.net/p/openwrt-dist/wiki/Usage/

其一共有六种方案,第一种是比较旧的,以此类推,越后面越新。作者也推荐使用五或者六方案,但最后一个方案需要用到ShadowVPN,冒似这货跟MWAN3好像不兼容,于是放弃,改用方案五,虽然复杂了点,但是兼容性很高。具体方案如下:

1.下载 ChinaDNS-C + shadowsocks-libev-spec 并安装;

2.推荐使用作者提供的修改版的CHINADNS+luci-app-chinadns-c,配搭了LUCI,在文章后面提供下载。如果使用的是原版本的chinadns,修改 /etc/init.d/chinadns 为以下内容。

这两天上网找资料比较多,偶尔也用一下GOOGLE,这个一般都用浏览器插件配合SS代理上。但如果用手机的话,明显麻烦一点,例如sourceforge.net直接就上不去。于是想用路由来搞定。

在v2ex上找到了aa65535提供的方案:http://sourceforge.net/p/openwrt-dist/wiki/Usage/

其一共有六种方案,第一种是比较旧的,以此类推,越后面越新。作者也推荐使用五或者六方案,但最后一个方案需要用到ShadowVPN,冒似这货跟MWAN3好像不兼容,于是放弃,改用方案五,虽然复杂了点,但是兼容性很高。具体方案如下:

1.下载 ChinaDNS-C + shadowsocks-libev-spec 并安装;

2.推荐使用作者提供的修改版的CHINADNS+luci-app-chinadns-c,配搭了LUCI,在文章后面提供下载。

(1)如果使用的是原版本的chinadns,可修改 /etc/init.d/chinadns 为以下内容。

#!/bin/sh /etc/rc.common

START=90

SERVICE_USE_PID=1
SERVICE_WRITE_PID=1
SERVICE_DAEMONIZE=1

start() {
    service_start /usr/bin/chinadns \
        -l /etc/chinadns_iplist.txt \
        -c /etc/chinadns_chnroute.txt \
        -s 114.114.114.114,127.0.0.1:5353 \
        -p 5354
}

stop() {
    service_stop /usr/bin/chinadns
}

(2)如使是用作者提供的版本,只需要在LUCI界面按下图设置即可: 点击查看原图

3.要注意的是,现很多固件的dnsmasq都添加了防DNS劫持补丁,为了不使功能重叠,需要删除/etc/dnsmasq.conf 文件中的污染IP相关设置。

然后编辑路由 /etc/dnsmasq.conf 文件

添加 no-resolv 和 server=127.0.0.1#5354 并删除其他 server=。

此步骤也可以在路由LUCI上配置,进入网络-DHCP/DNS中设置,如图:

点击查看原图

4.安装shadowsocks-libev-spec和luci-app-shadowsocks-spec,此spec版本客户端为作者定制版本,针对 OpenWrt优化,包含 ss-{redir,rules,tunnel},并配搭了LUCI配置界面。另需要注意的是因为是通过 ss 进行 DNS 查询, 需要 ss 服务端支持 DUP 转发功能,这是这个方案的重点,可以有自己的VPS架设服务端的可以忽略,但网上的一些免费ss账号可能不支持DUP转发功能。设置如下

点击查看原图

设置并启用UDP转发和SS账户后,保存应用就可,客户端配置文件在/etc/shadowsocks/config.json,可手工配置。

5.因为CHINADNS和shadowsocks-libev-spec都会生成一个相同的IP列表文件,chinadns_chnroute.txt 与 ignore.list 相同且文件比较大, 可删除一个以后,使用符号链接共用一个以节省空间。

rm -f /etc/chinadns_chnroute.txt
ln -s /etc/shadowsocks/ignore.list /etc/chinadns_chnroute.txt

至此,配置完成,需要安装的软件为,ChinaDNS-C,shadowsocks-libev-spec和luci-app-chinadns,luci-app-shadowsocks-spec,加上自带的dnsmasq用来缓存DNS。

下面仅提供ramips版本(支持HG255D,MT7620系列等)的下载,如需要其他平台的版本,请到作者主页下载

链接: http://pan.baidu.com/s/1bnjJFo7 密码: jrke

测试小云OS-RY-1_V1.6.2.8固件

昨天终于有空,继续玩这如意云RY-1这路由,上官网无意中发现竟然更新固件了,版本是小云OS-RY-1_V1.6.2.8固件,再看一下上一次更新的日期,呵呵,是半年前了。

我路由刷的官方提供的最新版本U-BOOT,不知道是我经常刷的第三方固件,还是这U-BOOT本身问题导致,我经常进不了U-BOOT的恢复模式。但有一样可以的就是,这U-BOOT支持如意云论坛提供的路由助手,可以通过它来刷固件。

不过我还是喜欢原始的WEB刷固件方式,网上找了下,现在U-BOOT还真不少,刷了hackpascal的版本,目前测试下来一切正常。下载地址:

昨天终于有空,继续玩这如意云RY-1这路由,上官网无意中发现竟然更新固件了,版本是小云OS-RY-1_V1.6.2.8固件,再看一下上一次更新的日期,呵呵,是半年前了。

我路由刷的官方提供的最新版本U-BOOT,不知道是我经常刷的第三方固件,还是这U-BOOT本身问题导致,我经常进不了U-BOOT的恢复模式。但有一样可以的就是,这U-BOOT支持如意云论坛提供的路由助手,可以通过它来刷固件。

不过我还是喜欢原始的WEB刷固件方式,网上找了下,现在U-BOOT还真不少,刷了hackpascal的版本,目前测试下来一切正常。下载地址:http://pan.baidu.com/s/1bnkzwAz

成功刷入固件,默认路由访问地址为192.168.99.1,密码54321。登录后是如意云的配置界面,

点击查看原图

功能方面,路由的基本功能都有,其中QOS里面多了个浏览网页或者下载优先的设置。安装应用要插入USB设备才能用,如果想把部分软件安装在机身内存中,需要进入高级设置-系统-软件-配置:

将dest root /opt   这一行更改为 dest root / ,安装完后修改回去就可以。不插USB设备的情况下,需要用SCP上传软件包安装。使用USB设备,会生成一个128M的ISO文件,用来安装应用,小云会生成一个xcloud文件夹为默认的下载存放路径。系统内核版本是3.4.56,跟OPENWRT最新的TURNK版本差得比较多。我自己安装了TURNK最新版本编译的MWAN3,好像提示系统带的iptables的一此参数命令不不支持。

另外系统日志里面一直提示 xRouter user.info sysinit: /bin/sh: can’t create /tmp/xcloud/wan_status: nonexistent directory这段,也不知道是什么原因。

比较独特的是路由配了个手机端,可以远程查看控制路由,远程下载等。或者是我用了负载均衡的原因,手机端频繁断开,传输个200M文件,都重连好多次。

总的来说,新版本的固件,稳定性比以前的好,但功能方面还是欠缺,有些旧的插件用不了。

折腾下路由器-MT7620N

自己一直用着一个D-LINK路由作为家里的主路由,其实自己的路由器挺多的,不过都是老旧的家庭路由器,去年在淘宝二手打包买了几个改过内存的路由,一个刷tomato,用来家里玩VPN什么的。另一个HG255D刷了OPENWRT,放在公司挂个移动硬盘用来下载高清,没办法,谁让公司宽带好,而且省电。

前些天把去年买的一个如意云路由翻了出来,那时候搞特价60多买的,现在好像40多就能买到,MT7620N芯片,还是比较有性价比的。之所以放着一直没用,是当时买回来,发现固件的功能,实在是太少了吧?相信如果有去年买的朋友应该也会有这感想,虽然官方固件一直说有更新,但是进度太慢了,而当时第三方的固件还很少,几乎没有。不过有一个比较不错的,就是可以刷华硕的RT-N14U,这个固件我用了一段时间,发现还算不错,比原配的好多了,特别喜欢里面的QOS功能,但用了一段时间后我姐老是说WIFI信号差,当时我也感觉到有这个情况,但不知道什么原因。就这样我直接换回了原本的路由,这个就一直放着没用,现在想想,估计是我当时把WIFI设置有关。

自己一直用着一个D-LINK路由作为家里的主路由,其实自己的路由器挺多的,不过都是老旧的家庭路由器,去年在淘宝二手打包买了几个改过内存的路由,一个刷tomato,用来家里玩VPN什么的。另一个HG255D刷了OPENWRT,放在公司挂个移动硬盘用来下载高清,没办法,谁让公司宽带好,而且省电。

前些天把去年买的一个如意云路由翻了出来,那时候搞特价60多买的,现在好像40多就能买到,MT7620N芯片,还是比较有性价比的。之所以放着一直没用,是当时买回来,发现固件的功能,实在是太少了吧?相信如果有去年买的朋友应该也会有这感想,虽然官方固件一直说有更新,但是进度太慢了,而当时第三方的固件还很少,几乎没有。不过有一个比较不错的,就是可以刷华硕的RT-N14U,这个固件我用了一段时间,发现还算不错,比原配的好多了,特别喜欢里面的QOS功能,但用了一段时间后我姐老是说WIFI信号差,当时我也感觉到有这个情况,但不知道什么原因。就这样我直接换回了原本的路由,这个就一直放着没用,现在想想,估计是我当时把WIFI设置有关。

直到最近,我辞掉了工作,呆在家的时间多了,在家用电脑和手机流量也增加,发现那个老DLINK路由,好像支撑不过,多几个设备运行流量多点,就会出现延迟,得几天就重启一下。换回如意云RY-1,就想着换个固件系统,网上找了一圈,最后决定尝试下981213大大的固件,他的固件,包含的东西比较完整,github也有其公布的源码。试着根据源码编译了个7620N的固件,刷上后,感觉还行,一切正常,但UBOOT好像有影响,具体原因我也不懂,但启动后不能按以前的方式进恢复模式。另外测试了几天,无线感觉有点问题,会偶尔中断一下,上网查了下,发现说7620N的开源驱动不太稳定,会丢包,这个问题估计比较难解决。听说PandoraBox的驱动不一样,改天或者测试一下看看情况。

修改路由内核参数,改善负载均衡效果

网上发现一篇关于修改基于Linux内核修改路由内核参数,改善负载均衡效果的文章,改作者主要用的是openwrt,执行命令:

echo -1 > /proc/sys/net/ipv4/rt_cache_rebuild_count

原文介绍如下

建立多个PPPOE链路后,进行负载均衡与带宽合并的方法一般是利用内核中提供的equal cost multipath功能,添加一条特殊的默认路由表项。此表项带有多个下一跳(nexthop)目标,并带有各自的权重。在匹配到这一表项后,内核根据权重随机挑选一条nexthop目标,将数据包路由出去。
这个看上去很完美的方案在实际使用中常常会遇到这样的问题:在访问同一目标地址时负载均衡效果不明显。

网上发现一篇关于修改基于Linux内核路由的内核参数,改善负载均衡效果的文章,作者主要用的应该是openwrt,执行命令:

echo -1 > /proc/sys/net/ipv4/rt_cache_rebuild_count

原文介绍如下

建立多个PPPOE链路后,进行负载均衡与带宽合并的方法一般是利用内核中提供的equal cost multipath功能,添加一条特殊的默认路由表项。此表项带有多个下一跳(nexthop)目标,并带有各自的权重。在匹配到这一表项后,内核根据权重随机挑选一条nexthop目标,将数据包路由出去。

这个看上去很完美的方案在实际使用中常常会遇到这样的问题:在访问同一目标地址时负载均衡效果不明显。比如用多线程从单一地址下载一个文件,会发现传输速率大致只相当于一条线路的带宽。
其原因在于路由缓存(routing cache)。使用 ip route show cache命令能查看系统中的路由缓存,看上去像是大量这样的表项:
local 192.168.1.2 from 198.173.**.** dev lo  src 192.168.1.2
    cache   iif eth0
在对数据包进行路由判定(routing decision)时,为了效率,内核会先查看路由缓存,然后才是真正的路由表。这也是我们在修改路由表项后一般会运行一下ip route flush cache的原因。也正是因为这个原因,在向同一目标地址发起多个连接时,只会用到一条线路,就是routing cache中的那条线路。

解决这一问题的方法是显然的:禁用掉路由缓存。但你会惊奇地发现,内核中居没有一个直接的选项作为路由缓存的开关。在google了N次之后,我终于发现这一个神一般的内核参数:

/proc/sys/net/ipv4/rt_cache_rebuild_count

内核官方文档像这样解释这一参数:
The per net-namespace route cache emergency rebuild threshold.
Any net-namespace having its route cache rebuilt due to
a hash bucket chain being too long more than this many times
will have its route caching disabled
大致意思是说,routing cache是以带bucket的散列表的形式来存放的。当bucket大长,散列冲突太多,超过这一限定值时,为了效率就进行一次rebuild。当这种情况发生许多次时,内核会认为routing cache没有起到应有的作用,于是禁用掉routing cache。禁用掉routing cache!看到没,这不正是我们想要的吗?
解决方法是简单地将这一参数设置成-1,这样任何长度的bucket都会触发rebuild,进而禁用掉routing cache:
echo -1 > /proc/sys/net/ipv4/rt_cache_rebuild_count
之后再从同一源地址多线程下载文件,便能看到质的变化:
  
大家会问,禁用掉routing cache会不会影响路由的转发性能呢?
事实上是这样,由于一般家用路由的路由表项极少,禁用掉routing cache对性能的影响非常小。在我个人的实际使用过程中完全感觉不到。反倒是多线程下载的速度明显提升了。

但据部分使用的朋友反映,如果路由的CPU负载太高,或者根本不够用,禁用掉缓存会影响性能,所以如果路由本身已经开了太多进程或应用的,看下平均负载再决定是否禁用,

原文链接: http://www.morfast.net/blog/linux/load-balance/