一、准备
1. 物理环境要求
物理环境安装docker和openvswitch。
2. VS仿真镜像编译
- platform设置成vs
make configure PLATFORM=vs
- 编译生成docker-sonic-vs.gz
make target/docker-sonic-vs.gz
3. 测试拓扑
4. 拓扑脚本
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/5040b6b7-a918-4a2e-a0ac-ce4efde69320/start.sh
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/08caba2e-ca31-43e7-8766-477b26de4ddf/stop.sh
二、搭建过程
1. 生成拓扑
- 加载vs仿真镜像。把docker-sonic-vs.gz拷⻉到物理机,使用下面的docker命令加载docker镜像。
docker load < docker-sonic-vs.gz
- 把start.sh和stop.sh拷⻉到物理机,并加上可执行权限。
- 执行脚本start.sh进行环境搭建。脚本执行没有报错,并查看容器都已启动,说明拓扑搭建成功。
[root@192-168-152-241 vs-emulator]# ./start.sh
0e02060365912d01abc0a99bfc51c040046d1f03795ba0989243fec9385d52d9
53d5febdeb46f00d5e3826191eee4363a765daddb42660d67926ab5367f4d7d1
fc3fd7ba0d2f784ef7e046687d17682bba5916cf4e55c4f4fa5aa369e694d573
5def26989e0a1f3256215e64171e3ef9f176f05a917e9d04f00c32c6ab5d2839
Booting vses, please wait ~1 minute for vses to load
[root@192-168-152-241 vs-emulator]#
[root@192-168-152-241 vs-emulator]#
[root@192-168-152-241 vs-emulator]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5def26989e0a ubuntu:14.04 "/bin/bash" 35 seconds ago Up 32 seconds h2
fc3fd7ba0d2f ubuntu:14.04 "/bin/bash" 37 seconds ago Up 35 seconds h1
53d5febdeb46 docker-sonic-vs:latest "/bin/bash" 39 seconds ago Up 37 seconds vs2
0e0206036591 docker-sonic-vs:latest "/bin/bash" 41 seconds ago Up 39 seconds vs1
[root@192-168-152-241 vs-emulator]#
2. 配置交换机
(1) vs1上的配置
- 登录vs1。物理机上执行下面的命令,登录vs1。
[root@192-168-152-241 vs-emulator]# docker exec -it vs1 bash
- 使Ethernet0和Ethernet4的状态变为UP。
root@0e0206036591:/# ifconfig eth1 up
root@0e0206036591:/# ifconfig eth2 up
root@0e0206036591:/# config interface startup Ethernet0
root@0e0206036591:/# config interface startup Ethernet4
show interface status可以查看接口是否已UP。
备注:
vs的sonic 交换机中,主机接口和前面板接口之间的映射关系是:接口 eth1 绑定到 VS 软件交换机的端口 1,将 eth2 绑定到端口 2,以此类推。
- 创建VLAN 100和VLAN 101
root@0e0206036591:/# config vlan add 100
root@0e0206036591:/# config vlan add 101
root@0e0206036591:/# show vlan config
/bin/sh: 1: sudo: not found
Name VID Member Mode
------- ----- -------- ------
Vlan100 100
Vlan101 101
root@0e0206036591:/#
- Ethernet0和Ethernet4分别加入到VLAN 100和VLAN 101
root@0e0206036591:/# config vlan member add -u 100 Ethernet0
root@0e0206036591:/# config vlan member add -u 101 Ethernet4
root@0e0206036591:/# show vlan config
/bin/sh: 1: sudo: not found
Name VID Member Mode
------- ----- --------- --------
Vlan100 100 Ethernet0 untagged
Vlan101 101 Ethernet4 untagged
root@0e0206036591:/#
- VLAN接口配置IP地址
root@0e0206036591:/# config interface ip add Vlan100 192.168.1.1/24
root@0e0206036591:/# config interface ip add Vlan101 10.0.0.1/24
root@0e0206036591:/# show ip interface
/bin/sh: 1: sudo: not found
Interface Master IPv4 address/mask Admin/Oper BGP Neighbor Neighbor IP
----------- -------- ------------------- ------------ -------------- -------------
Vlan100 192.168.1.1/24 up/up N/A N/A
Vlan101 10.0.0.1/24 up/up N/A N/A
lo 127.0.0.1/8 up/up N/A N/A
- 配置静态路由
root@0e0206036591:/# vtysh
Hello, this is FRRouting (version 7.5.1-sonic).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
0e0206036591#
0e0206036591# configure terminal
0e0206036591(config)# ip route 192.168.2.0/24 10.0.0.2
0e0206036591(config)# exit
0e0206036591# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
F - PBR, f - OpenFabric,
> - selected route, * - FIB route, q - queued, r - rejected, b - backup
C>* 10.0.0.0/24 is directly connected, Vlan101, 00:03:02
C>* 192.168.1.0/24 is directly connected, Vlan100, 00:03:53
S>* 192.168.2.0/24 [1/0] via 10.0.0.2, Vlan101, weight 1, 00:00:08
0e0206036591#
(2)vs2的配置
vs2的配置与vs2类似,具体命令如下:
[root@192-168-152-241 vs-emulator]# docker exec -it vs2 bash
root@53d5febdeb46:/# ifconfig eth1 up
root@53d5febdeb46:/# ifconfig eth2 up
root@53d5febdeb46:/# config interface startup Ethernet0
root@53d5febdeb46:/# config interface startup Ethernet4
root@53d5febdeb46:/# config vlan add 100
root@53d5febdeb46:/# config vlan add 101
root@53d5febdeb46:/# config vlan member add -u 100 Ethernet0
root@53d5febdeb46:/# config vlan member add -u 101 Ethernet4
root@53d5febdeb46:/# config interface ip add Vlan100 192.168.2.1/24
root@53d5febdeb46:/# config interface ip add Vlan101 10.0.0.2/24
root@53d5febdeb46:/# vtysh
Hello, this is FRRouting (version 7.5.1-sonic).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
53d5febdeb46# conf terminal
53d5febdeb46(config)# ip route 192.168.1.0/24 10.0.0.1
3. 验证
h1 ping h2,可以ping通说明交换机配置正确。
[root@192-168-152-241 vs-emulator]# docker exec -it h1 bash
root@fc3fd7ba0d2f:/# ping 192.168.2.2
PING 192.168.2.2 (192.168.2.2) 56(84) bytes of data.
64 bytes from 192.168.2.2: icmp_seq=1 ttl=62 time=1.17 ms
64 bytes from 192.168.2.2: icmp_seq=2 ttl=62 time=0.202 ms
64 bytes from 192.168.2.2: icmp_seq=3 ttl=62 time=0.175 ms
64 bytes from 192.168.2.2: icmp_seq=4 ttl=62 time=0.163 ms
64 bytes from 192.168.2.2: icmp_seq=5 ttl=62 time=0.167 ms
64 bytes from 192.168.2.2: icmp_seq=6 ttl=62 time=0.184 ms
4. 释放环境
执行脚本stop.sh释放仿真环境,脚本执行完成会删除容器和ovs网桥。
[root@192-168-152-241 vs-emulator]# ./stop.sh
vs1
vs2
h1
h2
三、定制拓扑
如果定制新的仿真拓扑,需要修改start.sh和stop.sh脚本。
1. 脚本说明
(1)start.sh
#!/bin/bash
sudo docker run --net=none --privileged --entrypoint /bin/bash --name vs1 -it -d docker-sonic-vs:latest
sudo docker run --net=none --privileged --entrypoint /bin/bash --name vs2 -it -d docker-sonic-vs:latest
sudo docker run --net=none --privileged --entrypoint /bin/bash --name h1 -it -d ubuntu:14.04
sudo docker run --net=none --privileged --entrypoint /bin/bash --name h2 -it -d ubuntu:14.04
sudo ovs-vsctl add-br vs1_vs2_0
sudo ovs-docker add-port vs1_vs2_0 eth0 vs1
sudo ovs-docker add-port vs1_vs2_0 eth0 vs2
sudo ovs-vsctl add-br vs1_vs2
sudo ovs-docker add-port vs1_vs2 eth2 vs1
sudo ovs-docker add-port vs1_vs2 eth2 vs2
sudo ovs-vsctl add-br h1_vs1
sudo ovs-docker add-port h1_vs1 eth1 vs1
sudo ovs-docker add-port h1_vs1 eth1 h1
sudo ovs-vsctl add-br h2_vs2
sudo ovs-docker add-port h2_vs2 eth1 vs2
sudo ovs-docker add-port h2_vs2 eth1 h2
sudo docker exec -d h1 sysctl net.ipv6.conf.eth0.disable_ipv6=1
sudo docker exec -d h1 sysctl net.ipv6.conf.eth1.disable_ipv6=1
sudo docker exec -d h2 sysctl net.ipv6.conf.eth0.disable_ipv6=1
sudo docker exec -d h2 sysctl net.ipv6.conf.eth1.disable_ipv6=1
sudo docker exec -d h1 ifconfig eth1 192.168.1.2/24 mtu 1400
sudo docker exec -d h1 ip route replace default via 192.168.1.1
sudo docker exec -d h2 ifconfig eth1 192.168.2.2/24 mtu 1400
sudo docker exec -d h2 ip route replace default via 192.168.2.1
sudo docker exec -d vs1 sysctl net.ipv6.conf.all.disable_ipv6=0
sudo docker exec -d vs1 sysctl net.ipv6.conf.default.disable_ipv6=0
sudo docker exec -d vs1 sysctl net.ipv6.conf.lo.disable_ipv6=0
sudo docker exec -d vs2 sysctl net.ipv6.conf.all.disable_ipv6=0
sudo docker exec -d vs2 sysctl net.ipv6.conf.default.disable_ipv6=0
sudo docker exec -d vs2 sysctl net.ipv6.conf.lo.disable_ipv6=0
echo "Booting vses, please wait ~1 minute for vses to load"
sudo docker exec -d vs1 supervisord
sudo docker exec -d vs2 supervisord
启动脚本包括以下的部分:
- 运行交换机容器和客户端容器,运行容器必须已加载相关容器的docker镜像。
- 交换机和客户端、交换机之间互连。先创建ovs网桥,然后把互连的交换机或者客户端的端口加入ovs网桥,完成互连。注意,在交换机上要创建eth0,交换机使用这个端口作为管理口,如果不存在这个端口,交换机的SONiC的启动会失败。
- 配置客户端。例子中是关闭客户端IPv6功能和配置客户端的IPv4地址。根据需要可以配置linux上其他的配置。
- 配置交换机。例子中是开启交换机上的IPv6功能。根据需要可以配置linux上其他的配置。
- 每个交换机容器执行supervisord命令。、
(2) stop.sh
sudo docker rm -f vs1
sudo docker rm -f vs2
sudo docker rm -f h1
sudo docker rm -f h2
sudo ovs-vsctl del-br vs1_vs2
sudo ovs-vsctl del-br h1_vs1
sudo ovs-vsctl del-br h2_vs2
sudo ovs-vsctl del-br vs1_vs2_0
关闭脚本包括以下的部分:
- 删除容器
- 删除ovs网桥
2. 定制流程
- 确定拓扑,主要是:包含哪些客户端和交换机,客户端如何与交换机互连,交换机与交换机之间如何互连,用了哪些互连端口。
- 根据拓扑编写start.sh和stop.sh脚本。
- 根据拓扑确定每个交换机上的配置,登录交换机完成配置。
官方参考文档:
https://github.com/sonic-net/SONiC/wiki/SONiC-P4-Software-Switch
尝试搭建的过程中出现的问题的说明
说明:
如果只是使用 docker-sonic-vs.gz 生成的docker镜像 来启动 vs-sonic 的话,这样进入sonic容器后,会发现 config,show命令都无法使用,因为连接不到redis db报错。
需要执行 : sudo docker exec -d vs1 supervisord
新增搭建脚本环境:
#!/bin/bash
sudo docker run --net=none --privileged --entrypoint /bin/bash --name vs1 -it -d docker-sonic-vs:latest
sudo docker run --net=none --privileged --entrypoint /bin/bash --name vs2 -it -d docker-sonic-vs:latest
sudo docker run --net=none --privileged --entrypoint /bin/bash --name vs3 -it -d docker-sonic-vs:latest
sudo ovs-vsctl add-br vs1_vs2_0
sudo ovs-docker add-port vs1_vs2_0 eth0 vs1
sudo ovs-docker add-port vs1_vs2_0 eth0 vs2
sudo ovs-vsctl add-br vs1_vs2
sudo ovs-docker add-port vs1_vs2 eth1 vs1
sudo ovs-docker add-port vs1_vs2 eth1 vs2
sudo ovs-vsctl add-br vs2_vs3_0
sudo ovs-docker add-port vs2_vs3_0 eth0 vs2
sudo ovs-docker add-port vs2_vs3_0 eth0 vs3
sudo ovs-vsctl add-br vs2_vs3
sudo ovs-docker add-port vs2_vs3 eth2 vs2
sudo ovs-docker add-port vs2_vs3 eth2 vs3
sudo docker exec -d vs1 sysctl net.ipv6.conf.all.disable_ipv6=0
sudo docker exec -d vs1 sysctl net.ipv6.conf.default.disable_ipv6=0
sudo docker exec -d vs1 sysctl net.ipv6.conf.lo.disable_ipv6=0
sudo docker exec -d vs2 sysctl net.ipv6.conf.all.disable_ipv6=0
sudo docker exec -d vs2 sysctl net.ipv6.conf.default.disable_ipv6=0
sudo docker exec -d vs2 sysctl net.ipv6.conf.lo.disable_ipv6=0
sudo docker exec -d vs3 sysctl net.ipv6.conf.all.disable_ipv6=0
sudo docker exec -d vs3 sysctl net.ipv6.conf.default.disable_ipv6=0
sudo docker exec -d vs3 sysctl net.ipv6.conf.lo.disable_ipv6=0
echo "Booting vses, please wait ~3 minute for vses to load"
sudo docker exec -d vs1 supervisord
sudo docker exec -d vs2 supervisord
sudo docker exec -d vs3 supervisord