Sonic+p4(1)
知识:
Docker容器(打包环境加应用)
静态镜像运行container
docker run(start)形成拓扑
目的:switch1获取switch2的网络统计数据
start.sh启动拓扑,配置Ip地址,Pin通,每台交换机收集本机信息
test 用sonic telementary取得对端交换机信息,并写入数据库
stop
load image
pull ubuntu(系统)
sonic.p4(镜像)
docke.file
需求支持,在原有基础上新增内容
sudo docker ps 正在运行的...
sudo docker run 运行 -> 静态文件变成操作系统
add bridge 加端口
add point
构造拓扑配置命名为switch1
ethenet0 统计信息 arp广播
reads数据库(交换机收集的信息存到数据库,否则其他交换机无法配置)
test.ping 首先联通 -c5 ping 包发5个
moliterlization -> grp(收集数据)
conters数据库收集1,0口,1交换机,2交换机
sudo ./start sh.实验 目的ip
交换机收集数据->流量转发,数据收集->为了网络配置,更改方案
实验
我们有以下拓扑:主机1(Ubuntu 14:04,192.168.1.2/24)<-->交换机1(Sonic)<-->交换机2(Sonic)<-->主机2(Ubuntu 14:04,192.168.2.2/24)
1)我们执行命令:./install_requirement.sh 通过这种方式,我们安装了Docker、Open-VSSwitch和Bridge-Utils。
2)我们执行命令:./load_image.sh 从Sonic-P4中加载图像并构建ESA和监控客户端
3)我们执行命令:./start.sh 建立和准备环境。一旦执行,我们应该运行5个容器。我们可以通过运行ps docker命令来检查它。
4)我们等待~ 3分钟,以便正确配置一切...我们执行命令:./test.sh 这样,主机1将ping到主机2,反之亦然,我们将测量GNMI Client的遥测。
5)我们最终执行了命令:./stop.sh 这将删除使用Docker和OVS(Open Virtual Switch)创建的容器和桥。我们还删除了我们创建的Docker“管理”网络。
持续集成服务Travis
Dockerfile_golang1
Dokerfile_sonic
install_requirements.sh
load_image.sh
start.sh (建立拓扑)
#!/bin/bash sudo docker run --net=none --privileged --entrypoint /bin/bash --name switch1 -it -d -v $PWD/switch1:/sonic docker-sonic-p4:latest
sudo docker run --net=none --privileged --entrypoint /bin/bash --name switch2 -it -d -v $PWD/switch2:/sonic docker-sonic-p4:latest
sudo docker run --net=none --privileged --entrypoint /bin/bash --name host1 -it -d ubuntu:14.04
sudo docker run --net=none --privileged --entrypoint /bin/bash --name host2 -it -d ubuntu:14.04 sudo ovs-vsctl add-br switch1_switch2
sudo ovs-docker add-port switch1_switch2 sw_port0 switch1
sudo ovs-docker add-port switch1_switch2 sw_port0 switch2 sudo ovs-vsctl add-br host1_switch1
sudo ovs-docker add-port host1_switch1 sw_port1 switch1
sudo ovs-docker add-port host1_switch1 eth1 host1 sudo ovs-vsctl add-br host2_switch2
sudo ovs-docker add-port host2_switch2 sw_port1 switch2
sudo ovs-docker add-port host2_switch2 eth1 host2 sudo docker exec -d host1 sysctl net.ipv6.conf.eth0.disable_ipv6=1
sudo docker exec -d host1 sysctl net.ipv6.conf.eth1.disable_ipv6=1
sudo docker exec -d host2 sysctl net.ipv6.conf.eth0.disable_ipv6=1
sudo docker exec -d host2 sysctl net.ipv6.conf.eth1.disable_ipv6=1 sudo docker exec -d host1 ifconfig eth1 192.168.1.2/24 mtu 1400
sudo docker exec -d host1 ip route replace default via 192.168.1.1
sudo docker exec -d host2 ifconfig eth1 192.168.2.2/24 mtu 1400
sudo docker exec -d host2 ip route replace default via 192.168.2.1 sudo docker exec -d switch1 ip netns add sw_net
sudo docker exec -d switch1 ip link set dev sw_port0 netns sw_net
sudo docker exec -d switch1 ip netns exec sw_net sysctl net.ipv6.conf.sw_port0.disable_ipv6=1
sudo docker exec -d switch1 ip netns exec sw_net ip link set sw_port0 up
sudo docker exec -d switch1 ip link set dev sw_port1 netns sw_net
sudo docker exec -d switch1 ip netns exec sw_net sysctl net.ipv6.conf.sw_port1.disable_ipv6=1
sudo docker exec -d switch1 ip netns exec sw_net ip link set sw_port1 up sudo docker exec -d switch2 ip netns add sw_net
sudo docker exec -d switch2 ip link set dev sw_port0 netns sw_net
sudo docker exec -d switch2 ip netns exec sw_net sysctl net.ipv6.conf.sw_port0.disable_ipv6=1
sudo docker exec -d switch2 ip netns exec sw_net ip link set sw_port0 up
sudo docker exec -d switch2 ip link set dev sw_port1 netns sw_net
sudo docker exec -d switch2 ip netns exec sw_net sysctl net.ipv6.conf.sw_port1.disable_ipv6=1
sudo docker exec -d switch2 ip netns exec sw_net ip link set sw_port1 up ######################################################################################################### #Bridge de gestion de contenedores
sudo docker network create \
--driver bridge \
--subnet=192.18.0.0/24 \
--gateway=192.18.0.1 \
--opt "com.docker.network.bridge.name"="gestion" \
gestion #Creacion de contenedor con gnmi_get
sudo docker run --privileged --entrypoint /bin/sh --name gnmicli -it -d gnmi_client sudo ./iftobridge add-link mgmt1 switch1 gestion --sip="192.18.0.11/24"
sudo ./iftobridge add-link mgmt1 switch2 gestion --sip="192.18.0.12/24"
sudo ./iftobridge add-link mgmt1 gnmicli gestion --sip="192.18.0.10/24" #Actualizacion de redisDB
sudo docker exec -d switch1 sh /sonic/scripts/update_redisDB.sh &
sudo docker exec -d switch2 sh /sonic/scripts/update_redisDB.sh & #Activamos la telemetría en los switches:
sudo docker exec -d switch1 ./sonic/telemetry --port 8080 --insecure --logtostderr --allow_no_client_auth &
sudo docker exec -d switch2 ./sonic/telemetry --port 8080 --insecure --logtostderr --allow_no_client_auth & ######################################################################################################### echo "Booting switches, please wait ~3 minutes for switches to load"
sudo docker exec -d switch1 sh /sonic/scripts/startup.sh
sudo docker exec -d switch2 sh /sonic/scripts/startup.sh sleep 180 docker ps
stop.sh
#!/bin/bash sudo docker rm -f switch1
sudo docker rm -f switch2
sudo docker rm -f host1
sudo docker rm -f host2
sudo docker rm -f gnmicli
sudo ovs-vsctl del-br switch1_switch2
sudo ovs-vsctl del-br host1_switch1
sudo ovs-vsctl del-br host2_switch2 sudo docker network prune -f
test.sh
#!/bin/bash #Ping desde host1 a switch1
sudo docker exec -it host1 ping 192.168.1.1 -c5 #Ping desde switch1 a host1
sudo docker exec -it switch1 ping 192.168.1.2 -c5 #Ping desde host1 a host2
sudo docker exec -it host1 ping 192.168.2.2 -c5 #Ping desde host2 a switch2
sudo docker exec -it host2 ping 192.168.2.1 -c5 #Ping desde switch2 a host2
sudo docker exec -it switch2 ping 192.168.2.2 -c5 #Ping desde host2 a host1
sudo docker exec -it host2 ping 192.168.1.2 -c5 sleep 10 #Monitorización switch1
sudo echo "Paquetes recibidos por Ethernet 1 en switch1"
sudo docker exec -it gnmicli ./bin/gnmi_get -xpath_target COUNTERS_DB -xpath interface:Ethernet1/in-pkts -target_addr 192.18.0.11:8080 -target_name switch1 -insecure -logtostderr
sudo echo "Paquetes recibidos por Ethernet 0 en switch1"
sudo docker exec -it gnmicli ./bin/gnmi_get -xpath_target COUNTERS_DB -xpath interface:Ethernet0/in-pkts -target_addr 192.18.0.11:8080 -target_name switch1 -insecure -logtostderr #Monitorización switch2
sudo echo "Paquetes recibidos por Ethernet 1 en switch2"
sudo docker exec -it gnmicli ./bin/gnmi_get -xpath_target COUNTERS_DB -xpath interface:Ethernet1/in-pkts -target_addr 192.18.0.12:8080 -target_name switch2 -insecure -logtostderr
sudo echo "Paquetes recibidos por Ethernet 0 en switch2"
sudo docker exec -it gnmicli ./bin/gnmi_get -xpath_target COUNTERS_DB -xpath interface:Ethernet0/in-pkts -target_addr 192.18.0.12:8080 -target_name switch2 -insecure -logtostderr
iftobridge
#!/bin/bash
# Copyright (C) 2014 Nicira, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License. # Check for programs we'll need.
search_path () {
save_IFS=$IFS
IFS=:
for dir in $PATH; do
IFS=$save_IFS
if test -x "$dir/$1"; then
return 0
fi
done
IFS=$save_IFS
echo >&2 "$0: $1 not found in \$PATH, please install and try again"
exit 1
} ovs_vsctl () {
ovs-vsctl --timeout=60 "$@"
} create_netns_link () {
mkdir -p /var/run/netns
if [ ! -e /var/run/netns/"$SPID" ]; then
ln -s /proc/"$SPID"/ns/net /var/run/netns/"$SPID"
trap 'delete_netns_link_source' 0
for signal in 1 2 3 13 14 15; do
trap 'delete_netns_link_source; trap - $signal; kill -$signal $$' $signal
done
fi
} delete_netns_link_source () {
rm -f /var/run/netns/"$SPID"
} add_port () {
SINT="$1"
SCNT="$2"
BRIDGE="$3" if [ -z "$SINT" ] || [ -z "$SCNT" ]; then
echo >&2 "$UTIL add-link: not enough arguments (use --help for help)"
exit 1
fi shift 3
while [ $# -ne 0 ]; do
case $1 in
--sip=*)
SADDR=`expr X"$1" : 'X[^=]*=\(.*\)'`
shift
;;
*)
echo >&2 "$UTIL add-link: unknown option \"$1\""
exit 1
;;
esac
done if [ -z "$SADDR" ]; then
echo >&2 "$UTIL add-link: not enough arguments (use --help for help)"
exit 1
fi # Commented we assume it already exists
#if brctl addbr "$BRIDGE" ; then :; else
# echo >&2 "$UTIL: Failed to add bridge $BRIDGE"
# exit 1
#fi if SPID=`docker inspect -f '{{.State.Pid}}' "$SCNT"`; then :; else
echo >&2 "$UTIL: Failed to get the PID of the container"
exit 1
fi create_netns_link # Create a veth pair.
asp="${SCNT}_${SINT}"
asp2=`echo "$asp" | md5sum | cut -f1 -d" "`
SPORTNAME=${asp2:0:12} ip link add "${SPORTNAME}_l" type veth peer name "${SPORTNAME}_c" # Add one end of veth to OVS bridge.
if brctl addif "$BRIDGE" "${SPORTNAME}_l"; then :; else
echo >&2 "$UTIL: Failed to add "${SPORTNAME}_l" port to bridge $BRIDGE"
ip link delete "${SPORTNAME}_l"
exit 1
fi ip link set "${SPORTNAME}_l" up # Move "${PORTNAME}_c" inside the container and changes its name.
ip link set "${SPORTNAME}_c" netns "$SPID"
ip netns exec "$SPID" ip link set dev "${SPORTNAME}_c" name "$SINT"
ip netns exec "$SPID" ip link set "$SINT" up if [ -n "$SADDR" ]; then
ip netns exec "$SPID" ip addr add "$SADDR" dev "$SINT"
fi # This is "just in case..."
ifconfig "$BRIDGE" up # This is also "just in case..."
sudo iptables -A FORWARD -p all -i "$BRIDGE" -j ACCEPT } del_port () {
SINT="$1"
SCNT="$2" if [ "$#" -lt 2 ]; then
usage
exit 1
fi asp="${SCNT}_${SINT}"
asp2=`echo "$asp" | md5sum | cut -f1 -d" "`
SPORT=${asp2:0:12} ip link delete "${SPORT}_l"
} usage() {
cat << EOF
${UTIL}: Performs integration of Open vSwitch with Docker.
usage: ${UTIL} COMMAND Commands: add-link SINT SCNT BRIDGE --sip="ADDRESS" del-link SINT SCNT Options:
-h, --help display this help message.
EOF
} UTIL=$(basename $0)
search_path brctl
search_path docker
search_path uuidgen if (ip netns) > /dev/null 2>&1; then :; else
echo >&2 "$UTIL: ip utility not found (or it does not support netns),"\
"cannot proceed"
exit 1
fi if [ $# -eq 0 ]; then
usage
exit 0
fi case $1 in
"add-link")
shift
add_port "$@"
exit 0
;;
"del-link")
shift
del_port "$@"
exit 0
;;
-h | --help)
usage
exit 0
;;
*)
echo >&2 "$UTIL: unknown command \"$1\" (use --help for help)"
exit 1
;;
esac
实验内容
问题1:在虚拟机导入文件
解决方案:使用U盘导入
问题2:权限
解决方案: sudo passwd输入新密码
su root
增加权限:sudo chmod -R 777
步骤1:./install_requirements.sh
问题3:docker容器无法访问
sudo apt-get install docker.io
Sonic+p4(1)的更多相关文章
- SDN 编程语言 p4(SDN programming language P4)
行业趋势,SND是未来. P4 是未来. SDN is inevitably, and P4 is inevitably. P4 = Programming Protocol-Independent ...
- P4论文粗读笔记(一)
一 文章名称:SNAP: Stateful Network-Wide Abstractions for Packet Processing 数据包处理的带状态网络概念 发表时间:2016 期刊来源:S ...
- P4语法(3)Table,Action
Table table是p4的匹配——动作表,定义了匹配字段(key).动作(action)和一些其他相关属性. 其处理数据包的流程: Key construction.建立其匹配字段 Key loo ...
- P4语法(2) Parser
这里参考学习了: P4语言规范 P4台湾社群 Parser 关于parser 在P4程序中,有着大量的首部(header)和首部实例,但每次只有部分首部实例会对数据包进行操作,而parser会用于生成 ...
- P4语法(1)基础数据类型和Header
文章学习自:P4语言编程详解 由于原文有一点的年份,所以也继续阅读了相关的最新规范. P4语言规范 基础数据类型 布尔型(bool) 运算符 描述 and 双目运算符,结果为布尔型 or 双目运算符, ...
- SONiC项目的发展及其相关介绍(转载)
SONiC作为一个开源项目,理论上是包含了SAI(switch abstraction interface,交换机抽象接口),SAI是没有开源的,厂商自己完成统一的API,提供给上层sonic用户来调 ...
- Entity Framework 6 Recipes 2nd Edition(11-1)译 -> 从“模型定义”函数返回一个标量值
第11章函数 函数提供了一个有力代码复用机制, 并且让你的代码保持简洁和易懂. 它们同样也是EF运行时能利用的数据库层代码.函数有几类: Rowset Functions, 聚合函数, Ranking ...
- 基础知识漫谈(2):从设计UI框架开始
说UI能延展出一丢丢的东西来,光java就有swing,swt/jface乃至javafx等等UI toolkit,在桌面上它们甚至都不是主流,在web端又有canvas.svg等等. 基于这些UI工 ...
- 解密jQuery事件核心 - 自定义设计(三)
接上文http://www.cnblogs.com/aaronjs/p/3447483.html 本文重点:自定义事件 “通过事件机制,可以将类设计为独立的模块,通过事件对外通信,提高了程序的开发效率 ...
随机推荐
- javaObject—toString方法
1 package face_object; 2 /* 3 * Object:所有类的根类. 4 * Object是不断抽取而来的,具备所有对象都具备的共性内容. 5 * 常用的共性功能: 6 * 7 ...
- 基于Centos7.X的CS:GO社区服搭建
基于Centos7.X的CS:GO私人服务器搭建 由于比完了赛,在学校太过无聊,便想搭建一个CSGO社区服务器,方便舍友同学进来游玩,顺便帮助一些有想法的人,让他们少走一点弯路 一.创建新用户,并下载 ...
- kubernetes之部署traefik-ingress分为http和https
1 理解Ingress 简单的说,ingress就是从kubernetes集群外访问集群的入口,将用户的URL请求转发到不同的service上.Ingress相当于nginx.apache等负载均衡方 ...
- 近期Android学习
近5天没有更新博客,因为这几天略微放下了python的学习,android这边连带项目比较急迫,先花大约1个星期的时间把重心放在Android,但python肯定还会坚持下去,毕竟连着学了那么久了. ...
- SpringBoot使用异步线程池实现生产环境批量数据推送
前言 SpringBoot使用异步线程池: 1.编写线程池配置类,自定义一个线程池: 2.定义一个异步服务: 3.使用@Async注解指向定义的线程池: 这里以我工作中使用过的一个案例来做描述,我所在 ...
- FFT通过傅里叶级数图解频域补零时域内插
在时域频域的信号分析的过程中,一个常见的说法叫:频域数据补零会让时域数据内插. 意思是在频域数据中多补几个零,再做ifft(逆傅里叶变换)后的时域数据,会变得更加"细腻",分辨率会 ...
- AT3913 XOR Tree
经过长时间的思考,我发现直接考虑对一条链进行修改是很难做出本题的,可能需要换一个方向. 可以发现本题中有操作的存在,是没有可以反过来做的做法的,因此正难则反这条路应该走不通. 那么唯一的办法就是简化这 ...
- ubuntu php连接oracle数据库
转载请注明来源:https://www.cnblogs.com/hookjc/ 需要将数据库从mysql迁移到oracle.下了个oracle xe在ubuntu下折腾了好久,都只能启动1521的侦听 ...
- 基于Oracle数据库登陆界面及功能实现 Java版
首先要在Oracle数据库创建表文件,包括建立表头以及关键字(唯一标识符),此次程序所用的表名称为SW_USER_INFO,表头有UNAME.UKEY.USEX等,关键字为UCC,然后添加一条记录,用 ...
- Ubuntu20.04.3中telnet 127.0.0.1时Unable to connect to remote host: Connection refused
本博客旨在自我学习使用,如有任何疑问请及时联系博主 今天遇到个稀奇古怪的问题: 调试emqx的时候一直econnrefused,检查服务时,突然发现在ubuntu上telnet localhost竟然 ...