[toc]
我们为SDN的课程实验配置了虚拟机。虚拟机安装了Arch Linux操作系统和Gnome桌面环境。初次使用时,你需要设置用户密码。按照开机后指引完成即可。
完成后,你会进入如下界面:
点击左上角的
即可进入菜单,从左至右依次是文件管理器、wireshark、终端和Firefox浏览器。点击
即可进入应用菜单。
中间的终端是实验中最常用的地方。我们鼓励你在终端内多尝试Linux的各个命令行操作。
虚拟机可以使用基本的功能;但为了更好地完成实验,你可能需要配置以下内容:
-
虚拟机共享剪切板 / 文件夹(推荐安装)。此项和你的虚拟机软件有关:
-
VirtualBox: VirtualBox的共享剪切板 / 文件夹功能已经配置好,无需额外安装。 安装文档
-
VMWare
sudo pacman -S open-vm-tools gtkmm3 sudo systemctl enable vmtoolsd.service vmware-vmblock-fuse.service -
KVM / Libvirt / Virt-manager / Spice
sudo pacman -S spice-vdagent sudo systemctl enable spice-vdagentd.service
安装完成后,重启虚拟机。
-
-
X11 Xorg显示服务器和Xterm。当然,你也可以完全使用命令行完成实验,本次实验也并不需要该功能;但建议可以安装X11服务器。之后实验中,使用Mininet的Xterm终端功能会使实验更加方便。你需要通过命令行安装:
sudo pacman -S xorg-server xorg-apps xterm
包括之后的所有安装任务,请你**仔细阅读命令行的输出,**并根据输出内容的指导进行安装。默认安装选项即可完成任务。
-
VScode开发环境。虚拟机已配置SSH服务器,可以通过VSCode远程连接进行开发;或者如果想在虚拟机本地进行开发,可以在虚拟机上安装VSCode:
yay -S visual-studio-code-bin
-
中文界面。我们鼓励你使用英文界面,但你也可以安装中文语言包(会有很多机翻):
-
设置默认显示语言:编辑
/var/lib/AccountService/users/sdn(需要sudo),设置以下内容:[User] Language=zh_CN.UTF-8
-
生成语言包:编辑
/etc/locale.gen,取消注释zh_CN.UTF-8一行:#zh_CN.GB18030 GB18030 #zh_CN.GBK GBK zh_CN.UTF-8 UTF-8 #zh_CN GB2312 #zh_HK.UTF-8 UTF-8
-
安装CJK字体:推荐选择思源黑体(Adobe发行Source Han Sans
adobe-source-han-sans-cn-fonts或 Google发行Noto Fontsnoto-fonts-cjk),也可以在以下注释的字体中选择:sudo pacman -S noto-fonts-cjk # adobe-source-han-sans-cn-fonts # adobe-source-han-serif-cn-fonts # wqy-microhei # wqy-microhei0kute # wqy-bitmapfont # wqy-zenhei # ttf-arphic-ukai # ttf-arphic-uming
-
-
我们鼓励你自行配置实验机器,加入你想要的个性化。如果你对Ubuntu等操作系统比较熟悉,但并不熟悉Arch Linux,你需要注意到两者的不同:
-
Arch Linux使用
pacman进行包管理。为了安装软件,你需要输入pacman -S PACKAGE_NAME(s)
而不是
apt install PACKAGE_NAME(s)。
-
软件包的名称也可能有所不同,你可以在Arch Linux软件包数据库中搜索,或使用命令
pacman -Ss KEYWORD来搜索。
我们选用Arch Linux的原因之一是,Arch Linux是文档最为全面、详细、易读的Linux发行版之一。你可以在ArchWiki上搜索到你可能遇到的很多问题的答案,也可以参与社区讨论;你也可以借助AI工具解决遇到的问题。如有遇到其他问题助教们也会尽量给出答复。
-
-
方式1(推荐):使用虚拟机镜像搭建。
-
虚拟机软件:可以选用Oracle VirtualBox或者VMWare Workstation Pro(Windows)/ VMWare Fusion(Mac)。两者都是免费的。
-
VirtualBox(推荐),可在官网自行下载: https://www.virtualbox.org/wiki/Downloads
-
VMWare Workstation Pro/Fusion。VMWare是闭源软件,仅可免费个人使用,下载前需要注册账号: https://support.broadcom.com/group/ecx/free-downloads。
-
-
本实验提供虚拟机镜像文件(
sdn-2026.ova),已配置实验所需的软件包。 -
环境搭建步骤如下:
-
安装对应虚拟机软件
-
导入镜像文件
sdn-2026.ova并运行。
-
-
方式2:从源代码 / 包管理安装。你需要有可以使用的Linux系统。
-
Debian / Ubuntu (适用于 Debian 13 Trixie / Ubuntu 22.04+):
# 安装mininet、wireshark、frr sudo apt-get install mininet wireshark frr # 安装 uv Python 项目管理工具 curl -LsSf https://astral.sh/uv/install.sh | sudo env UV_INSTALL_DIR="/usr/bin" sh
-
Fedora / RHEL
sudo dnf install mininet wireshark frr uv
-
Arch Linux (AUR,需要yay工具)
sudo pacman -S wireshark-qt openvswitch yay -S mininet # 配置Open vSwitch # https://wiki.archlinux.org/title/Open_vSwitch sudo systemctl enable --now ovs-vswitchd.service
Arch Linux的FRR需从源代码安装。首先安装libyang:
yay -S libyang3参照FRR官网文档进行从源代码构建安装,注意无需重新安装libyang。 安装文档
-
实验需要用到Mininet、Open vSwitch、WireShark等工具。
Mininet: 用来在单台计算机上创建一个包含多台网络设备的虚拟网络。Open vSwitch:Mininet中使用的虚拟交换机。WireShark: 抓包工具。
- 启动
mininet
# shell prompt
mn -h # 查看mininet命令中的各个选项
sudo mn -c # 不正确退出时清理mininet
sudo mn #创建默认拓扑,两个主机h1、h2连接到同一交换机s1- 常用命令
# mininet CLI 中输入
nodes # 查看网络节点
links # 查看网络连接的情况
net # 显示当前网络拓扑
dump # 显示当前网络拓扑的详细信息
xterm h1 # 给节点h1打开一个终端模拟器
sh [COMMAND] # 在mininet命令行中执行COMMAND命令
h1 ping -c3 h2 # 即h1 ping h2 3次
pingall # 即ping all
h1 ifconfig # 查看h1的网络端口及配置
h1 arp # 查看h1的arp表
link s1 h1 down/up # 断开/连接s1和h1的链路
exit # 退出mininet CLI-
命令行拓扑
sudo mn --mac --topo=tree,m,n
--mac 指定mac地址从1开始递增,而不是无序的mac,方便观察。
--topo 指定拓扑参数,可选用single和linear等参数。
-
自定义拓扑(方式1):使用
Mininet Python API创建自定义拓扑(你需要自己创建这个文件),并通过命令行运行:from mininet.topo import Topo class MyTopo( Topo ): "Simple topology example." def build( self ): "Create custom topo." # Add hosts and switches leftHost = self.addHost( 'h1' ) rightHost = self.addHost( 'h2' ) leftSwitch = self.addSwitch( 's3' ) rightSwitch = self.addSwitch( 's4' ) # Add links self.addLink( leftHost, leftSwitch ) self.addLink( leftSwitch, rightSwitch ) self.addLink( rightSwitch, rightHost ) topos = { 'mytopo': ( lambda: MyTopo() ) }
命令行运行:
sudo mn --custom 拓扑文件名.py --topo mytopo --controller=none
-
自定义拓扑(方式2):使用
Mininet Python API直接创建并运行网络# sudo python topo_recommend.py from mininet.topo import Topo from mininet.net import Mininet from mininet.cli import CLI from mininet.log import setLogLevel class S1H2(Topo): def build(self): s1 = self.addSwitch('s1') h1 = self.addHost('h1') h2 = self.addHost('h2') self.addLink(s1, h1) self.addLink(s1, h2) def run(): topo = S1H2() net = Mininet(topo) net.start() CLI(net) net.stop() if __name__ == '__main__': setLogLevel('info') # output, info, debug run()
这种方式写法较为复杂,但简化了运行命令:
sudo python 拓扑文件名.py
进一步学习可以参考Mininet官网:http://mininet.org/
- 查看交换机的基本信息
以默认拓扑启动mininet ,打开新终端,输入sudo ovs-vsctl show
- 生成树协议
sudo ovs-vsctl set bridge s1 stp_enable=true #开启STP,s1为设备名
sudo ovs-vsctl get bridge s1 stp_enable
sudo ovs-vsctl list bridge-
查看mac表
- 启动
mininet,注意禁用控制器,否则mac表可能学习不到内容
- 对每个交换机执行
sudo ovs-vsctl del-fail-mode xx,否则mac表将仍然学习不到东西
pingall令所有主机发送数据包,防止沉默主机现象
sudo ovs-appctl fdb/show xx查看mac表
- 启动
OVS的详细学习可参考官方网站http://www.openvswitch.org/
- 使用
Mininet的Python API搭建k=4的fat tree拓扑; - 使用
pingall查看各主机之间的连通情况; - 若主机之间未连通,分析原因并解决(使用
wireshark抓包分析) - 若主机连通,分析数据包的路径(提示:
ovs-appctl fdb/show查看MAC表) - 完成实验报告并提交到思源学堂
- 要求不能使用控制器






