尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Ubuntu 16.04 源码编译安装 Mininet 与 Open vSwitch 实战指南
简介这份资源面向在 Ubuntu 16.04 环境下学习软件定义网络SDN与网络功能虚拟化NFV的开发者、学生及实验人员聚焦于通过源码方式安装 Mininet 这一轻量级网络仿真平台帮助读者在本地快速搭建可自定义的网络拓扑用于 OpenFlow 与 SDN 技术的开发、测试和演示。资源包内共 1 个 PDF 文件大小约 94KB内容围绕源码获取、完整安装脚本执行、安装结果验证以及简单数据中心树形拓扑的构建展开涵盖 Mininet 支持真实程序运行、兼容 OpenFlow、提供 Python API 等核心特性说明并给出可调整 depth 与 fanout 参数的拓扑示例便于读者理解从安装到初步实验的完整链路。目前已有 2473 人学习下载适合希望掌握源码安装流程、快速上手 SDN 实验环境搭建的入门与进阶读者参考。1. 为什么在 Ubuntu 16.04 上源码装 Mininet 是绕不开的一课如果你正在做 SDN 实验、OpenFlow 协议验证或者要给某个自定义控制器搭一套可复现的拓扑环境Mininet 几乎是默认起点。多数教程让你apt install mininet就完事但在 Ubuntu 16.04 这个老而稳的发行版上apt 源里的 Mininet 版本往往停在 2.2.x既缺--switch的新参数也不支持某些 Open vSwitch 2.5 的特性。更现实的问题是很多实验室的仿真机、工控测试机、教学镜像就锁死在 16.04你没法换系统只能从源码编译。源码安装 Mininet 的价值不在于「显得硬核」而在于你能精确控制 Open vSwitch 版本、Python 绑定、内核模块加载顺序出问题时能定位到具体哪一行编译日志。这篇笔记面向的是需要在 16.04 上把 Mininet 跑通、并且后续要接 Ryu/ONOS 或自定义拓扑的从业者新手可以照着命令走熟手可以看参数边界和踩坑记录。2. 装之前先把依赖和版本关系理清楚Mininet 到底依赖什么2.1 Mininet 的组成与源码安装的边界Mininet 本身不是一个单体程序它由几层拼起来最上层是 Python 写的mn命令行和mininet包中间是 OpenFlow 参考交换机ofdatapath、ofprotocol老版本才用底层是 Open vSwitch 或内核自带的openvswitch模块再往下是 Linux 的 network namespace 和 veth pair。源码安装 Mininet 时install.sh脚本默认会去拉 Open vSwitch 源码一起编译这一步是最耗时的也是最容易翻车的。你需要先明确你是要 Mininet 自带的那套 OVS还是用系统已有的 OVS前者版本可控但编译久后者快但可能和 Mininet 的 Python 绑定对不上。在 Ubuntu 16.04 上系统自带的 OVS 是 2.5.0Mininet 2.3.0d 的源码和它是能配合的。但如果你要测 OpenFlow 1.3 的某些实验特性可能得升到 OVS 2.8那就必须源码编译 OVS并且注意内核模块openvswitch.ko的版本要和用户态ovs-vswitchd一致否则会出现「ovs-vsctl 能连上但端口起不来」的玄学问题。2.2 依赖清单与 apt 源准备Ubuntu 16.04 默认的 apt 源里编译 Mininet 需要的包基本都有但有几个包名和 18.04 之后不一样比如python-pip而不是python3-piplibssl-dev版本也偏老。先把依赖一次性装齐避免编译到一半报缺头文件。# 更新索引注意 16.04 的源可能已归档若失败需换 old-releases sudo apt-get update # 核心编译工具与库 sudo apt-get install -y build-essential git python python-pip python-dev \ libssl-dev libffi-dev libxml2-dev libxslt1-dev zlib1g-dev \ help2man python-setuptools # Open vSwitch 编译额外依赖若走自带 OVS 路径 sudo apt-get install -y autoconf automake libtool pkg-config \ libssl-dev openssl # 确认 Python 版本Mininet 2.3 默认走 Python 2.7 python --version这里有几个参数要说明python-dev提供 Python.hMininet 的 Python 扩展编译时必须libffi-dev和libssl-dev是 OVS 的 SSL 支持需要help2man用于生成 man 手册不装的话make install会在最后一步报错但前面已经编译完属于「吓人但不致命」的坑。python-setuptools是为了pip install本地包时能识别 setup.py。注意16.04 的官方源在部分网络环境下已经不可达如果apt-get update报 404需要把/etc/apt/sources.list里的archive.ubuntu.com换成old-releases.ubuntu.com这是 16.04 生命周期的正常现象不是你的网络问题。2.3 获取源码与目录规划我一般会把源码放在/opt/src下避免和 home 目录混在一起也方便多版本共存。Mininet 的源码在 GitHub 上但不要直接 clone mastermaster 分支可能已经适配 Python 3在 16.04 上跑会缺一堆 python3 依赖。稳妥做法是切到 2.3.0d 这个 tag它是 16.04 时代最稳的版本。sudo mkdir -p /opt/src sudo chown $USER:$USER /opt/src cd /opt/src # 克隆 Mininet 源码指定 2.3.0d 标签 git clone https://github.com/mininet/mininet.git cd mininet git checkout 2.3.0d # 查看 install.sh 的帮助确认可用参数 ./install.sh -hinstall.sh的-h输出里-a是全部安装Mininet OVS 依赖-n只装 Mininet 不装 OVS-v指定 OVS 版本。如果你系统里已经有能用的 OVS用-n能省 20 分钟编译时间。但要注意-n模式下 Mininet 会去连系统 OVS如果系统 OVS 的ovs-vsctl路径不在默认 PATH 里mn启动时会报Cannot find ovs-vsctl这时候要么加软链要么在mn命令里用--switch指定。3. 源码编译与安装从 install.sh 到手动补刀3.1 用 install.sh 走标准流程最省事的路径是直接跑install.sh -a它会自动处理依赖、编译 OVS、编译 Mininet、安装 Python 包。但这一步在 16.04 上经常卡在 OVS 编译因为 OVS 2.5 的 configure 脚本对 gcc 版本有要求16.04 默认 gcc 5.4 是能过的但如果之前装过其他版本 gcc 并改了 alternatives就会报unrecognized command line option。# 在 mininet 源码目录下执行-a 表示全量安装 cd /opt/src/mininet sudo ./install.sh -a # 如果只想装 Mininet 本体跳过 OVS 编译 # sudo ./install.sh -n执行过程中你会看到它先apt-get install一堆包然后git cloneOVS 到openvswitch目录接着./boot.sh ./configure make。这里的关键参数在install.sh内部写死了比如 OVS 的 configure 默认不带--with-linux所以它只编译用户态内核模块靠系统自带的。如果你需要自定义 OVS 编译参数就不能用-a得手动来。编译完成后脚本会跑一个mn --test pingall做自检。如果这一步输出*** Results: 0% dropped说明基本通了。如果卡住不动多半是 OVS 内核模块没加载sudo modprobe openvswitch手动加载一下再试。3.2 手动编译 Open vSwitch 的完整命令当install.sh -a失败或者你需要特定 OVS 版本时手动编译是必须掌握的。下面以 OVS 2.5.0 为例这是和 16.04 内核 4.4 配合最稳的版本。cd /opt/src # 下载 OVS 源码包这里用 wget 示例实际可用 git clone wget http://openvswitch.org/releases/openvswitch-2.5.0.tar.gz tar -xzf openvswitch-2.5.0.tar.gz cd openvswitch-2.5.0 # 生成 configure 脚本boot.sh 内部调用 autoreconf ./boot.sh # 配置指定内核源码路径开启 SSL ./configure --with-linux/lib/modules/$(uname -r)/build \ --enable-ssl \ --prefix/usr # 编译-j 后接 CPU 核心数加快速度 make -j$(nproc) # 安装用户态工具和库 sudo make install # 编译并安装内核模块 sudo make modules_install # 加载内核模块 sudo modprobe openvswitch # 验证模块加载 lsmod | grep openvswitch参数说明--with-linux指向当前内核的 build 目录不指定的话只编译用户态ovs-vswitchd启动时会找不到 datapath--enable-ssl让 OVS 支持 SSL 连接控制器做远程 Ryu 实验时需要--prefix/usr把工具装到/usr/bin和系统路径一致避免 PATH 问题。make modules_install会把openvswitch.ko拷到/lib/modules/$(uname -r)/extra/然后modprobe才能找到。如果modprobe报Module not found先跑sudo depmod -a刷新模块依赖。注意如果你之前用 apt 装过 openvswitch先sudo apt-get remove --purge openvswitch-common openvswitch-switch清掉否则/usr/bin/ovs-vsctl会被旧版本覆盖出现「编译成功但版本号没变」的假象。3.3 安装 Mininet 的 Python 包与验证OVS 就绪后Mininet 本体的安装反而简单因为它就是一个 Python 包加几个脚本。cd /opt/src/mininet # 安装 Python 包-e 表示可编辑模式方便改源码 sudo pip install -e . # 或者用 setup.py 安装 # sudo python setup.py install # 验证 mn 命令可用 mn --version # 跑一个最小拓扑测试 sudo mn --test pingallpip install -e .会在 site-packages 里建一个指向源码目录的链接之后你改mininet/下的 Python 文件不用重新安装就生效调试自定义拓扑时非常方便。mn --version应该输出2.3.0d。mn --test pingall会创建一个默认的 2 主机 1 交换机拓扑跑 pingall 测试输出0% dropped即成功。如果mn命令找不到检查/usr/local/bin是否在 PATH 里pip 默认装到那里。如果pingall失败但mn能启动多半是 OVS 的 datapath 没起来sudo ovs-vsctl show看有没有is_connected: true。4. 避坑与排查源码装 Mininet 最常见的 5 个翻车现场4.1 坑一OVS 内核模块版本不匹配端口起不来现象mn能启动ovs-vsctl show也正常但pingall全丢包ovs-dpctl show看不到 datapath。原因用户态ovs-vswitchd是源码编译的 2.5.0但内核里加载的openvswitch.ko是系统自带的旧版本两者 ABI 不兼容datapath 创建失败。解决先sudo rmmod openvswitch卸载旧模块再sudo modprobe openvswitch加载新编译的。用modinfo openvswitch | grep version确认版本号和你编译的一致。如果rmmod报模块正在使用先sudo ovs-vsctl del-br删掉所有网桥再sudo systemctl stop openvswitch停服务。4.2 坑二Python 包冲突导致 mn 导入报错现象mn启动时报ImportError: cannot import name mininet或No module named mininet.log。原因系统里同时存在 apt 装的python-mininet和 pip 装的源码版Python 的sys.path优先找到了 apt 的旧包但旧包缺新模块。解决sudo apt-get remove python-mininet卸掉 apt 版然后pip show mininet确认 pip 版路径再python -c import mininet; print(mininet.__file__)看实际加载的是哪个。如果还不对检查PYTHONPATH环境变量有没有指向旧目录。4.3 坑三install.sh 在 16.04 上卡在 apt-get 更新现象跑install.sh -a时长时间停在apt-get update最后报Failed to fetch。原因16.04 的官方源已归档archive.ubuntu.com不再提供 xenial 的索引。解决编辑/etc/apt/sources.list把所有archive.ubuntu.com和security.ubuntu.com替换为old-releases.ubuntu.com然后sudo apt-get update。如果公司内网有镜像源优先用内网源速度更快。4.4 坑四mn 启动后 CtrlC 退出不干净残留命名空间现象mn退出后ip netns list还能看到mn-xxx命名空间再次启动mn报Resource temporarily unavailable。原因Mininet 异常退出时没清理 namespace 和 veth这些资源被内核保留。解决sudo mn -c是官方清理命令它会删掉所有mn开头的 namespace 和 OVS 网桥。如果mn -c也失败手动sudo ip netns list | awk {print $1} | xargs -I {} sudo ip netns delete {}再sudo ovs-vsctl del-br删掉残留网桥。4.5 坑五自定义拓扑里 link 参数写错导致带宽测试失真现象用TCLink做带宽限制iperf测出来还是千兆限制没生效。原因TCLink依赖tc命令和内核的netem模块16.04 默认没加载sch_netem或者TCLink的bw参数单位写成了Mbps但实际要写10表示 10Mbps。解决sudo modprobe sch_netem加载模块然后在拓扑里写TCLink(bw10, delay5ms)bw单位是 Mbps不写单位。验证时用sudo tc qdisc show dev veth看规则有没有下发。5. 进阶把源码版 Mininet 接进自定义控制器与自动化验证源码装 Mininet 的真正价值在于你能改它的 Python 源码来适配自己的实验框架。比如你要批量跑 100 组拓扑每组换不同的链路延迟用mn命令行就不如直接调mininet.net.Mininet类。下面是一个最小可复现的 Python 脚本它创建一个线性拓扑接远程控制器跑 pingall 后自动清理。#!/usr/bin/env python # coding: utf-8 from mininet.net import Mininet from mininet.node import RemoteController, OVSKernelSwitch from mininet.topo import LinearTopo from mininet.log import setLogLevel def run_exp(): # 设置日志级别info 能看到链路建立过程 setLogLevel(info) # 线性拓扑4 个交换机每台挂 1 个主机 topo LinearTopo(k4) # 指定远程控制器IP 和端口按实际改 net Mininet(topotopo, controllerRemoteController, switchOVSKernelSwitch, autoSetMacsTrue) # 启动控制器连接若控制器没起会卡住加 timeout 保护 net.start() # 跑 pingall输出丢包率 loss net.pingAll() print(Packet loss: {}%.format(loss)) # 关键无论成败都清理避免残留 namespace net.stop() if __name__ __main__: run_exp()这段代码里RemoteController默认连127.0.0.1:6653如果你的 Ryu 跑在 6633要显式写controllerRemoteController(c0, ip127.0.0.1, port6633)。autoSetMacsTrue让 Mininet 自动分配 MAC避免手动指定时冲突。net.pingAll()返回的是丢包百分比0 表示全通。net.stop()必须放在finally里才保险我这里为了简洁没写 try/finally实际生产脚本要加。验证方法上我习惯用两层检查第一层是mn --test pingall确认基础功能第二层是ovs-vsctl show看网桥和端口状态第三层是ovs-ofctl dump-flows看流表有没有下发。如果流表为空但 ping 通说明走的是 normal 模式控制器没接管如果流表有但 ping 不通检查ovs-ofctl dump-ports看端口有没有丢包计数增长。最后说一个我自己的习惯每次源码装完 Mininet先mn -c清一遍再跑mn --test pingall最后sudo mn --topo linear,4 --controller remote手动进去敲两条命令。这套动作花不到两分钟但能提前暴露 90% 的环境问题。源码安装的后悔药不多唯一有效的就是「装完立刻验证别等实验跑到一半才发现 OVS 没起来」。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

财务共享服务中心大语言模型应用:从票据识别到智能审核的落地实践

财务共享服务中心大语言模型应用:从票据识别到智能审核的落地实践

简介:这份PDF文献聚焦大语言模型在财务共享服务中心的落地应用,面向财务共享从业者、会计信息化研究者及企业数字化转型负责人。内容从大语言模型的概念与特征切入,比较ChatGPT、文心一言、通义千问等国内外五大模型在交互、问答能力与实际用…

📅 2026/10/11 9:51:18
OpenClaw 本地智能体实战:用 TaoToken 统一 Key 打通主动执行链路

OpenClaw 本地智能体实战:用 TaoToken 统一 Key 打通主动执行链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/11 9:51:18
从代码评审火气说起:打造一个能说人话的工程规范检查工具

从代码评审火气说起:打造一个能说人话的工程规范检查工具

1. 从一次充满火药味的评审说起:为什么规则要交给机器1.1 那些年我们吵过的"风格架"我至今记得一次让我很窝火的评审。一位同事在别人的代码变更下面贴了七条评论,其中五条是在说命名、缩进和换行,两条吐槽"这个函数写得有点长…

📅 2026/10/11 9:46:18
MORE NEWS

更多资讯

📰

卡尺标定法径向扫描拟合圆V2.0:精密测量新思路

简介:这是一份基于OpenCV 4.3的C圆形拟合实现,面向机器视觉开发者与图像处理进阶学习者,解决图像中圆形目标定位不准、边缘受噪声干扰时的拟合鲁棒性问题。其核心思路模仿Halcon的圆拟合能力,使用卡尺标定法沿径向扫描图像梯度&am…

📰

C++构建缓存实战:从CCache原理到分布式缓存落地

1. 为什么你的C项目需要构建缓存先讲一个真实的场景:某团队维护一个中等规模的C服务端项目,代码量在百万行级别。刚开始大家没在意编译时间,直到一次全量构建跑了40多分钟,几乎所有开发机都在高温运行,一次简单的代码提…

📰

B端系统自动化MCP工具开发指南:用TaoToken统一Key打通Playwright与Node.js

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Win10 系统安装 Claude Code 并接入 DeepSeek 教程:用 cc-switch 把 Base URL 改到 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

nrf52 mesh模型更换实战:从main.c到头文件的TaoToken配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

论文写完别着急提交,我的自查小思路

每次写完论文、课程作业,我以前都是匆匆通读一遍就提交,结果经常因为一些细节问题被打回来。 后来我慢慢养成了自查习惯:先看研究问题是否前后一致,再看章节安排、论点和材料是否匹配,最后再检查格式、引用和语言表达。…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬