1 引言

积跬步以至千里,积怠情以至深渊,我要做一个踏实的ABCer。

没想到还是正式步入了SDN这条康庄大道上。一切还需从初识Mininet-WIFI说起,以为SDN如仿真层面那般,一个模块对应一个现有设备,殊不知硬件层面诸多设备还需自行编译,手动刷入自需固件。编译有风险,刷固件需谨慎。在此分享折腾了本人几天时间的刷机历程——用OpenWRT将路由器刷成支持openflow协议的交换机,并将详细介绍编译开源系统OpenWRT路上踩过的坑以及解决方案。

2 刷机环境

  • Ubuntu 18.04 (64位)
  • TP-Link TL-MR3420 v1P.S. 路由器基本情况介绍,TL-MR3420是一款可刷OpenFlow的3G无线路由器(5G时代都来了,3G时代的老设备…当然是咸鱼来的),具体哪些路由器可以刷OpenFLow可以参考http://wiki.openwrt.org/toh/start#supported.hardware.-.router.type,根据经验,只要能搞到以上链接中的任一台交换机,按本教程走,基本上是都可以刷机成功的。本文路由器基本信息介绍如下图所示

3 下载OPenWRT源码编译

3.1 安装依赖项

本文采用从OpenWRT源码编译生成固件,在下载源码之前,需要在Ubuntu上安装相关编译环境

sudo apt-get update
sudo apt-get install build-essential binutils flex bison autoconf gettext texinfo sharutils subversion libncurses5-dev ncurses-term gawk zlib1g-dev libssl-dev mercurial

3.2 下载OpenWRT源码

踩坑1: 接下来以下步骤一定要都以非root身份来完成所有工作,经过多次失败查询多方教程得此结论。

2018年之后,OpenWRT与LEDE宣布合并,下载OpenWRT源码的方法发生了重大的变化。之前网上搜索到的下载方法已经不可用了,最好自行搜索完成进行确认后再clone,以免往后的步骤浪费不必要的时间。

# 克隆官方源用以下代码
# git clone https://github.com/openwrt/openwrt.git

# 或者克隆15.05分支Chaos Calmer
git clone https://github.com/openwrt/chaos_calmer.git

下载源码后,切换到OpenWRT下,打开其中readme文件,并参考其中步骤,拷贝feeds.conf.default并命名为feeds.conf

cd chaos_calmer
cp feeds.conf.default feeds.conf

而后更新并安装所有可用的feeds

./scripts/feeds update -a
./scripts/feeds install -a

踩坑2: 不要轻易复制教程代码,最好手敲一遍,确保符号是 - 而不是 –

4 下载openflow1.3源码

目前本人好像已经找不到1.0版本的源码了,若有读者有资源,欢迎评论。将其克隆到本地,与openwrt在同一级目录下。

git clone https://github.com/CPqD/openflow-openwrt.git

建立软链接,将openflow-1.3文件夹映射到openwrt的package目录下;并将openflow-1.3目录下的files文件夹映射到openwrt目录下。以下为本人建立软连接代码,读者应根据自己的目录进行软连接的建立。

cd ~/Workspace/OpenWRT/chaos_calmer/package/
 ln –s ~/Workspace/OpenWRT/openflow-openwrt/openflow-1.3/
 cd ~/Workspace/OpenWRT/chaos_calmer/
 ln –s ~/Workspace//OpenWRT/openflow-openwrt/openflow-1.3/files

5 配置编译

make menuconfig

踩坑3: 一定要到openwrt目录下运行以上代码,切勿看多方教程,运行了以上代码,又运行诸如make defconfig代码,不然会报出莫名奇妙的错误(具体在哪个教程上看到找不到了,反正本人试过一回,结果果然失败了)踩坑4: 在执行make menuconfig的时候,会报一个错误(Build dependency: Please install Git (git-core) >= 1.6.5),解决方法为找到文件 openwrt/include/prereq-build.mk 的第148行 git clone 2>&1 | grep – --recursive改为 git version

执行成功后,进行如下几个重要配置:

  1. 选择CPU型号,可以在官方support device找到你的路由器,并查看对应型号,执行如下操作 Target System — Atheros AR7xxx/AR9xxx
  2. 选择对应的路由型号,本人选择TL-MR3420,执行如下操作 Target Profile — TL-MR3420
  3. 选定Network,添加OpenFlow,执行如下操作 Network — openflow
  4. 其他配置 添加LuCI,collection — luci,这是中文图形界面的设置,由于本实验路由器flsh内存只有4M,所以这 里不装,以免编译出来的固件大于4M,在更新固件操作时会失败; 添加utf8:Kernel modules — Native Language Support — kmod-nls-utf8

配置完编译内容设置后,执行编译命令make等待即可,后面的V=99是为了显示更多的编译信息,该过程需要联网。注意,执行时,大坑要来了!

make V=99

踩坑5: 执行最后编译命令时,会报以下错误

openwrt vlan交换机 多ip段 openwrt当vlan交换机_软件定义网络

百思不得其解,找了各种教程,进行了各种尝试均失败了,太难了,终于找到原因,原来是官方源码clone下来的文件中居然相比较于原始网站git.openwrt.org上的内容少了一个文件!! 将丢失的010-automake-port-to-Perl-5.22-and-later.patch文件拷贝到chaos_calmer/tools/automake/patches下面。

最终进行大概2个小时左右的时间即可编译成功。

6 刷机

编译完成后,会在bin文件夹下生成ar71xx文件夹,其中openwrt-ar71xx-generic-tl-mr3420-v1-squashfs-factory.bin文件会是我们需要的固件,该固件的命名规则为openwrt-系统版本-硬件平台-具体分支-设备型号-硬件版本-分区类型-固件类型.bin。 本实验采用网页直接刷入固件,可以登录192.168.1.1,找到软件升级选项,按提示上传以上艰辛过程得到的固件更新即可。注意!刷机过程中不要断电,耐心等待,否则路由器会变砖。

7 验证

刷机成功后默认无线关闭,需要用一条网线连接电脑和路由器lan口,用ssh登录到路由器,用户名为root。进入系统后,界面如下

openwrt vlan交换机 多ip段 openwrt当vlan交换机_SDN_02

若想开启路由器的无线功能,修改/etc/config/wireless,将option disable 1改为0重启路由(重启wifi也行,输入wifi等待重启)即可。