实验需要,要搞一个SDN路由器。并没有现成的,自己动手丰衣足食。网上搜了下,最终决定选择TP-LINK TL-WR1043ND作为目标路由器,由于目前v1和v2都已停产,看了看介绍v3和v2的硬件是完全一样的,所以美亚海淘了一发TP-LINK TL-WR1043ND v3。入手以来,尝试刷机数次,今天终于成功,特此记录。
选择合适的路由器
首先你需要选择一个支持OpenWRT的路由器。可以参考官方列表:《Table of Hardware》。我参考了网上的一些文章,最终决定选择TP-LINK TL-WR1043ND。当然你也可以选择其他的,只要在列表中的应该都可以。
选择完路由器后,就要选择路由器对应的OpenWRT版本。每个路由器支持的OpenWRT版本都不一样,需要在上述列表中进行选择,下面安装编译环境的时候会用到。我的WR1043ND v3由于硬件和v2完全一样,所以支持的是15.05.1版本。
安装OpenWRT编译环境
编译前我们需要安装一个OpenWRT的编译环境。可以参考官方的文档:《OpenWrt编译系统 – 安装》。下面说明一下主要步骤。
请注意,整个过程中都不能使用 root
用户,必须使用普通用户。
- 安装git下载OpenWRT源码。安装必要工具。
sudo apt-get update
sudo apt-get install git-core build-essential libssl-dev libncurses5-dev unzip
安装subversion和mercurial:
sudo apt-get install subversion mercurial
安装必要的依赖:
apt-get install binutils flex bison autoconf gettext texinfo sharutils ncurses-term zlib1g-dev gawk ccache git quilt sharutils xsltproc
建立一个文件夹,下载OpenWRT:
mkdir openwrt
cd openwrt
git clone http://git.openwrt.org/15.05/openwrt.git
进入下载的文件夹,下载安装所有可用feeds:
cd openwrt
mv feeds.conf.default feeds.conf
./scripts/feeds update -a
./scripts/feeds install -a
顺便安装LuCI Web UI套件:
./scripts/feeds install -a luci
至此编译环境准备完成。
编译OpenFlow 1.3 for OpenWRT
下面开始编译OpenWRT。
输入下面命令进入编译菜单:
make menuconfig
需要选择以下组件,按下S
键即可选中,前面<*>
即表示已选中:
- 选择CPU型号:
Target System -> Atheros AR7xxx/AR9xxx
- 选择路由器型号:
Target Profile -> TP-LINK TL-WR1043N/ND
- 添加LuCI:
LuCI -> Collections -> luci
- 添加ddns:
LuCI -> Applications -> luci-app-ddns
- 添加自己喜欢的LuCI主题:
LuCI -> Themes
下面自己选择 - 添加UTF8编码:
Kernel modules -> Native Language Support -> kmod-nsl-utf8
- 添加tun:
Kernel modules -> Network Support -> kmod-tun
- 添加:
Kernel modules ->Network Support
下的kmod-sched-core
和kmod-sched
做出如上选择后,选择菜单下方的Save
,保存后退出。
下面下载OpenFlow1.3 for OpenWRT的源码。
在~/openwrt目录下下载即可:
git clone https://github.com/CPqD/openflow-openwrt.git
下面要建立symbolic link。
进入OpenWRT根目录,请根据自己存放位置作出选择,下面仅以我的目录为例。
需要建两次软链接,分别为:
~/openwrt/packages/openflow-1.3 -> ~/openwrt/openflow-openwrt/openflow-1.3
cd /home/tang/openwrt/openwrt/package/
ln -s /home/tang/openwrt/openwrt/openflow-openwrt/openflow-1.3/
~/openwrt/files -> ~/openwrt/openflow-openwrt/openflow-1.3/files
cd /home/tang/openwrt/openwrt
ln -s /home/tang/openwrt/openwrt/openflow-openwrt/openflow-1.3/files
完成之后再次make menuconfig
。
选择Network -> openflow
。
如果要装OpenvSwitch,也可以顺手把下方的openvswitch
给选上。
完成上述所有步骤后,开始编译:
make -V=99
-V=99
是为了显示编译过程,这样出错的时候可以直接显示错误信息。单纯的make
不会输出错误信息。
刷入TP-LINK TL-WR1043ND
如果上述的编译没有任何问题,最后会在~/openwrt/bin/ar71xx
目录下产生多个binary文件。如果编译有问题,请自行解决。
其中*factory.bin
是从原厂固件刷到OpenWRT的故将,如果之前已经将路由器刷成了OpenWRT,则使用 sysupgrade.bin
。
我之前已经刷过OpenWRT,所以直接用*sysupgrade.bin
升级即可。下面说一下第一次刷入OpenWRT的大致步骤,因为是很久以前刷的了,有些遗忘,具体可以参考官方教程 :《TP-LINK TL-WR1043ND Installation》和《Installing OpenWrt via TFTP》,下面说一些要点。
对于WR1043ND这款路由器来说,由于版本升级,目前最新的已经升级到v4了,v4暂时还没有什么支持,我的是v3,虽然和v2的硬件完全一样,但是有一点很不一样,就是不支持路由器管理界面直接刷OpenWRT固件了。这个在官方文档里也有说明:
For revision v3.0, stock FW 3.16.9 Build 151021 or newer won't accept OpenWRT image.
解决的方法很简单,就是通过tftp刷进去。简单来说,在电脑上装个虚拟机,使用桥接模式,然后IP设置成192.168.0.66,把路由器和电脑直接用网线相连,然后通过tftp将固件刷进路由器即可。大概需要20-30秒的时间。
至于如何使用tftp,对于ubuntu系统大概就是下面这么几步。
1.安装,启动tftp server,并将文件放入正确位置。此时可能需要用root
账户来操作。
sudo apt-get install tftpd-hpa tftp
sudo cp ~/uboot/arch/arm/boot/uboot.img /var/lib/tftpboot
2.测试tftp server
tftp localhost
tftp > get uboot.img
tftp > quit
cmp /var/lib/tftpboot/uboot.img uboot.img
没有任何输出就说明安装成功了。
3.刷入路由器
把之前生成的固件放入tftp server的根目录/var/lib/tftpboot
,确保路由器和电脑已通过网线连接,任何按下路由器的reset键,等待大概30秒,就能传输完成了,之后等待路由器安装OpenWRT完成后重启,就完成了刷机。
待解决问题
~~1. OpenFlow显示的版本为什么还是1.0?~~
~~2. 安装OpenvSwitch出错,提示kernel not support,应该是OpenWRT里的OpenvSwitch版本太低(2.39),不支持高版本的kernel,暂时未找到解决方法,于是也就无从验证第一个问题的真实性。~~
以上问题已经解决,参考最新文章:
参考资料
- OpenWrt编译系统 – 安装
- OpenFlow 1.3 for OpenWRT
- 【SDN】將 OpenWRT 和 Openflow 刷進 TL-WR1043ND v2.1
- OpenFlow1.3的OpenWRT刷机部署
- OpenFlow 1.3 for OpenWRT on TP-LINK TL-WR1043ND
- TP-Link TL-WR1043ND installation
- Installing OpenWrt via TFTP
- Table of Hardware
- Techdata: TP-Link TL-WR1043ND v3
- TP-LINK TL-WR1043ND 刷入 OpenWRT & OpenvSwitch & OpenFlow 1.3