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
执行成功后,进行如下几个重要配置:
- 选择CPU型号,可以在官方support device找到你的路由器,并查看对应型号,执行如下操作 Target System — Atheros AR7xxx/AR9xxx
- 选择对应的路由型号,本人选择TL-MR3420,执行如下操作 Target Profile — TL-MR3420
- 选定Network,添加OpenFlow,执行如下操作 Network — openflow
- 其他配置 添加LuCI,collection — luci,这是中文图形界面的设置,由于本实验路由器flsh内存只有4M,所以这 里不装,以免编译出来的固件大于4M,在更新固件操作时会失败; 添加utf8:Kernel modules — Native Language Support — kmod-nls-utf8
配置完编译内容设置后,执行编译命令make等待即可,后面的V=99是为了显示更多的编译信息,该过程需要联网。注意,执行时,大坑要来了!
make V=99
踩坑5: 执行最后编译命令时,会报以下错误
百思不得其解,找了各种教程,进行了各种尝试均失败了,太难了,终于找到原因,原来是官方源码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。进入系统后,界面如下
若想开启路由器的无线功能,修改/etc/config/wireless,将option disable 1改为0重启路由(重启wifi也行,输入wifi等待重启)即可。