使用SVN让WordPress升级时合并定制的更改

因为实在是受不了阿里云每天推送wordpress有各种漏洞,决定还是尽量把wordpress升到最新版本。但个人对wordpress的代码进行过多处的修改(例如文章id复用、评论模板、主题修改等),直接升级就会被覆盖掉。所以决定引入版本管理。

服务器上直接安装TortoiseSVN,安装时建议选中命令行工具,这样就可以直接用svnserve开服务从远程连接,无需再安装VirtualSVN。

先考虑一下我们的逻辑。我的blog最后一次手动更新的版本是4.2.1,当前最新的版本为4.7.3。通常来说的逻辑应该是将当前正在跑的版本与4.2.1比对得出我自己修改过的差异,然后覆盖安装4.7.3,最后把我修改过的差异打到新版本上。方法就是先来diff一下生成patch文件,然后直接升级,最后来应用patch。

不过我们可以从反方向的角度来考虑这个问题,即将我自己修改的网站看作trunk,将wordpress官方4.2.1到4.7.3的(大范围的)更改看作分支,将这个修改集合并到我这边的主干上。这样考虑就可以很方便地用svn来进行了。以下为参考步骤。

1、创建一个仓库。建立一个/trunk/main,用于存放当前的网站。
2、建立一个/vendor/wordpress/current,下载4.2.1解压进去,提交。
3、svn复制current里的所有文件到main,更新工作集。
4、服务器上checkout当前的main,但不覆盖现有的文件,这样直接提交,将网站上的内容覆盖到main,这样main里就有了我修改过的内容。
5、删除current里的所有文件,下载4.7.3解压进去,执行一下添加所有文件,提交(乌龟会检查需要删除的文件,但未版本的文件要手动添加),这样current就滚到了最新。
6、到main里执行merge。merge来源为current,合并范围为从第2步之后current的rev,到head。这之后main就刷到了4.7.3,并且保留了我自己的更改。可能会有部分文件冲突需要手工合并。然后提交。
7、服务器上update最新的main。浏览器访问wp-admin升级数据库。

以后再遇到更新时,就直接将新版本替换到current里,然后将更改合并到main里。想方便的话还可以做个钩子让提交时服务器自动update。

20171129 4.7.3 to 4.9记录:
1、checkout current,下载4.9解压进去,执行添加所有文件(结果刚才忘了,合并后wordpress少文件打不开了),commit。
2、直接拿iis目录当working目录执行merge,来源为current,范围写current上一次的rev(刚刚commit之前的rev)到head。因为上次搞乱了line ending,选上忽略换行符合并。
3、合并顺利完成,访问正常,提交trunk。

参考文献:http://svnbook.red-bean.com/en/1.5/svn.advanced.vendorbr.html

通过智能TTL锁定防止ISP广告、DNS劫持的一些想法

最近思考两个事情,一个是DNS劫持的升级,以往的方法失效了,另一个是铁通劫持了百度统计(hm.baidu.com)造成几乎全网的页面都被插广告。

劫持的原理都是抢先发送IP包,这样TTL一般会与正确的网站发来的数据不同。据抓包观察,几乎所有的劫持都没智能到使用伪造的正确TTL。大部分都是没有改TTL,抓到的是固定的,高级一点的如目前的DNS劫持会使用随机TTL。

很容易想到ping一下目标服务器,拿到正确的TTL,然后在路由器里用iptables的ttl模块做限制。但这样需要针对每个ip手动去ping出一个TTL。并且有时候TCP与UDP走的路由数并不一样,不是一个固定的值,而是一个范围,那么想要得到相对准确的范围就要手动去抓包。

所以我的想法是通过编程自动地进行这个工作,比如写一个iptables内核模块。

由于TTL是一个范围而不是定值,这个模块应该能足够地聪明,能够通过收集各个TTL出现的频率来计算出一个最佳的范围。这个算法的设计还是有点意(jiu1)思(jie2)的。

目前实验中遇到与解决或未解决的典型问题记录如下:

1、初始范围如何设定,不限制还是给一个+-5的范围。+-5的话在优酷的案例会失败(优酷的TCP第四个包会有两台主机重复发送,TTL初始值不一样,下面会详解)

2、线路路由调整。如果TTL在之前的计算中已经锁定,则路由调整后则没法再访问,除非重新计算。

3、如果为了解决问题2而增加计算频率,如何平衡性能损失。

4、大型网站具有网关结构,表现在IMCP、UDP、TCP的SYN等无连接数据由防火墙处理,建立连接后的数据包转发至真正的服务器处理。例如百度,SYN包的TTL会比数据包大2-4,这个还可以通过范围设定解决,更蛋疼的是例如优酷的案例,防火墙设定的TTL初值是256,而数据包的TTL初值是64,相差这么大但是哪个都不能被过滤,目前我的做法是区分无连接与有连接。

5、正常的随机TTL情况,例如114.114.114.114。如何与劫持包的区分。

开发内核模块比较麻烦,openwrt自带一个iptables-mod-lua模块,可以在内核里写lua脚本处理封包,可以先用这个做实验。不过似乎有一些限制,例如我写的时候没法使用table.insert、table.sort这些库函数(阅读了一下源代码,虽然PacketScript有编译string lib与table lib,但是在初始化state时没有(忘了?)调用lua open把这些库注册到全局变量中)。

贴出实验代码,以后还会更新:

iplist = {}

function process_packet(p)
	local saddr = p:data(packet_ip):saddr():get()
	local ttl = p:data(packet_ip):ttl():get()
	local tcp = p:data(packet_ip):data(packet_tcp)
	if tcp and not tcp:flags():get(15) then saddr = saddr .. ':tcp' end -- i dont know why syn become bit 15
	if not iplist[saddr] then
		print(saddr .. ',' .. ttl)
		iplist[saddr] = {count = 0, lb = 0, ub = 255, map = {}}
	end
	local data = iplist[saddr]
	if not data.map[ttl] then data.map[ttl] = 0 end
	data.map[ttl] = data.map[ttl] + 1
	data.count = data.count + 1
	if data.count == 100 or data.count % 1000 == 0 then
		if (data.count > 1000000) then
			data.count = 0
			for i, v in pairs(data.map) do
				data.map[i] = data.map[i] / 10
				data.count = data.count + data.map[i]
			end
		end
		
		local zero = 0
		local flag = true
		local block
		function ttlval(i)
			if not data.map[i] then return 0 end
			if data.map[i] < zero then return 0 end
			return data.map[i] - zero
		end
		while flag == true do
			local blocks = {}
			local i = 0
			flag = false
			while i <= 255 do
				while i <= 255 and ttlval(i) == 0 do i = i + 1 end
				if i > 255 then break end
				block = {lb = i, ub = i, count = ttlval(i)}
				i = i + 1

				while ttlval(i) > 0 or ttlval(i + 1) > 0 or ttlval(i + 2) > 0 do	--连续3个ttl为空认为可分块
					block.count = block.count + ttlval(i)
					i = i + 1
				end
				block.ub = i - 1
				blocks[#blocks + 1] = block
			end
			block = nil
			for i = 1, #blocks do
				if not block then block = blocks[i] end
				if blocks[i].count > block.count then block = blocks[i] end
			end
			if block.ub - block.lb > 9 then
				local av = block.count / (block.ub - block.lb + 1)
				for i = block.lb, block.ub do
					if ttlval(i) > av * 2 then
						zero = av
						flag = true
						break
					end
				end
			end
		end
		data.lb = block.lb
		data.ub = block.ub

		print(saddr .. ',' .. data.lb .. '-' .. data.ub)
	end
	if (ttl < data.lb or ttl > data.ub) then return NF_DROP end
	return XT_CONTINUE
end

使用很简单:iptables -t mangle -A PREROUTING -i pppoe-wan -j LUA –script ttl.lua

Win7下借助VirtualBox虚拟机和承载网络构建无线软路由

为什么需要Linux路由呢,因为那啥啥啥的原因,需要进行那啥啥啥,只有使用iptables、ipset这些工具才能做到完美透明那啥。

为什么要用虚拟机做软路由呢,因为有时候需要将电脑带出去,显然不能就为了个那啥还要在书包里放个路由器。尽管自己组装了个U盘大小的WR703N模块美名曰那啥神器,但没有精力去专门为那啥设计固件,也没设计reset键,万一配置的时候玩坏就把自己墙了。

关于那啥的配置之前已有多篇文章详细写,请自行翻阅。这里只写虚拟机和Windows的配置。

关于虚拟机,首先你需要装个Linux。当然你可以直接用OpenWrt的x86版,但是笔者因为本身就经常使用Linux,所以就直接在常用的发行版上配置了。

为了实现路由功能,我们需要给虚拟机装两个网卡。我们设计第一个网卡eth0用来当wan,第二个网卡eth1用来当lan。在VirtualBox的网络设置里,将网卡1设为桥接网络桥接到电脑用来上网的网卡上(本地连接或无线网络连接),将网卡2设为仅主机(Host-Only)网卡。关于网卡1设为桥接网络而不是NAT网络,因为我们一会儿要让电脑通过虚拟机上网,而让虚拟机直接从上级路由分配IP,NAT的话就反了。关于网卡2,Host-Only就相当于一根网线的两端,一会儿我们就让电脑通过这个网卡连接到虚拟机。

在虚拟机里首先设置两个网卡,例如debian的配置文件是/etc/network/interfaces,设置后/etc/init.d/networking restart。本例中我的配置为:
auto eth0
iface eth0 inet dhcp
auto eth1
iface eth1 inet static
address 192.168.56.1
netmask 255.255.255.0

在通常的桌面发行版中,linux默认是没有开启ip转发功能的,编辑/etc/sysctl.conf将net.ipv4.ip_forward=1取消注释,重启后生效。若想即时生效可以执行一句echo 1 >/proc/sys/net/ipv4/ip_forward。另外,我们使用的路由实际上是NAT网关,需要添加iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE规则以开启NAT转发。

在windows网络设置里,需要将本来用于上网的网卡(本地连接或无线网络连接)的IP地址设为无法上网的地址(如169.254.x.x,默认网关空),否则本机会从上级路由分配到IP与默认网关,这会让windows路由表困惑。然后,由于本例中我没有在虚拟机里安装DHCP服务,故将Host-Only网卡设为固定IP地址192.168.56.2,默认网关192.168.56.1,DNS可设为到常用的8.8.8.8、223.5.5.5、114.114.114.114等,如果虚拟机有安装DNS服务也可设到192.168.56.1。

此时电脑应当可以通过虚拟机上网。随后开启win7的无线承载网络以实现无线AP,注意有些老旧的无线网卡可能不支持承载网络,或不支持同时用作上网和开启AP。
netsh wlan set hostednetwork allow SSID KEY
netsh wlan start hostednetwork

最后打开Host-Only网卡的属性,在共享选项卡里将该连接共享到开启无线承载网络时添加的虚拟无线网卡上(一般为无线网络连接2),此时该虚拟网卡的IP会被自动设置为192.168.137.1,连接的设备会由windows分配到这个网段的IP并进行一次NAT。由于这个虚拟无线网卡不能设置桥接,所以只能通过windows internet共享接入网络。

实际的效果相当于设备经过192.168.137.1、192.168.56.1、192.168.1.1三次路由后到达外网。设备访问电脑可以用192.168.137.1这个IP,电脑和linux可用192.168.56.1、56.2互相访问。

Debian + MATE

再谈debian的发布策略

软件包首先会进入unstable(开发代号sid),这是唯一真正的每天滚动更新,相当于软件的trunk。风险是随时会挂掉,很久之前我就栽过一次,但据官方说bug修复也很快,一般几天就能恢复。

日常情况下在unstable中十天左右的软件包会合并到testing。testing要比unstable稳定,但万一挂掉可能要数十天甚至一个月才能修复,因为修复也要等十天才会进到testing。

testing日常情况下也是每天滚动更新与unstable同步,然后到了冻结。冻结时testing不再与unstable同步,仅允许小的更新和bug fix。注意冻结的是testing本身,而不是所指的版本代号,不存在只冻结开发代号而将testing分支到新版本的情况。

最后testing改名为stable,然后分支出新的testing解除冻结,再慢慢将unstable里的软件同步过来。总结一下就是testing会被冻结个半年,解冻的时候apt upgrade相当于大升级。

好多地方都没有说清testing冻结的真正过程,官方这里写的很详细。https://www.debian.org/doc/manuals/debian-faq/ch-choosing.en.html

发行版与桌面选择

如果是需要一个平时使用的系统,推荐Ubuntu,更推荐Mint。但是笔者是搞开发的,前段时期用的Mint Debian(LMDE)其实很不错。但是笔者又是重度精简强迫症患者,嫌LMDE中不需要的软件太多,所以又滚回了debian。中途尝试了一下Arch,然后突然觉得,都是基本系统那么一两百个包的话还在乎毛线的发行版区别,果断滚回熟悉的apt与init.d,毕竟openwrt也是类debian的。

现在觉得适用于编译和开发还是基本系统+桌面环境的组合比较好,考虑到经常是在虚拟机里跑,性能和易用性上还是gnome2最好,也就是现在的MATE。由于是mint项目组负责维护,美化上有了很大的进步。

testing比unstable要相对稳定,比如不会出现依赖更新了一半(例,某底层软件包升级了大版本,但上层依赖还没有修改到新的上,upgrade后就完蛋了),但是testing作为需要被发布的版本,在发布周期末尾及会强迫症发作,比如ffmpeg的当前作者因为官方就是不给合并到即将明年发布的testing里而在bugs邮件列表里和官方吵了几个月。现在系统又给弄成了sid,不过比起上次加了apt-listbugs护身,看看哪天会更新后再次挂掉。

基本系统安装

如果是安装testing或unstable一般使用daily镜像启动以确保最新。有两种镜像,一个是netinst,280M左右,包含了安装程序和基本系统,可脱机安装;另外是mini,30M,只包含内核启动,安装程序组件和基本系统都在线下载。netinst只打包testing,如果要装sid需要安装后改sources.list到sid然后dist-upgrade;mini可以在安装时选择stable、testing和unstable。

如果使用mini镜像,则必须确保是daily镜像,而不能使用beta发布版,正确的下载地址是http://d-i.debian.org/daily-images/amd64/daily/netboot/mini.iso。因为安装程序需要在线下载必要的驱动,不是最新版的话会出现内核不兼容而无法加载硬盘驱动。

要想得到最基本的系统,需要在启动项里选expert install,安装时手动跳过“安装软件”这一步,否则会启动tasksel并自动安装task-laptop里的软件。

安装时不要启用root帐号,否则不会安装sudo。locales安装时建议只选择英语,因为基本系统安装后要在纯控制台下安装桌面等软件。

配置与安装软件

开启root帐号:
sudo passwd && su

MATE桌面环境:
apt-get install xorg lightdm mate

桌面中文与字体美化:
dpkg-reconfigure locales添加中文区域并设为默认。
mate桌面环境会自动安装dejavu和droid字体,中文支持很不错,不要像以前那样装什么xfonts*,文泉驿也不用装,装了反而会抽。
进入外观设置,将应用程序字体改为9号,另外依个人喜好调整一下truetype渲染。
开终端的时候顺便把终端配置改成黑底灰字,matrix爱好者可用黑底绿字(其实只适合拍电影不适合日常使用),debian常年来默认的白底是要瞎眼的节奏。

VirtualBox Guest Additions:
目前版本仓库里可以直接apt-get install virtualbox-guest-x11。
也可手动安装:
apt-get install build-essential linux-headers-amd64
mount /dev/cdrom /mnt
/mnt/VBoxLinuxAdditions.run
umount /mnt
桌面自动挂载的似乎有执行权限的问题,所以这里是手动挂载光驱。

一些软件:
network-manager-gnome:gnome网络配置,真机要用这个连无线
mozo:mate的主菜单编辑器
apt-listbugs:sid升级护身符
fcitx fcitx-googlepinyin:输入法。一些依赖会自动安装
bash-completion:bash自动完成,用于apt-get软件包tab键补完
gvfs-backends:gnome文件浏览中smb等协议的支持
iceweasel iceweasel-l10n-zh-cn:“冰熊”浏览器,不吐槽了
chromium chromium-l10n:chrome浏览器
vlc:很NB但是很丑的播放器

i386支持:
需要运行x86程序的话(这个概率其实非常小),最新debian采用多架构的方案。
dpkg –add-architecture i386
apt-get update
apt-get install libc6:i386。

 

 

Psiphon for OpenWrt

本文谢绝转载与链接。软件包:openssh-client、empty(用于自动输入密码)处理服务器列表的脚本psi_list.sh:

#!/bin/shsed -r 's/\{"data": "([^"]*)".*/\1/' |\sed 's/\\n/0a/g' |\while read -n2 c; do printf "\x$c"; done |\sed -r -n 's/.*"region": "([^"]*)".*"capabilities": \[.*"SSH".*\].*"sshPort": ([0-9]*).*"sshUsername": "([^"]*)".*"ipAddress": "([^"]*)".*"sshPassword": "([^"]*)".*/\4\t\1\t\2\t\3\t\5/p'

使用:wget -O – https://psiphon.ca/server_list | ./psi_list.sh > /etc/psi_server建议在pc上执行,路由器上shell处理hex string的那步太慢。仅支持ssh服务器。ossh懒去编译的,meek是go语言写的,重写太难。服务启动脚本/etc/init.d/psiphon:

#!/bin/sh /etc/rc.commonSTART=95PID_FILE=/var/run/psiphon.pidstart() {while read host region port user pass; do[ ${host:0:1} = '#' ] && continueecho "Try connecting $host"empty -f -p $PID_FILE ssh -C -N -D 0.0.0.0:1080 -p $port -l "$user" "$host"while true; do	empty -w -t 2 'yes/no' 'yes\n' 'assword:' "$pass\n" >/dev/null	case $? in	2)		echo 'Connected'		exit		;;	255)		echo 'Connect failed'		empty -k		break		;;	esacdonedone < /etc/psi_server}stop() {kill `cat $PID_FILE`}

参考文献:Build a wheel of autossh using expect

OpenWrt usb挂载与samba 配置与测试

软件包

usb基础软件包:kmod-usb-core kmod-usb-ohci kmod-usb2(ehci)等。newifi mini的官方14.07已打包。
usb存储:kmod-usb-storage block-mount
fat32文件系统:kmod-fs-vfat kmod-nls-cp437 kmod-nls-iso8859-1(字符编码包必须要装)
ntfs文件系统:ntfs-3g。不要装kmod-fs-ntfs,umount的时候内核不稳定。

挂载与卸载

mount /dev/sda2 /mnt/usb
umount -l /mnt/usb

也可以指定文件系统:mount -t ntfs-3g /dev/sda2 /mnt/usb
或是直接运行ntfs-3g:ntfs-3g /dev/sda2 /mnt/usb
mount会自动调用/sbin/mount.ntfs-3g,符号链接到/usr/bin/ntfs-3g

参考:http://wiki.openwrt.org/doc/howto/usb.storage

Samba

软件包:samba36-server luci-app-samba

默认情况下无密码访问会遇到可读不可写的权限问题,比较方便的解决方法是让samba以root账户运行:
修改/etc/samba/smb.conf.template:
guest account = root
#invalid users = root

exFAT

需要自己编译,可checkout极路由的package:https://github.com/hynnet/hiwifi-openwrt-HC5661-HC5761/tree/master/package/exfat

挂载:mount.exfat /dev/sda1 /mnt/usb

有时候卸载不干净会导致再度加载不上,需要拔下来重插,甚至要在电脑上插一下自动修复。
大硬盘如果簇分得太小会因为路由器内存不够而失败。

性能

newifi mini,使用2.4G无线网络测试samba复制文件速度。

fat32读写速度能达到8M,似乎是2.4G无线的上限。
ntfs-3g读速度6M多,写速度2M多。瓶颈是CPU。

所以下载速度在2M以下的是可以考虑用ntfs挂下载的,但是不推荐,万一中头彩微软可不负责:http://bbs.cfanclub.net/thread-497916-1-1.html

6M读速度可以满足任何高清电影的播放,6M等于48M码率呢。

newifi mini不要用5G网络使用samba共享。mt7612e驱动在samba时有故障,5G网卡似乎与USB总线冲突,影响包括PandoraBox在内的很多第三方固件:http://www.right.com.cn/forum/thread-149292-1-1.html#pid936103

 

 

newifi mini纯净版OpenWrt兼容内核固件,集成rt2860v2、mt76x2e驱动

基于原生OpenWrt Barrier Breaker 14.07,使用SDK && ImageBuilder构建,与官方14.07内核兼容,可直接安装官方源任意软件包(包括内核模块)

尝试做这个事情主要是因为PandoraBox固件没有打包某些我需要的内核模块,因为都是3.10内核,有些ko是可以忽略警告强行安装的,但少部分ko因引用内核头文件config而无法二进制兼容(例如ipset,你懂的)。

友情提醒1:此固件不适合普通小白使用,需要对OpenWRT有一定的了解,具备初级的Linux折腾能力,至少要会用vim编辑network、wireless等配置文件,因为LuCI不支持配置rt2860v2驱动的无线参数。
友情提醒2:此固件是纯净版,不因任何用户喜好集成任何功能,需要各种功能的请自己opkg安装。

感谢泄漏驱动代码的有关单位以及lintel、dq等大神的贡献:https://github.com/qdk0901/openwrt-mt7620

已知问题:
1、无法通过LuCI配置无线。这是原版ralink驱动的硬伤,请参考下面的范例配置/etc/config/wireless。
2、5G驱动使用samba时会抽,PandoraBox也有这个问题,见http://www.right.com.cn/forum/thread-149292-1-1.html#pid936103

变更历史:

20141104 r2:
1、Port到14.07正式版(14.07-rc3无法正常使用USB)。
2、添加5G驱动kmod-mt76x2e。
3、无线配置脚本使用最新PandoraBox里的脚本。
4、恢复默认的USB软件包。
5、修复2.4G与5G的LED。

20141023 r1:
1、移除mac80211及rt2800相关的驱动。
2、添加rt2860v2驱动,修复了读取ROM的一处错误。
3、添加luci-i18n-chinese
4、移除ipv6相关软件包及uci初始化时写入的ipv6相关配置。
5、移除usb相关软件包(内核兼容用时再装)。
6、修正newifi mini的交换机接口定义。
7、初始ip地址为192.168.99.1(大多人买这个当从路由)
8、初始root密码为admin。

/etc/config/wireless范例:

config wifi-device 'ra0'
	option type 'rt2860v2'
	option mode '9'
	option channel '6'
	option txpower '100'
	option ht '20+40'
	option country 'US'
	option disabled '0'

config wifi-iface
	option device 'ra0'
	option network 'lan'
	option mode 'ap'
	option ssid 'NEWIFI'
	option encryption 'psk2'
	option key 'xxxxxxxx'

config wifi-iface
	option device 'ra0'
	option network 'wwan'
	option mode 'sta'
	option ssid 'TPLINK'
	option encryption 'psk2'
	option key 'xxxxxxxx'

config wifi-device  rai0
	option type     mt7612
	option mode 	14
	option channel  auto
	option txpower 100
	option ht 20+40+80
	option country US
	
config wifi-iface
	option device   rai0
	option network	lan
	option mode     ap
	option ssid     NEWIFI_5G
	option encryption psk2
	option key xxxxxxxx

下载地址:openwrt-newifi-y1-r2-20141104

在openwrt brcm63xx优雅地安装broadcom wl无线驱动

原生的openwrt在63xx设备上自带的是b43驱动,而(据说)博通官方的wl驱动要比社区的b43要稳定一些。

我个人的使用感受是b43好像是不能中继的(至少我当年在DB120、10.03.1系统上测试不成功),以及流量大时cfg80211会占用很大的cpu,挂下载的时候延迟会飙到2000ms,有时还会断线,总之是各种不爽,后来不得不插一个tplink的usb供电小ap才稳定下来。

最近终于折腾好了wl驱动,发现如果是挂迅雷、连接数多的情况下延迟同样会飙高,但总算没掉线,迅雷限制连接数的话就没有任何问题。个人感受比以前好一些。

下面说优雅地安装方法。官方wiki有提到wl驱动,但说的不仔细,如果按照wiki上说的只是安装一个kmod-brcm-wl的话,恭喜上当。

经过很多次失败的配置,最后对imagebuider中profile的阅读,笔者发现wl驱动至少需要安装3个包:
kmod-brcm-wl:内核驱动
wlc:wl的uci客户端,安装后才能在/etc/config/wireless中设置参数
nas:用于无线加密,如果不安装,会出现无线信号,但是连不上

如果有洁癖,想删掉原来的b43,可以移除以下所有包(测试发现opkg不会优雅地autoremove没有被依赖的包),注意顺序为反依赖顺序,不可随意改变:
kmod-b43
kmod-bcma
kmod-mac80211
kmod-crypto-arc4
kmod-crypto-aes
kmod-crypto-core
kmod-cfg80211
iw
wpad-mini

最后重启系统。重启系统的目的是运行wlunbind脚本,取消b43与pci什么的绑定,否则wl驱动将无法启动。如果dmesg中有这个原因启动失败的消息,可以尝试/etc/init.d/wlunbind boot。

如果/etc/config/wireless中没有出现wl设备,可尝试wifi detect写入配置。

至此,wl无线应当可以正常工作。

20150703 Edit: BB固件将wireless放到了netifd中,造成启动路由器以及重启network服务不会自动执行wifi up。建议装AA固件。