最近要做一个Mininet的网络环境,网络设备由Mininet来模拟,SDN控制器用Ryu来做,为了避免每次重新做再去翻查资料,我在这里系统地整理一遍
硬件需求
我在 VMWare Workstation 16 Player虚拟机上运行的Ubuntu 22.04.1
硬件 | 需求 |
---|---|
内存 | 至少4G以上,我分配了8个G |
CPU | 至少2个核心,我分配了4个 |
硬盘 | 30G以上,我分配了100G |
版本需求
软件 | 版本 |
---|---|
Ubuntu | 22.04.1 |
Mininet | 2.3.0 |
Ryu | 4.34 |
Python | 3.8 |
Ovs | 2.9.8 |
Openflow | 1.3 |
软件安装
这两句随时准备着,出问题的时候先尝试一下
sudo apt update
sudo apt upgrade
Mininet安装
sudo apt-get install git
git clone https://github.com/mininet/mininet
cd mininet
git tag
git checkout -b mininet-2.3.0 2.3.0
cd ..
mininet/util/install.sh -a
第一个问题,端口拒绝访问:
Cloning into 'openflow'... fatal: unable to connect to github.com: github.com[0: 20.27.177.113]: errno=Connection refused
git config --global url.https://github.com/.insteadOf git://github.com/
mininet/util/install.sh -a
安装完毕后测试:
sudo mn --switch ovsbr --test pingall
测试成功:
Ryu安装
接下来这几步我只是为了说明python3.10中运行Ryu的困难,我搞了一整天,甚至不小心删除了python3.10搞崩了Ubuntu,也没有搞定这些问题,嫌麻烦的同学直接跳到下载python3.8的部分
sudo apt install gcc libffi-dev libssl-dev libxml2-dev libxslt1-dev zlib1g-dev -y
sudo pip install ryu
cd ryu
sudo pip install -r tools/pip-requires
查看Ryu4.34安装与测试运行:
sudo pip show ryu
sudo ryu-manager
第一个问题,eventlet版本太新:
ImportError: cannot import name 'ALREADY_HANDLED' from 'eventlet.wsgi' (/home/jzjs/.local/lib/python3.10/site-packages/eventlet/wsgi.py)
sudo pip uninstall eventlet
sudo pip install eventlet==0.30.2
第二个问题,Python版本太新:
TypeError: cannot set 'is_timeout' attribute of immutable type 'TimeoutError'
解决办法:下载python3.8,并启用虚拟环境ryu-venv,重新安装Ryu,注意有些地方不能用sudo:
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python3.8 python3.8-venv python3.8-dev
python3.8 -m venv ryu-venv
source ryu-venv/bin/activate
pip install ryu
cd ryu
pip install -r tools/pip-requires
pip uninstall eventlet
pip install eventlet==0.30.2
重新查看Ryu4.34安装,这次确实是安装在python3.8/site-packages当中了:
pip show ryu
ryu-manager
测试成功:
随时进入和关闭虚拟环境:
source ryu-venv/bin/activate
deactivate
Ryu GUI安装
Ryu GUI所需要的webob和routes库已经在下面的命令中安装完毕:
pip install -r tools/pip-requires
测试Ryu的GUI,注意,你的路径和我的不一样:
cd /home/jzjs/ryu/ryu-venv/lib/python3.8/site-packages/ryu/app/gui_topology
sudo ryu-manager --observe-links --verbose gui_topology.py
浏览器打开http://0.0.0.0:8080后,发现有如下问题:
OSError: Path does not exist or is not directory: '/home/jzjs/ryu/ryu-venv/lib/python3.8/site-packages/ryu/app/gui_topology/html/'
Ryu的GUI找不到所需文件,为了解决这个问题,手动创建所需的目录并将GUI应用程序的源代码复制到那里:
git clone https://github.com/osrg/ryu.git
mkdir -p /home/jzjs/ryu/ryu-venv/lib/python3.8/site-packages/ryu/app/gui_topology/html/
cp -r ryu/ryu/app/gui_topology/html/* /home/jzjs/ryu/ryu-venv/lib/python3.8/site-packages/ryu/app/gui_topology/html/
sudo ryu-manager --observe-links --verbose gui_topology.py
成功打开:
Mininet和Ryu联动
继续在上面的路径里,运行openflow1.3的交换机:
ryu-manager --observe-links ryu/ryu/app/gui_topology/gui_topology.py ryu/ryu/app/simple_switch_13.py
另外打开一个终端,输入Mininet的语句:
sudo mn --controller remote,ip=127.0.0.1 --topo linear,3 --mac --switch ovsk --link tc
刷新一下浏览器,可以看到下面的界面便大功告成: