Ubuntu 22.04 + Ryu/Mininet:跨越 Python 3.10 依赖“死亡三角”的完美配置指南
摘要: 本文记录了在 Ubuntu 22.04 LTS (默认 Python 3.10) 环境中搭建 Ryu SDN 控制器 (4.34 版本) 和 Mininet 过程中,所遇到的所有 Python 依赖冲突(eventlet
、dnspython
等)及其最终的解决方案。通过降级 Python 版本并使用 update-alternatives
,实现了环境的稳定运行。
一、环境与问题背景
组件 | 版本/系统 | 初始问题 |
操作系统 | Ubuntu 22.04 LTS | 稳定,但默认 Python 3.10 |
SDN 控制器 | Ryu 4.34 | 依赖旧版 eventlet 和 dnspython |
网络模拟器 | Mininet (最新) | 依赖 Linux 内核,但需 Python 环境配置 |
核心冲突: Ryu 4.34 的核心依赖库(主要是 eventlet
)设计于 Python 3.4/3.8 时代,与 Python 3.10 的新特性(如不可变的 TimeoutError
、collections
模块变更)存在严重冲突,无法通过简单的 pip install
解决。
最终策略: 保持 Ubuntu 22.04 LTS 不变,将 Ryu 的运行环境隔离并降级到 Python 3.9。
二、Mininet 与系统基础环境安装
由于 Mininet 的运行主要依赖系统内核和 OVS,应先完成其安装。
系统更新与基础工具安装:
sudo apt update sudo apt upgrade -y sudo apt install -y git python3-pip
Mininet 安装: Mininet 推荐使用官方脚本安装,它会处理好 OVS 等依赖。
git clone https://github.com/mininet/mininet.git cd mininet # -a 参数安装所有依赖和组件 sudo ./util/install.sh -a # 重新安装 Mininet Python 模块(确保 Mininet CLI 可用) sudo python3 setup.py install
(在 Mininet 目录下执行 sudo python3 setup.py install
是解决 ModuleNotFoundError: No module named 'mininet'
的关键步骤。)
三、解决 Python 3.10 兼容性问题 (核心步骤)
这是本次环境搭建最困难的部分。由于 Python 3.10 不兼容 Ryu 4.34 的核心依赖,我们选择引入 Python 3.9 并将其设置为系统默认 Python 3。
1. 安装 Python 3.9 并设置 PPA
# 安装 PPA 工具
sudo apt install -y software-properties-common# 添加 deadsnakes PPA(获取 Ubuntu 22.04 缺失的 Python 3.9 包)
sudo add-apt-repository ppa:deadsnakes/ppa# 更新并安装 Python 3.9 及其开发组件
sudo apt update
sudo apt install -y python3.9 python3.9-distutils python3.9-dev
2. 切换系统默认 Python 3 版本
使用 update-alternatives
将 python3
命令指向 Python 3.9。
# 注册 Python 3.10,优先级 100(较低)
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 100# 注册 Python 3.9,优先级 150(更高,Ryu 兼容版本)
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 150# 运行配置命令,选择 /usr/bin/python3.9
sudo update-alternatives --config python3# 验证切换结果
python3 --version # 预期输出:Python 3.9.x
四、Ryu 控制器稳定安装与启动
在 Python 3.9 环境中,Ryu 的安装和启动将变得稳定。
1. 清理旧环境并安装 Ryu
由于之前可能有失败的安装残留,我们先清理再安装。
# 卸载所有旧的 Ryu 及其依赖(eventlet, dnspython 等)
sudo pip3 uninstall ryu eventlet dnspython -y# 在 Python 3.9 环境下重新安装 Ryu
sudo pip3 install ryu
2. 解决 Ryu 依赖链中最后的“隐形”冲突
Ryu 4.34 即使在 3.9 上,也可能因为 pip
自动安装了过新的 eventlet
版本(缺少 ALREADY_HANDLED
)而失败。这是最后一个隐患。
# 强制降级 eventlet 到兼容 Ryu 4.34 的稳定版本(例如 0.30.2)
sudo pip3 uninstall eventlet -y
sudo pip3 install eventlet==0.30.2
3. 启动 Ryu 验证
在一个终端窗口中,启动 Ryu 控制器,加载 OpenFlow 1.3 的二层交换机应用。
ryu-manager ryu.app.simple_switch_13
预期结果: 控制器成功启动,显示 instantiating app simple_switch_13
等日志。
五、Mininet 与 Ryu 联调测试
Ryu 启动成功后,打开第二个终端窗口进行联调。
1. 启动 Mininet 拓扑
sudo mn --topo linear,2 --controller remote,ip=127.0.0.1,port=6653 --switch ovsk,protocols=OpenFlow13
2. 验证连通性
进入 Mininet CLI 后,执行 Ping 测试:
mininet> h1 ping h2
最终结果: 看到 0% packet loss
,代表环境配置成功。