赞
踩
本文主要根据OpenAirInterface(OAI)官方的提供的5G独立组网网络切片例程,对其进行详细的剖析并进行部署,首先在引言部分对文章整体进行介绍,在关键技术部分对实验用到的关键技术与官方例程进行详解,在实验过程部分详细介绍部署的流程,主要在一台Windows机器上安装Vmware应用程序,在Vmware上安装Ubuntu18.04 Linux机器,然后下载一系列支持环境与部署代码,包括Docker、docker-compose等等,再进行例程的部署,在结论部分将对整个实验进行总结。
关键词:5G 网络切片 OAI Docker 仿真
先不讲
先不讲
具体见 3GPP 23.501的大体介绍与 29.5xx的详细介绍
NRF(网络存储功能)用来进行NF登记、管理、状态检测,实现所有NF的自动化管理,每个NF启动时,必须要到NRF进行注册登记才能提供服务,登记信息包括NF类型、地址、服务列表等
先不讲,在一个物理网络中虚拟出多个端到端互相隔离的网络用于支持不同的应用场景
先不讲,一个通信仿真平台,支持对5G核心网的仿真,只需要一个电脑,你就可以仿真出一个核心网
先不讲,虚拟化技术,对比虚拟机更加轻量级、快速部署
官方例程首先贴出了部署网络切片的架构图,以及阅读例程、部署例程的时间,部署需要的电脑配置,部署的流程表,使用到的镜像与其版本,本例程涉及到的5G网络切片的特征,OAI 5G网络切片现在的支持情况。然后是部署的详细11个步骤。
本详解约等于对官方例程的中文翻译,然后注释上本人在阅读例程中的个人理解,其中斜体为本人理解。
该架构中核心网网元有公用部分与专用部分,主要是不同UE会使用到不同的UPF(用户面功能)。切片分为三个S-NSSAI(单网络切片选择辅助信息),使用三个不同的ue-gnb组接入相同的AMF(接入管理功能),通过NSSF(网络切片选择功能)根据不同的SST(切片/服务类型)与SD(切片区分)来接入不同的切片。既有使用单独NRF也有使用公用NRF,展现了不同的切片组合类型。
阅读时间:30 min
复现时间:1.5 h
推荐资源:6GB RAM 4CPU
注意:如果读者有兴趣部署具有更多日志的调试器/开发人员核心网络环境,请按照本教程进行操作。
目录
构建的镜像及标签如下表,当然也可以从docker-hub拉取镜像:
在本教程中,我们将探讨OAI 5G核心网的切片功能。在这里,我们将验证 :
网络切片在 PLMN 中定义,它包含 5G 核心网和 5G RAN 组件。网络切片被标识为单网络切片选择辅助信息 (S-NSSAI)。S-NSSAI由切片/服务类型(SST)和切片差异化器(SD)组成。SST 是一个必填字段,它根据功能和服务定义预期的切片行为。而SD是一个可选字段,可用于区分多个切片。
目前,3GPP允许NSSAI中最多八个S-NSSAI在UE和网络之间发送信令消息,这意味着单个UE一次最多可以由八个网络切片提供服务。SST 长度为 8 位;因此,它可以提供 2^8= 256 个 SST 值,其中有标准化 SST 的保留值 O 到 127(例如 SST 2 = URLCC、SST 3 = MIoT、SST 4 = V2X 等)。
当前OAI 5G 网络切片的状态:
如上图所示,配置了 3 个 S-NSSAI(可以用颜色区分),如下:
注:这里我们使用了标准化的 SST 值 (2,3,4),因为 rf-simulator仅支持 SST 值 1,2,3,4。此外,它仅用于数字参考,并不反映标准的SST行为,例如URLCC,MIoT,V2X等
在这里,AMF,NSSF,UDM,UDR,AUSF对所有切片都是通用的。切片 1 和 2 中的 SMF 和 UPF 具有相同的 NRF,因此两个 SMF 都可以发现这两个 UPF。您可以在日志中验证两个 SMF 是否已成功关联到切片 2 和 3 中的两个 UPF。在这里,在单一(NSI)NRF下注册的SMF / UPF的数量是运营商网络规划的一部分。
步骤 1 到 4 类似于前面的教程,例如最小核心网或基础核心网,请按照以这些骤部署OAI 5G核心网组件。
创建一个文件夹,您可以在其中存储本教程的所有结果文件,然后将它们与我们提供的结果文件进行比较,我们建议创建完全相同的文件夹,以免事后中断命令流。
这是1-4步中不同于mini-CN与basic-CN中的部分
docker-compose-host $: mkdir -p /tmp/oai/mini-gnbsim
docker-compose-host $: chmod 777 /tmp/oai/mini-gnbsim
创建了该文件夹后续会手动将日志等存储在这里
我们部署了带有附加组件oai-nssf的5G核心版本。我们将使用docker-compose来部署5G核心网,如下:
docker-compose-host $: docker-compose -f docker-compose-slicing-basic-nrf.yaml up -d
docker-compose-host $: docker-compose -f docker-compose-slicing-basic-nrf.yaml up -d mysql
Creating network "demo-oai-public-net" with driver "bridge"
Creating network "oai-public-access" with the default driver
Creating network "oai-public-core" with the default driver
Creating mysql ... done
**注意:**如果这是第一次,或者您计划运行实验很长时间:不要抓包。 而出于 CI 目的,我们将捕获数据包,并且不会长时间运行它,因此 PCAP 文件不会太大。
我们使用复杂的过滤器在docker 网络中抓包 - >更小的的PCAP文件。
docker-compose-host $: nohup sudo tshark -i demo-oai -f '(not host 192.168.70.145 and not host 192.168.70.154) or (host 192.168.70.145 and icmp)' -w /tmp/oai/slicing-with-nssf/slicing-with-nssf.pcap > /tmp/oai/slicing-with-nssf/slicing-with-nssf.log 2>&1 &
这是一个Linux命令,用于在后台运行tshark命令,将demo-oai接口上的数据包捕获并写入到/tmp/oai/slicing-with-nssf/slicing-with-nssf.pcap文件中。具体来说,-i选项指定了要捕获的接口,-f选项指定了过滤规则,只捕获不是192.168.70.145和192.168.70.154主机的数据包,或者目的地址是192.168.70.145且协议是ICMP的数据包。>操作符将标准输出重定向到/tmp/oai/slicing-with-nssf/slicing-with-nssf.log文件中,2>&1表示将标准错误输出重定向到标准输出,&操作符将命令放到后台运行。nohup命令用于在退出终端或注销时仍然保持命令运行。
docker-compose-host $: sudo chmod 666 /tmp/oai/slicing-with-nssf/slicing-with-nssf.*
确保所有容器都健康:
docker-compose-host $: docker-compose -f docker-compose-slicing-basic-nrf.yaml ps -a Name Command State Ports ----------------------------------------------------------------------------------------------- mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp oai-amf /bin/bash /openair-amf/bin ... Up (healthy) 38412/sctp, 80/tcp, 9090/tcp oai-ausf /bin/bash /openair-ausf/bi ... Up (healthy) 80/tcp oai-ext-dn /bin/bash -c apt update; ... Up (healthy) oai-nrf-slice12 /bin/bash /openair-nrf/bin ... Up (healthy) 80/tcp, 9090/tcp oai-nrf-slice3 /bin/bash /openair-nrf/bin ... Up (healthy) 80/tcp, 9090/tcp oai-nssf /bin/bash /openair-nssf/bi ... Up (healthy) 80/tcp, 8080/tcp oai-smf-slice1 /bin/bash /openair-smf/bin ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp oai-smf-slice2 /bin/bash /openair-smf/bin ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp oai-smf-slice3 /bin/bash /openair-smf/bin ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp oai-spgwu-slice1 /openair-spgwu-tiny/bin/en ... Up (healthy) 2152/udp, 8805/udp oai-spgwu-slice2 /openair-spgwu-tiny/bin/en ... Up (healthy) 2152/udp, 8805/udp oai-udm /bin/bash /openair-udm/bin ... Up (healthy) 80/tcp oai-udr /bin/bash /openair-udr/bin ... Up (healthy) 80/tcp vpp-upf-slice3 /openair-upf/bin/entrypoin ... Up (healthy) 2152/udp, 8085/udp
我们使用 3 种不同的 ran 模拟器:ueransim、rfsimulator 和gnbsim 用于切片 2、3 和 4。它们中的每一个都有自己的一组功能,可以根据需要使用。不同的 ran 模拟器用法在这里模拟了现实的部署场景,其中运营商可以在网络中部署多供应商设备。
可以从官方仓库中提取 docker 镜像,如下所示 :
$ docker pull rohankharade/gnbsim:latest
$ docker pull rohankharade/ueransim:latest
$ docker pull oaisoftwarealliance/oai-gnb:develop
$ docker pull oaisoftwarealliance/oai-nr-ue:develop
并重新标记它们,以便教程的 docker-compose 文件正常工作:
$ docker image tag rohankharade/gnbsim:latest gnbsim:latest
$ docker image tag rohankharade/ueransim:latest ueransim:latest
使用如下docker-compose部署切片1的仿真基站:
docker-compose-host $: docker-compose -f docker-compose-slicing-ransim.yaml up -d ueransim
Creating ueransim ... done
等待5-10s后部署切片2的仿真基站:
docker-compose-host $: docker-compose -f docker-compose-slicing-ransim.yaml up -d oai-gnb oai-nr-ue1
Creating rfsim5g-oai-gnb ... done
Creating rfsim5g-oai-nr-ue1 ... done
等待5-10s后部署切片3的仿真基站:
docker-compose-host $: docker-compose -f docker-compose-slicing-ransim.yaml up -d gnbsim
Creating gnbsim ... done
等待5-10s,确认所有的仿真基站服务都健康:
docker-compose-host $: docker-compose -f docker-compose-slicing-ransim.yaml ps -a
Name Command State Ports
--------------------------------------------------------------------------
gnbsim /gnbsim/bin/entrypoint.sh ... Up (healthy)
rfsim5g-oai-gnb /opt/oai-gnb/bin/entrypoin ... Up (healthy)
rfsim5g-oai-nr-ue1 /opt/oai-nr-ue/bin/entrypo ... Up (healthy)
ueransim /ueransim/bin/entrypoint.sh Up (healthy)
成功部署后,我们可以在 AMF 验证所有 gnb 和 UE 是否已成功注册到网络。
docker-compose-host $: docker logs oai-amf
[2021-12-13T20:47:20.265472] [AMF] [amf_app] [info ] |----------------------------------------------------------------------------------------------------------------|
[2021-12-13T20:47:20.265497] [AMF] [amf_app] [info ] |----------------------------------------------------gNBs' information-------------------------------------------|
[2021-12-13T20:47:20.265503] [AMF] [amf_app] [info ] | Index | Status | Global ID | gNB Name | PLMN |
[2021-12-13T20:47:20.265522] [AMF] [amf_app] [info ] | 1 | Connected | 0x1 |UERANSIM-gnb-208-95-1 | 208, 95 |
[2021-12-13T20:47:20.265530] [AMF] [amf_app] [info ] | 2 | Connected | 0x1400 | | 208, 95 |
[2021-12-13T20:47:20.265537] [AMF] [amf_app] [info ] | 3 | Connected | 0xe000 | gnb-rfsim | 208, 95 |
[2021-12-13T20:47:20.265543] [AMF] [amf_app] [info ] |----------------------------------------------------------------------------------------------------------------|
[2021-12-13T20:47:20.265548] [AMF] [amf_app] [info ]
[2021-12-13T20:47:20.265553] [AMF] [amf_app] [info ] |----------------------------------------------------------------------------------------------------------------|
[2021-12-13T20:47:20.265558] [AMF] [amf_app] [info ] |----------------------------------------------------UEs' information--------------------------------------------|
[2021-12-13T20:47:20.265564] [AMF] [amf_app] [info ] | Index | 5GMM state | IMSI | GUTI | RAN UE NGAP ID | AMF UE ID | PLMN |Cell ID|
[2021-12-13T20:47:20.265951] [AMF] [amf_app] [info ] | 1| 5GMM-REGISTERED| 208950000000035| | 1| 2| 208, 95 | 256|
[2021-12-13T20:47:20.265967] [AMF] [amf_app] [info ] | 2| 5GMM-REGISTERED| 208950000000036| | -1441334349| 3| 208, 95 |14680064|
[2021-12-13T20:47:20.265976] [AMF] [amf_app] [info ] | 3| 5GMM-REGISTERED| 208950000000037| | -372062044| 4| 208, 95 |14680064|
进行oai-ext-dn到UEs节点之间的通信测试
docker-compose-host $: docker logs gnbsim 2>&1 | tail -10 docker-compose-host $: docker logs oai-amf 2>&1 | tail -20 docker-compose-host $: docker exec oai-ext-dn ping -c 4 12.1.1.2 PING 12.1.1.2 (12.1.1.2) 56(84) bytes of data. 64 bytes from 12.1.1.2: icmp_seq=2 ttl=63 time=0.346 ms 64 bytes from 12.1.1.2: icmp_seq=3 ttl=63 time=0.286 ms 64 bytes from 12.1.1.2: icmp_seq=4 ttl=63 time=0.267 ms --- 12.1.1.2 ping statistics --- 4 packets transmitted, 3 received, 25% packet loss, time 3059ms rtt min/avg/max/mdev = 0.267/0.299/0.346/0.039 ms docker-compose-host $: docker exec oai-ext-dn ping -c 4 12.2.1.2 PING 12.2.1.2 (12.2.1.2) 56(84) bytes of data. 64 bytes from 12.2.1.2: icmp_seq=1 ttl=63 time=1.00 ms 64 bytes from 12.2.1.2: icmp_seq=2 ttl=63 time=0.644 ms 64 bytes from 12.2.1.2: icmp_seq=3 ttl=63 time=0.504 ms 64 bytes from 12.2.1.2: icmp_seq=4 ttl=63 time=0.390 ms --- 12.2.1.2 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3039ms rtt min/avg/max/mdev = 0.390/0.635/1.004/0.232 ms docker-compose-host $: docker exec oai-ext-dn ping -c 4 12.1.1.129 PING 12.1.1.129 (12.1.1.129) 56(84) bytes of data. 64 bytes from 12.1.1.129: icmp_seq=1 ttl=63 time=40.0 ms 64 bytes from 12.1.1.129: icmp_seq=2 ttl=63 time=39.5 ms 64 bytes from 12.1.1.129: icmp_seq=3 ttl=63 time=11.2 ms 64 bytes from 12.1.1.129: icmp_seq=4 ttl=63 time=11.2 ms --- 12.1.1.129 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3003ms rtt min/avg/max/mdev = 11.206/25.511/40.071/14.292 ms
docker logs gnbsim 2>&1 | tail -10
:这是一个Docker命令,用于查看名为gnbsim的Docker容器的日志。具体来说,这个命令会将容器的标准错误输出和标准输出合并起来,然后输出最后10行日志。其中,2>&1表示将标准错误输出重定向到标准输出,tail -10表示只显示最后10行日志。
这里就是分别在oai-ext-dn容器中ping仿真UE的Ip
docker-compose-host $: docker logs oai-amf > /tmp/oai/slicing-with-nssf/amf.log 2>&1 docker-compose-host $: docker logs oai-ausf > /tmp/oai/slicing-with-nssf/ausf.log 2>&1 docker-compose-host $: docker logs oai-nssf > /tmp/oai/slicing-with-nssf/nssf.log 2>&1 docker-compose-host $: docker logs oai-udm > /tmp/oai/slicing-with-nssf/udm.log 2>&1 docker-compose-host $: docker logs oai-udr > /tmp/oai/slicing-with-nssf/udr.log 2>&1 docker-compose-host $: docker logs oai-nrf-slice12 > /tmp/oai/slicing-with-nssf/nrf-slice12.log 2>&1 docker-compose-host $: docker logs oai-nrf-slice3 > /tmp/oai/slicing-with-nssf/nrf-slice3.log 2>&1 docker-compose-host $: docker logs oai-smf-slice1 > /tmp/oai/slicing-with-nssf/smf-slice1.log 2>&1 docker-compose-host $: docker logs oai-smf-slice2 > /tmp/oai/slicing-with-nssf/smf-slice2.log 2>&1 docker-compose-host $: docker logs oai-smf-slice3 > /tmp/oai/slicing-with-nssf/smf-slice3.log 2>&1 docker-compose-host $: docker logs oai-spgwu-slice1 > /tmp/oai/slicing-with-nssf/spgwu-slice1.log 2>&1 docker-compose-host $: docker logs oai-spgwu-slice2 > /tmp/oai/slicing-with-nssf/spgwu-slice2.log 2>&1 docker-compose-host $: docker logs vpp-upf-slice3 > /tmp/oai/slicing-with-nssf/vpp-upf-slice3.log 2>&1 docker-compose-host $: docker logs gnbsim > /tmp/oai/slicing-with-nssf/gnbsim.log 2>&1 docker-compose-host $: docker logs rfsim5g-oai-gnb > /tmp/oai/slicing-with-nssf/rfsim5g-oai-gnb.log 2>&1 docker-compose-host $: docker logs rfsim5g-oai-nr-ue1 > /tmp/oai/slicing-with-nssf/rfsim5g-oai-nr-ue1.log 2>&1 docker-compose-host $: docker logs ueransim > /tmp/oai/slicing-with-nssf/ueransim.log 2>&1
这是一个Docker命令,用于将名为oai-udm的Docker容器的日志输出到/tmp/oai/slicing-with-nssf/udm.log文件中
容器对应IP:
官方对比抓包文件与日志文件:下载地址
OAI 5G CN还支持具有多个切片的UE。但是经过验证,基站仿真软件不支持一次具有多个切片的UE。
docker-compose-host $: docker-compose -f docker-compose-slicing-ransim.yaml down -t 0
Stopping ueransim ... done
Stopping rfsim5g-oai-nr-ue1 ... done
Stopping rfsim5g-oai-gnb ... done
Removing ueransim ... done
Removing gnbsim ... done
Removing rfsim5g-oai-nr-ue1 ... done
Removing rfsim5g-oai-gnb ... done
Network demo-oai-public-net is external, skipping
Network oai-public-access is external, skipping
docker-compose-host $: docker-compose -f docker-compose-slicing-basic-nrf.yaml down -t 0 Stopping oai-spgwu-slice1 ... done Stopping oai-smf-slice3 ... done Stopping oai-smf-slice1 ... done Stopping oai-smf-slice2 ... done Stopping oai-amf ... done Stopping oai-ausf ... done Stopping oai-udm ... done Stopping oai-udr ... done Stopping vpp-upf-slice3 ... done Stopping oai-spgwu-slice2 ... done Stopping oai-nrf-slice12 ... done Stopping mysql ... done Stopping oai-nssf ... done Stopping oai-ext-dn ... done Stopping oai-nrf-slice3 ... done Removing oai-spgwu-slice1 ... done Removing oai-smf-slice3 ... done Removing oai-smf-slice1 ... done Removing oai-smf-slice2 ... done Removing oai-amf ... done Removing oai-ausf ... done Removing oai-udm ... done Removing oai-udr ... done Removing vpp-upf-slice3 ... done Removing oai-spgwu-slice2 ... done Removing oai-nrf-slice12 ... done Removing mysql ... done Removing oai-nssf ... done Removing oai-ext-dn ... done Removing oai-nrf-slice3 ... done Removing network demo-oai-public-net Removing network oai-public-access Removing network oai-public-core
-t 0
: 此选项指定停止容器的超时值,将其设置为零表示在删除容器和网络之前不会等待任何正在运行的进程停止
以下面一段为例:
version: '3.8' services: mysql: container_name: mysql image: mysql:8.0 volumes: - ./database/oai_db2.sql:/docker-entrypoint-initdb.d/oai_db.sql - ./healthscripts/mysql-healthcheck2.sh:/tmp/mysql-healthcheck.sh environment: - TZ=Europe/Paris - MYSQL_DATABASE=oai_db - MYSQL_USER=test - MYSQL_PASSWORD=test - MYSQL_ROOT_PASSWORD=linux healthcheck: test: /bin/bash -c "/tmp/mysql-healthcheck.sh" interval: 10s timeout: 5s retries: 30 networks: public_net: ipv4_address: 192.168.70.131 oai-nssf: container_name: "oai-nssf" image: oaisoftwarealliance/oai-nssf:v1.5.0 environment: - INSTANCE=0 - TZ=Europe/Paris - PID_DIRECTORY=/var/run - NSSF_NAME=oai-nssf - NSSF_FQDN=nssf.oai-5gcn.eur - SBI_IF_NAME=eth0 - SBI_PORT=80 - SBI_API_VERSION=v1 - SBI_PORT_HTTP1=80 - SBI_PORT_HTTP2=8080 - NSSF_SLICE_CONFIG=/openair-nssf/etc/nssf_slice_config.yaml cap_add: - NET_ADMIN - SYS_ADMIN cap_drop: - ALL privileged: true volumes: - ./nssf_slice_config.yaml:/openair-nssf/etc/nssf_slice_config.yaml networks: public_net: ipv4_address: 192.168.70.132
这是一个Docker Compose文件,用于定义和运行多个Docker容器。其中:
version: '3.8'
:指定Docker Compose文件的版本。
services:
:定义了两个服务,mysql
和oai-nssf
。
mysql:
:定义了一个MySQL服务。
container_name: mysql
:指定容器的名称。
image: mysql:8.0
:使用的MySQL镜像版本。
volumes:
:指定容器与主机之间共享的文件或目录,前者是主机的文件,后者是容器内的文件。在容器第一次启动的时候,它会将容器内的映射路径下的文件复制到宿主机上保存。 一旦我们在宿主机上修改了这些文件,容器运行时就以宿主机上的文件为准。
environment:
:设置容器内的环境变量。
healthcheck:
:定义容器的健康检查。
test: /bin/bash -c "/tmp/mysql-healthcheck.sh"
:设置健康检查的命令为/bin/bash -c "/tmp/mysql-healthcheck.sh"
。
interval: 10s
:设置健康检查的间隔时间为10秒。
timeout: 5s
:设置健康检查的超时时间为5秒。
. retries: 30
:设置健康检查失败后的重试次数为30次。
networks:
:指定容器所在的网络。
oai-nssf:
:定义了一个oai-nssf服务。
cap_add:
:添加容器的Linux capabilities。cap_drop:
:删除容器的Linux capabilities。privileged: true
:启用容器的特权模式。networks:
:指定容器所在的网络。depend _on:
:此容器启动需要依赖的容器
Capabilities 机制是在 Linux 内核 2.2 之后引入的,原理很简单,就是将之前与超级用户 root(UID=0)关联的特权细分为不同的功能组,Capabilites 作为线程(Linux 并不真正区分进程和线程)的属性存在,每个功能组都可以独立启用和禁用。其本质上就是将内核调用分门别类,具有相似功能的内核调用被分到同一组中。这样一来,权限检查的过程就变成了:在执行特权操作时,如果线程的有效身份不是 root,就去检查其是否具有该特权操作所对应的 capabilities,并以此为依据,决定是否可以执行特权操作。
networks:
public_net: #定义了网络的名称,名为 "public_net"。
driver: bridge #设置使用 Bridge 驱动程序,它是默认的网络驱动程序
name: demo-oai-public-net #设置网络的名称为 "demo-oai-public-net"
ipam: #使用 IP 地址管理(IPAM),指定 IPv4 子网。在这里,使用子网 192.168.70.0/24
config:
- subnet: 192.168.70.0/24
driver_opts: #定义驱动选项而不是使用默认值。将桥接网络命名为 "demo-oai"
com.docker.network.bridge.name: "demo-oai"
完整代码见附录1
mysql: container_name: mysql image: mysql:8.0 volumes: - ./database/oai_db2.sql:/docker-entrypoint-initdb.d/oai_db.sql - ./healthscripts/mysql-healthcheck2.sh:/tmp/mysql-healthcheck.sh environment: - TZ=Europe/Paris - MYSQL_DATABASE=oai_db - MYSQL_USER=test - MYSQL_PASSWORD=test - MYSQL_ROOT_PASSWORD=linux healthcheck: test: /bin/bash -c "/tmp/mysql-healthcheck.sh" interval: 10s timeout: 5s retries: 30 networks: public_net: ipv4_address: 192.168.70.131
mysql:
: 配置 MySQL 数据库容器的服务名称。container_name: mysql
: 指定容器的名称为 mysql
。image: mysql:8.0
: 指定使用 mysql
镜像的版本为 8.0
。volumes:
: 配置数据卷,将本地的 ./database/oai_db2.sql
映射到容器内的 /docker-entrypoint-initdb.d/oai_db.sql
,并将本地的 ./healthscripts/mysql-healthcheck2.sh
映射到容器内的 /tmp/mysql-healthcheck.sh
。environment:
: 配置环境变量,包括容器的时区 TZ
,MySQL 数据库的名称 MYSQL_DATABASE
,用户名 MYSQL_USER
,用户密码 MYSQL_PASSWORD
和 root 用户密码 MYSQL_ROOT_PASSWORD
。healthcheck:
: 配置容器的健康检查。
test: /bin/bash -c "/tmp/mysql-healthcheck.sh"
: 指定容器健康检查的命令为在容器内执行 /tmp/mysql-healthcheck.sh
脚本。interval: 10s
: 指定健康检查间隔为 10s
。timeout: 5s
: 指定健康检查超时时间为 5s
。retries: 30
: 指定容器健康检查失败时的重试次数为 30
次。networks:
: 配置容器所属的网络,指定 IP 地址为 192.168.70.131
,该网络名称为 public_net
。oai_nssf: container_name: "oai-nssf" # 设置容器名称为 "oai-nssf" image: oaisoftwarealliance/oai-nssf:develop # 使用 oaisoftwarealliance/oai-nssf:develop 镜像来创建容器 environment: # 配置容器运行时的环境变量 - INSTANCE=0 # 设置容器实例编号为 0 - TZ=Europe/Paris # 设置时区为欧洲巴黎时区 - PID_DIRECTORY=/var/run # 设置进程 ID 文件存放路径为 /var/run - NSSF_NAME=oai-nssf # 设置 nssf 的名称为 oai-nssf - NSSF_FQDN=nssf.oai-5gcn.eur # 设置 nssf 的 FQDN 为 nssf.oai-5gcn.eur - SBI_IF_NAME=eth0 # 设置 SBI 网络接口的名称为 eth0 - SBI_PORT=80 # 设置 SBI 的端口号为 80 - SBI_API_VERSION=v1 # 设置 SBI 的 API 版本为 v1 - SBI_PORT_HTTP1=80 # 设置 HTTP1 的端口号为 80 - SBI_PORT_HTTP2=8080 # 设置 HTTP2 的端口号为 8080 - NSSF_SLICE_CONFIG=/openair-nssf/etc/nssf_slice_config.yaml # 设置 nssf 切片配置文件的路径为 /openair-nssf/etc/nssf_slice_config.yaml cap_add: # 为容器添加额外的 Linux capabilities 权限 - NET_ADMIN # 允许容器修改网络配置 - SYS_ADMIN # 允许容器进行系统级的操作 cap_drop: # 删除容器的部分 Linux capabilities 权限 - ALL # 删除所有的 capabilities privileged: true # 允许容器获取特权权限 volumes: # 将容器内部的文件目录挂载到宿主机上的文件目录中 - ./nssf_slice_config.yaml:/openair-nssf/etc/nssf_slice_config.yaml # 将当前目录下的 nssf_slice_config.yaml 文件挂载到容器的 /openair-nssf/etc/ 目录下 networks: # 配置容器连接的网络 public_net: # 设置网络的名称为 public_net ipv4_address: 192.168.70.132 # 设置容器的 IPv4 地址为 192.168.70.132
oai_udr: container_name: oai-udr image: oaisoftwarealliance/oai-udr:develop environment: - TZ=Europe/Paris - INSTANCE=0 - PID_DIRECTORY=/var/run - UDR_INTERFACE_NAME_FOR_NUDR=eth0 - UDR_INTERFACE_PORT_FOR_NUDR=80 - UDR_INTERFACE_HTTP2_PORT_FOR_NUDR=8080 - UDR_API_VERSION=v1 - MYSQL_IPV4_ADDRESS=192.168.70.131 - MYSQL_USER=test - MYSQL_PASS=test - MYSQL_DB=oai_db - WAIT_MYSQL=120 depends_on: - mysql networks: public_net: ipv4_address: 192.168.70.133
oai_udr:
:配置 UDR 容器的服务名称。container_name: oai-udr
:指定容器的名称为 oai-udr
。image: oaisoftwarealliance/oai-udr:develop
:指定使用 oaisoftwarealliance/oai-udr
镜像的 develop
分支版本。environment:
:配置环境变量,包括时区 TZ
、容器的编号 INSTANCE
、进程 ID 目录 PID_DIRECTORY
、向 NUDR 发送数据包的 UDR 接口名称 UDR_INTERFACE_NAME_FOR_NUDR
、UDR 接口端口 UDR_INTERFACE_PORT_FOR_NUDR
、UDR 的 HTTP2 端口 UDR_INTERFACE_HTTP2_PORT_FOR_NUDR
、UDR 的 API 版本 UDR_API_VERSION
、MySQL 数据库的 IP 地址 MYSQL_IPV4_ADDRESS
、MySQL 数据库的用户名 MYSQL_USER
、MySQL 数据库的密码 MYSQL_PASS
、MySQL 数据库的名称 MYSQL_DB
和等待 MySQL 数据库启动的时间 WAIT_MYSQL
。depends_on:
:指定依赖项,本容器依赖于 mysql
容器。networks:
:配置容器所属的网络,指定 IP 地址为 192.168.70.133
,该网络名称为 public_net
。oai_udm: # 设置容器名称 container_name: oai-udm # 指定使用的镜像名称和版本 image: oaisoftwarealliance/oai-udm:develop # 设置容器的环境变量 environment: # 设置时区为欧洲巴黎 - TZ=Europe/Paris # 设置实例编号为0 - INSTANCE=0 # 设置PID目录为/var/run - PID_DIRECTORY=/var/run # 设置UDM的名称为OAI_UDM - UDM_NAME=OAI_UDM # 设置UDM与SBI之间通信的接口名称为eth0 - SBI_IF_NAME=eth0 # 设置UDM与SBI之间通信的端口为80 - SBI_PORT=80 # 设置UDM的版本为v1 - UDM_VERSION_NB=v1 # 设置是否使用全限定域名的DNS解析方式为yes - USE_FQDN_DNS=yes # 设置UDR的IP地址为192.168.70.133 - UDR_IP_ADDRESS=192.168.70.133 # 设置UDR的端口为80 - UDR_PORT=80 # 设置UDR的版本为v1 - UDR_VERSION_NB=v1 # 设置UDR的全限定域名为oai_udr - UDR_FQDN=oai_udr # 设置依赖的服务为oai_udr depends_on: - oai_udr # 设置网络配置,使用公共网络,IP地址为192.168.70.134 networks: public_net: ipv4_address: 192.168.70.134
oai_ausf: # 定义容器名称 container_name: oai-ausf # 容器名称 image: oaisoftwarealliance/oai-ausf:develop # 使用的镜像名称和标签 environment: # 容器运行环境变量 - TZ=Europe/Paris # 设置时区 - INSTANCE_ID=0 # 定义实例ID - PID_DIR=/var/run # 定义PID文件存储位置 - AUSF_NAME=OAI_AUSF # 定义AUSF的名称 - SBI_IF_NAME=eth0 # 定义用于SBI接口的网络接口名称 - SBI_PORT=80 # 定义SBI接口的端口号 - USE_FQDN_DNS=yes # 是否使用FQDN作为DNS的查询方式 - UDM_IP_ADDRESS=192.168.70.134 # UDM的IP地址 - UDM_PORT=80 # UDM的端口号 - UDM_VERSION_NB=v1 # UDM的版本号 - UDM_FQDN=oai_udm # 定义UDM的FQDN depends_on: # 定义容器启动顺序和依赖关系 - oai_udm networks: # 定义容器所属的网络 public_net: ipv4_address: 192.168.70.135 # 容器的IPv4地址
oai_nrf_slice12: # 创建一个名为 oai_nrf_slice12 的服务
container_name: oai-nrf-slice12 # 为容器设置一个名称
image: oaisoftwarealliance/oai-nrf:develop # 使用的容器镜像
environment: # 容器运行环境变量
- NRF_INTERFACE_NAME_FOR_SBI=eth0 # SBI 接口名称为 eth0
- NRF_INTERFACE_PORT_FOR_SBI=80 # SBI 接口端口为 80
- NRF_INTERFACE_HTTP2_PORT_FOR_SBI=8080 # SBI HTTP2 端口为 8080
- NRF_API_VERSION=v1 # 使用的 NRF API 版本为 v1
- INSTANCE=0 # 当前实例 ID 为 0
- PID_DIRECTORY=/var/run # 进程 ID 文件的存储目录为 /var/run
networks: # 配置容器连接的网络
public_net: # 容器连接的网络名为 public_net
ipv4_address: 192.168.70.136 # 容器分配的 IPv4 地址为 192.168.70.136
oai_nrf_slice3: # 定义容器名称为oai_nrf_slice3
container_name: oai-nrf-slice3 # 指定Docker容器的名称为oai-nrf-slice3
image: oaisoftwarealliance/oai-nrf:develop # 使用的Docker镜像为oaisoftwarealliance/oai-nrf:develop
environment: # 设置Docker容器的环境变量
- NRF_INTERFACE_NAME_FOR_SBI=eth0 # NRF接口名为eth0
- NRF_INTERFACE_PORT_FOR_SBI=80 # NRF接口端口为80
- NRF_INTERFACE_HTTP2_PORT_FOR_SBI=8080 # NRF HTTP2端口为8080
- NRF_API_VERSION=v1 # NRF API版本为v1
- INSTANCE=0 # 实例ID为0
- PID_DIRECTORY=/var/run # PID目录为/var/run
networks: # 设置容器所属的网络
public_net: # 网络名为public_net
ipv4_address: 192.168.70.137 # 容器的IP地址为192.168.70.137
oai_amf: container_name: oai-amf # Docker 容器名称 image: oaisoftwarealliance/oai-amf:develop # 使用的镜像 environment: # 设置的环境变量 - TZ=Europe/Paris # 时区 - INSTANCE=0 # 实例 ID - PID_DIRECTORY=/var/run # 进程 ID 存储路径 - MCC=208 # 移动国家代码 - MNC=95 # 移动网络代码 - REGION_ID=128 # 区域 ID - AMF_SET_ID=1 # AMF 集 ID - SERVED_GUAMI_MCC_0=208 # 为UE提供服务的 GUAMI 中的 MCC 0 - SERVED_GUAMI_MNC_0=95 # 为UE提供服务的 GUAMI 中的 MNC 0 - SERVED_GUAMI_REGION_ID_0=128 # 为UE提供服务的 GUAMI 中的 Region ID 0 - SERVED_GUAMI_AMF_SET_ID_0=1 # 为UE提供服务的 GUAMI 中的 AMF Set ID 0 - SERVED_GUAMI_MCC_1=460 # 为UE提供服务的 GUAMI 中的 MCC 1 - SERVED_GUAMI_MNC_1=11 # 为UE提供服务的 GUAMI 中的 MNC 1 - SERVED_GUAMI_REGION_ID_1=10 # 为UE提供服务的 GUAMI 中的 Region ID 1 - SERVED_GUAMI_AMF_SET_ID_1=1 # 为UE提供服务的 GUAMI 中的 AMF Set ID 1 - PLMN_SUPPORT_MCC=208 # PLMN 支持的 MCC - PLMN_SUPPORT_MNC=95 # PLMN 支持的 MNC - PLMN_SUPPORT_TAC=0xa000 # PLMN 支持的 TAC - SST_0=128 # SST 0 - SD_0=128 # SD 0 - SST_1=1 # SST 1 - SD_1=0xFFFFFF # SD 1 - SST_2=130 # SST 2 - SD_2=130 # SD 2 - AMF_INTERFACE_NAME_FOR_NGAP=eth0 # AMF 接口名称(用于 NGAP) - AMF_INTERFACE_NAME_FOR_N11=eth0 # AMF 接口名称(用于 N11) # SMF配置 - SMF_INSTANCE_ID_0=1 # SMF 实例 ID 0 - SMF_FQDN_0=oai_smf_slice1 # SMF Fully Qualified Domain Name (FQDN) 0 - SMF_IPV4_ADDR_0=0.0.0.0 # SMF IPv4 地址 0 - SMF_HTTP_VERSION_0=v1 # SMF 使用的 HTTP 版本 0 - SELECTED_0=true # 是否选择 SMF 0 - SMF_INSTANCE_ID_1=2 # SMF 实例 ID 1 - SMF_FQDN_1: oai_smf_slice2 # SMF的完全限定域名 - SMF_IPV4_ADDR_1: 0.0.0.0 # SMF的IPv4地址 - SMF_HTTP_VERSION_1: v1 # 使用的HTTP版本 - SELECTED_1: false # 是否选中此SMF # MySQL配置 - MYSQL_SERVER: 192.168.70.131 # MySQL服务器地址 - MYSQL_USER: root # MySQL用户名 - MYSQL_PASS: linux # MySQL密码 - MYSQL_DB: oai_db # 数据库名称 # Operator Key - OPERATOR_KEY: 63bfa50ee6523365ff14c1f45f88737d # 操作员密钥 # NRF配置 - NRF_IPV4_ADDRESS: 0.0.0.0 # NRF的IPv4地址 - NRF_PORT: 80 # NRF的端口号 - EXTERNAL_NRF: no # 是否使用外部NRF - NF_REGISTRATION: no # 是否启用NF注册 - SMF_SELECTION: yes # 是否使用SMF选择 - USE_FQDN_DNS: yes # 是否使用FQDN DNS解析 - NRF_API_VERSION: v1 # 使用的NRF API版本 - NRF_FQDN: oai_nrf_slice12 # NRF的完全限定域名 # AUSF配置 - AUSF_IPV4_ADDRESS: 192.168.70.135 # AUSF的IPv4地址 - AUSF_PORT: 80 # AUSF的端口号 - AUSF_API_VERSION: v1 # 使用的AUSF API版本 - AUSF_FQDN: oai_ausf # AUSF的完全限定域名 - EXTERNAL_AUSF: yes # 是否使用外部AUSF # UDM配置 - UDM_IPV4_ADDRESS: 192.168.70.134 # UDM的IPv4地址 - UDM_PORT: 80 # UDM的端口号 - UDM_API_VERSION: v2 # 使用的UDM API版本 - UDM_FQDN: oai_udm # UDM的完全限定域名 # NSSF配置 - NRF_SELECTION: yes # 是否使用NRF选择 - EXTERNAL_NSSF: yes # 是否使用外部NSSF - NSSF_IPV4_ADDRESS: 192.168.70.132 # NSSF的IPv4地址 - NSSF_PORT: 80 # NSSF的端口号 - NSSF_API_VERSION: v1 # 使用的NSSF API版本 - NSSF_FQDN: oai-nssf # NSSF的完全限定域名 # 加密和完整性保护算法 - INT_ALGO_LIST: ["NIA1" , "NIA2"] # 使用的完整性保护算法 - CIPH_ALGO_LIST: ["NEA1" , "NEA2"] # 使用的加密算法 # 是否使用HTTP/2 - USE_HTTP2: no # 是否使用HTTP/2 # 依赖服务 depends_on: - mysql # 依赖的MySQL服务 - oai_nrf - vpp_upf_slice3 - oai_ausf networks: public_net: ipv4_address: 192.168.70.138
oai_smf_slice1: # 容器名称 container_name: oai-smf-slice1 # 容器名称 image: oaisoftwarealliance/oai-smf:develop # 容器所使用的镜像 environment: # 容器的环境变量 - TZ=Europe/Paris # 时区 - INSTANCE=0 # 实例编号 - PID_DIRECTORY=/var/run # PID文件的存储目录 - SMF_INTERFACE_NAME_FOR_N4=eth0 # 用于N4接口的网络接口名称 - SMF_INTERFACE_NAME_FOR_SBI=eth0 # 用于SBI接口的网络接口名称 - SMF_INTERFACE_PORT_FOR_SBI=80 # SBI接口使用的端口号 - SMF_INTERFACE_HTTP2_PORT_FOR_SBI=8080 # SBI接口使用的HTTP2端口号 - SMF_API_VERSION=v1 # 使用的SMF API版本号 - DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100 # 默认DNS服务器的IPv4地址 - DEFAULT_DNS_SEC_IPV4_ADDRESS=8.8.8.8 # 默认DNS服务器的备用IPv4地址 - AMF_IPV4_ADDRESS=192.168.70.138 # AMF的IPv4地址 - AMF_PORT=80 # AMF的端口号 - AMF_API_VERSION=v1 # 使用的AMF API版本号 - AMF_FQDN=oai_amf # AMF的FQDN - UDM_IPV4_ADDRESS=192.168.70.134 # UDM的IPv4地址 - UDM_PORT=80 # UDM的端口号 - UDM_API_VERSION=v2 # 使用的UDM API版本号 - UDM_FQDN=oai_udm # UDM的FQDN - UPF_IPV4_ADDRESS=127.0.0.1 # UPF的IPv4地址 - UPF_FQDN_0=localhost # UPF的FQDN - NRF_IPV4_ADDRESS=192.168.70.136 # NRF的IPv4地址 - NRF_PORT=80 # NRF的端口号 - NRF_API_VERSION=v1 # 使用的NRF API版本号 - NRF_FQDN=oai_nrf_slice12 # NRF的FQDN - REGISTER_NRF=yes # 是否向NRF注册 - DISCOVER_UPF=yes # 是否自动发现UPF - DISCOVER_PCF=no # 是否自动发现PCF - USE_LOCAL_SUBSCRIPTION_INFO=yes # 是否使用本地订阅信息 - USE_LOCAL_PCC_RULES=yes # 是否使用本地PCC规则 - USE_FQDN_DNS=yes # 是否使用FQDN格式的DNS查询 - DNN_NI0=default # DNN的网络标识符 - TYPE0=IPv4 # DNN的地址类型 - DNN_RANGE0=12.2.1.2 - 12.2.1.128 # DNN的地址范围 - NSSAI_SST0=128 #定义网络切片标识符 - NSSAI_SD0=128 - SESSION_AMBR_UL0=50Mbps ##定义最大上下行带宽,限制了接入此网络UE的最大速率 - SESSION_AMBR_DL0=100Mbps depends_on: - oai_amf - oai_nrf_slice12 networks: public_net: ipv4_address: 192.168.70.139
oai_smf_slice2: container_name: oai-smf-slice2 image: oaisoftwarealliance/oai-smf:develop environment: - TZ=Europe/Paris - INSTANCE=0 - PID_DIRECTORY=/var/run - SMF_INTERFACE_NAME_FOR_N4=eth0 - SMF_INTERFACE_NAME_FOR_SBI=eth0 - SMF_INTERFACE_PORT_FOR_SBI=80 - SMF_INTERFACE_HTTP2_PORT_FOR_SBI=8080 - SMF_API_VERSION=v1 - DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100 - DEFAULT_DNS_SEC_IPV4_ADDRESS=8.8.8.8 - AMF_IPV4_ADDRESS=192.168.70.138 - AMF_PORT=80 - AMF_API_VERSION=v1 - AMF_FQDN=oai_amf - UDM_IPV4_ADDRESS=192.168.70.134 - UDM_PORT=80 - UDM_API_VERSION=v2 - UDM_FQDN=localhost - UPF_IPV4_ADDRESS=0.0.0.0 - UPF_FQDN_0=localhost - NRF_IPV4_ADDRESS=192.168.70.136 - NRF_PORT=80 - NRF_API_VERSION=v1 - NRF_FQDN=oai_nrf_slice12 - REGISTER_NRF=yes - DISCOVER_UPF=yes - DISCOVER_PCF=no - USE_LOCAL_SUBSCRIPTION_INFO=yes - USE_LOCAL_PCC_RULES=yes - USE_FQDN_DNS=yes - DNN_NI0=oai - TYPE0=IPv4 - DNN_RANGE0=12.1.1.129 - 12.1.1.224 - NSSAI_SST0=1 - SESSION_AMBR_UL0=200Mbps - SESSION_AMBR_DL0=400Mbps depends_on: - oai_amf - oai_nrf_slice12 networks: public_net: ipv4_address: 192.168.70.140
与切片1差不多
与切片1差不多
oai_smf_slice3: container_name: oai-smf-slice3 image: oaisoftwarealliance/oai-smf:develop environment: - TZ=Europe/Paris - INSTANCE=0 - PID_DIRECTORY=/var/run - SMF_INTERFACE_NAME_FOR_N4=eth0 - SMF_INTERFACE_NAME_FOR_SBI=eth0 - SMF_INTERFACE_PORT_FOR_SBI=80 - SMF_INTERFACE_HTTP2_PORT_FOR_SBI=8080 - SMF_API_VERSION=v1 - DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100 - DEFAULT_DNS_SEC_IPV4_ADDRESS=8.8.8.8 - AMF_IPV4_ADDRESS=192.168.70.138 - AMF_PORT=80 - AMF_API_VERSION=v1 - AMF_FQDN=oai_amf - UDM_IPV4_ADDRESS=192.168.70.134 - UDM_PORT=80 - UDM_API_VERSION=v2 - UDM_FQDN=localhost - UPF_IPV4_ADDRESS=0.0.0.0 - UPF_FQDN_0=localhost - NRF_IPV4_ADDRESS=192.168.70.137 - NRF_PORT=80 - NRF_API_VERSION=v1 - NRF_FQDN=oai_nrf_slice3 - REGISTER_NRF=yes - DISCOVER_UPF=yes - DISCOVER_PCF=no - USE_LOCAL_SUBSCRIPTION_INFO=yes - USE_LOCAL_PCC_RULES=yes - USE_FQDN_DNS=yes - DNN_NI0=oai.ipv4 - TYPE0=IPv4 - DNN_RANGE0=12.1.1.2 - 12.1.1.128 - NSSAI_SST0=130 - NSSAI_SD0=130 - SESSION_AMBR_UL0=100Mbps - SESSION_AMBR_DL0=200Mbps depends_on: - oai_amf - oai_nrf_slice3 extra_hosts: - "vpp-upf.node.5gcn.mnc95.mcc208.3gppnetwork.org:192.168.70.201" networks: public_net: ipv4_address: 192.168.70.141
项目 | slice1 | slice2 | slice3 | 注释 |
---|---|---|---|---|
container_name | oai_smf_slice1 | oai_smf_slice2 | oai-smf-slice3 | 容器的名称不同的网元运行在不同的容器中需要不同的容器名 |
UDM_FQDN | oai_udm | localhost | localhost | 用于标识所连接的 UDM(User Data Management)服务器的完全限定域名。UDM 是 5G 核心网中的一个网元,负责管理用户数据的存储和检索,因此在配置文件中需要设置其 FQDN(Fully Qualified Domain Name)以便与 smf 建立连接。UDM_FQDN 的值应该与实际配置中所使用的 UDM 服务器的 FQDN 相对应。 UDM_FQDN=localhost表示SMF和UDM运行在同一个主机上,即SMF将请求发送到本地主机上的UDM. 本机只有1个udm其内涵其实一样 |
UPF_IPV4_ADDRESS | 127.0.0.1 | 0.0.0.0 | 0.0.0.0 | 当SMF网元的UPF_IPV4_ADDRESS设置为0.0.0.0时,表示该SMF网元未指定特定的UPF网元,因此它将使用SBI接口从其他SMF网元获取相关信息,并动态选择适当的UPF网元来处理流量。这种配置适用于具有多个UPF网元的大型核心网部署,以实现流量负载均衡和冗余。 当UPF_IPV4_ADDRESS设置为127.0.0.1时,表示UPF运行在同一台机器上,且UPF使用本地回环接口作为其IP地址。这种配置通常用于单机测试环境,因为UPF和SMF运行在同一台机器上,可以直接通过本地回环接口通信,而不需要经过网络。 |
NRF_IPV4_ADDRESS | 192.168.70.136 | 192.168.70.136 | 192.168.70.137 | |
NRF_FQDN | oai_nrf_slice12 | oai_nrf_slice12 | oai_nrf_slice3 | |
DNN_NI0 | default | oai | oai.ipv4 | 用于指定默认数据网络名称(Data Network Name,DNN),以便在分配给UE的EPS session中使用。当DNN_NI0参数设置为"default"时,UE将连接到默认数据网络,并且smf网元将在接收到来自UE的第一个附加请求时为其分配一个默认的EPS session。DNN_NI0 = oai表示使用名为"oai"的数据网络作为默认数据网络。这意味着,如果UE在接入网络时没有指定所需的数据网络,则将自动使用"oai"数据网络。 |
DNN_RANGE0 | 12.2.1.2 - 12.2.1.128 | 12.1.1.129 - 12.1.1.224 | 12.1.1.2 - 12.1.1.128 | |
NSSAI_SST0 | 128 | 1 | 130 | |
NSSAI_SD0 | 128 | 无 | 130 | |
SESSION_AMBR_UL0 | 50Mbps | 200Mbps | 100Mbps | |
SESSION_AMBR_DL0 | 100Mbps | 400Mbps | 200Mbps | |
depends_on | oai_nrf_slice12 | oai_nrf_slice12 | oai_nrf_slice3 | |
extra_hosts | 无 | 无 | “vpp-upf.node.5gcn.mnc95.mcc208.3gppnetwork.org:192.168.70.201” | |
ipv4_address | 192.168.70.139 | 192.168.70.140 | 192.168.70.141 |
oai_spgwu_slice1: # 容器的名称 container_name: oai-spgwu-slice1 # 容器运行时的名称 image: oaisoftwarealliance/oai-spgwu-tiny:develop # 容器使用的镜像 environment: # 容器环境变量 - TZ=Europe/Paris # 设置时区 - PID_DIRECTORY=/var/run # 设置运行时进程 ID 存储路径 - SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0 # 设置与 eNodeB 和 SGW 之间通信的接口名称 - SGW_INTERFACE_NAME_FOR_SX=eth0 # 设置与其他核心网元素之间通信的接口名称 - PGW_INTERFACE_NAME_FOR_SGI=eth0 # 设置 SGW 和 PGW 之间通信的接口名称 - NETWORK_UE_NAT_OPTION=yes # 是否使用 NAT 隐藏 UE 的 IP 地址 - NETWORK_UE_IP=12.2.1.0/24 # UE IP 地址 - BYPASS_UL_PFCP_RULES=no # 是否绕过 UPF 以进行 PFCP 规则处理 - MCC=208 # 移动国家码 - MNC=95 # 移动网络码 - MNC03=095 # 3 位移动网络码 - TAC=40960 # 跟踪区域代码 - GW_ID=1 # 网关 ID - REALM=openairinterface.org # 设定领域名称,通常是机构或组织名称 - ENABLE_5G_FEATURES=yes # 是否启用 5G 功能 - REGISTER_NRF=yes # 是否向 NRF 注册 UPF - USE_FQDN_NRF=yes # 是否使用 NRF 的完全限定域名 - UPF_FQDN_5G=oai_spgwu_slice1 # UPF 的 FQDN - NRF_IPV4_ADDRESS=192.168.70.136 # NRF 的 IP 地址 - NRF_PORT=80 # NRF 的端口号 - NRF_API_VERSION=v1 # NRF 的 API 版本 - NRF_FQDN=oai_nrf_slice12 # NRF 的 FQDN - NSSAI_SST_0=128 # NSSAI 中的 SST - NSSAI_SD_0=128 # NSSAI 中的 SD - DNN_0=default # 默认数据网络名称 depends_on: - oai_nrf_slice12 - oai_smf_slice1 cap_add: - NET_ADMIN - SYS_ADMIN cap_drop: - ALL privileged: true networks: public_net: ipv4_address: 192.168.70.142
与切片1相似
oai_spgwu_slice2: container_name: oai-spgwu-slice2 image: oaisoftwarealliance/oai-spgwu-tiny:develop environment: - TZ=Europe/Paris - PID_DIRECTORY=/var/run - SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0 - SGW_INTERFACE_NAME_FOR_SX=eth0 - PGW_INTERFACE_NAME_FOR_SGI=eth0 - NETWORK_UE_NAT_OPTION=yes - NETWORK_UE_IP=12.1.1.0/24 - BYPASS_UL_PFCP_RULES=no - MCC=208 - MNC=95 - MNC03=095 - TAC=40960 - GW_ID=1 - REALM=openairinterface.org - ENABLE_5G_FEATURES=yes - REGISTER_NRF=yes - USE_FQDN_NRF=yes - UPF_FQDN_5G=oai_spgwu_slice2 - NRF_IPV4_ADDRESS=192.168.70.136 - NRF_PORT=80 - NRF_API_VERSION=v1 - NRF_FQDN=oai_nrf_slice12 - NSSAI_SST_0=1 - DNN_0=oai depends_on: - oai_nrf_slice12 cap_add: - NET_ADMIN - SYS_ADMIN cap_drop: - ALL privileged: true networks: public_net: ipv4_address: 192.168.70.143
项目 | slice1 | slice2 | slice3 | 注释 |
---|---|---|---|---|
NETWORK_UE_IP | 12.2.1.0/24 | 12.1.1.0/24 | 通过指定NETWORK_UE_IP参数,SPGWU就知道了UE的IP地址所在的网络段,从而可以将数据包正确地转发到UE | |
UPF_FQDN_5G | oai_spgwu_slice1 | oai_spgwu_slice2 | ||
NSSAI_SST_0 | 128 | 1 | ||
NSSAI_SD_0 | 128 | 无 | ||
DNN_0 | default | oai | ||
depends_on | oai_smf_slice1 | 无 |
vpp_upf_slice3: image: oaisoftwarealliance/oai-upf-vpp:develop # 使用oai-upf-vpp:develop的Docker映像来创建容器 privileged: true # 给予容器足够的权限 container_name: vpp-upf-slice3 # 容器的名称 environment: # 容器的环境变量列表 - IF_1_IP=192.168.70.201 # 网卡1的IP地址 - IF_1_TYPE=N4 # 网卡1类型为N4 - IF_2_IP=192.168.72.201 # 网卡2的IP地址 - IF_2_TYPE=N3 # 网卡2类型为N3 - IF_2_NWI=access.oai.org # 网卡2的网络接口名称为access.oai.org - IF_3_IP=192.168.73.201 # 网卡3的IP地址 - IF_3_TYPE=N6 # 网卡3类型为N6 - IF_3_IP_REMOTE=192.168.73.145 # EXT-DN IP Address - IF_3_NWI=internet.oai.org # 网卡3的网络接口名称为internet.oai.org - NAME=VPP-UPF # 容器名称 - MNC=95 # 移动网络代码 - MCC=208 # 移动国家代码 - REALM=3gppnetwork.org # realm信息 - VPP_MAIN_CORE=0 # VPP的主要核心数量 - VPP_CORE_WORKER=1 # VPP的工作核心数量 - VPP_PLUGIN_PATH=/usr/lib/x86_64-linux-gnu/vpp_plugins/ # VPP插件所在的路径 - SNSSAI_SD=130 # 切片/服务类型 - SNSSAI_SST=130 # 切片区分代码 - DNN=oai.ipv4 # 默认移动网络名称 - REGISTER_NRF=yes # 是否注册NRF - NRF_IP_ADDR=192.168.70.137 # NRF的IP地址 - NRF_PORT=8080 # NRF的端口 - HTTP_VERSION=2 # 使用HTTP协议的版本 depends_on: - oai_nrf_slice3 # 依赖于oai_nrf_slice3容器 healthcheck: test: /bin/bash -c "pgrep vpp" # 健康检查命令 interval: 10s # 检查间隔时间 timeout: 5s # 超时时间 retries: 5 # 重试次数 networks: # 容器的网络连接配置 public_net: # 容器连接的公共网络 ipv4_address: 192.168.70.144 # IPv4地址 public_net_access: # 容器连接的公共网络中的访问网络 ipv4_address: 192.168.72.144 # IPv4地址 public_net_core: ipv4_address: 192.168.73.144
test: /bin/bash -c "pgrep vpp"
具体而言,pgrep命令用于查找正在运行的进程,并输出进程的ID号。而"/bin/bash -c"则是用于执行一个命令的标准方式。
因此,这个命令的含义是在upf网元上执行一个bash shell,并在该shell中运行pgrep vpp命令,以查找是否有VPP进程正在运行。如果该命令返回了VPP进程的ID号,则说明VPP正在运行,否则说明VPP没有运行或者运行异常。这个命令通常会被用于检查VPP软件是否健康地运行在upf网元上。
VPP(Vector Packet Processing)是一个高性能的数据包处理软件,它在数据中心、边缘网关和SDN等场景中广泛应用。由于VPP是一种强大的软件,它可能会与其他软件或系统产生冲突,导致一些问题。
以下是一些可能导致VPP互相冲突的因素:
网络接口冲突:VPP需要与网络接口进行交互,但如果有其他软件或系统也在使用相同的网络接口,就可能导致冲突。
CPU资源竞争:VPP需要大量的CPU资源来处理网络数据包,但如果有其他应用程序也在竞争相同的CPU资源,就可能会导致性能问题。
内存泄漏:VPP可能会发生内存泄漏的情况,导致系统的内存资源被消耗殆尽,从而导致其他应用程序无法正常运行。
配置文件冲突:如果有多个VPP实例正在运行,它们可能会使用相同的配置文件,从而导致冲突。
为避免这些冲突,可以采取以下措施:
分配独立的网络接口:为每个应用程序分配独立的网络接口,以避免VPP与其他应用程序产生冲突。
管理CPU资源:通过对CPU资源进行管理,避免VPP与其他应用程序产生资源竞争。
定期检查内存使用情况:定期检查VPP的内存使用情况,避免出现内存泄漏的情况。
使用不同的配置文件:为每个VPP实例使用不同的配置文件,以避免配置文件之间产生冲突。
不同的VPP可以使用相同的VPP_PLUGIN_PATH,因为VPP_PLUGIN_PATH是用来指定VPP插件的路径。VPP插件是在独立的共享对象中实现的,所以不同的VPP实例可以使用相同的VPP插件。当不同的VPP实例使用相同的VPP插件路径时,它们将在同一目录下查找VPP插件。但是,不同的VPP实例可能需要不同版本的VPP插件,这时可以通过在不同的目录中放置不同版本的插件来解决。
VPP_MAIN_CORE是VPP(Vector Packet Processing)网络数据平面处理引擎的主要执行核心。在VPP中,可以使用多个CPU核心来执行不同的任务,从而提高性能。要设置VPP_MAIN_CORE的多核处理,你可以通过以下步骤:
请注意,VPP_MAIN_CORE应始终设置为单个CPU核心,因为它负责控制VPP进程的整个生命周期。但是,你可以将其他任务委派给其他CPU核心来提高性能。
如果你要在VPP中使用4个工作线程,则可以将“core-workers”设置为“4”。 当VPP启动时,它会自动分配指定数量的工作线程,并将数据包分配给这些线程以进行处理。请注意,此设置取决于系统硬件和网络负载等因素,应该进行测试以确定最佳设置。
REALM是UPF的一个参数,它指定了UPF所属的领域(Realm)。
在通信网络中,领域是指一个或多个网络设备(如路由器、交换机、网关等)和/或网络服务的集合,这些设备和服务彼此相连,并且受到特定的安全策略和管理规则的约束。UPF所属的领域(Realm)决定了UPF对用户数据的访问权限以及UPF与其他网络设备和服务之间的通信方式。
REALM参数的值是一个字符串,用于指定UPF所属的领域。在OAI核心网中,UPF可以属于多个领域,每个领域都有一个唯一的REALM参数值。当UPF接收到用户数据时,它会根据REALM参数的值来确定用户的访问权限,以及将数据转发到哪些其他网络设备和服务。
需要注意的是,UPF所属的领域必须与其他网络设备和服务的领域相匹配,以确保UPF能够正常工作并提供正确的服务。在实际应用中,应该根据网络拓扑、安全策略和管理规则来设置REALM参数的值
REALM=3gppnetwork.org是一种常见的UPF REALM参数设置,它表明UPF所属的领域是3GPP网络。3GPP是第三代合作伙伴计划(3rd Generation Partnership Project)的缩写,是一个全球性的标准化组织,负责制定移动通信技术的标准。3GPP网络是基于3GPP标准的移动通信网络,包括2G、3G、4G和5G等多个移动通信技术。
除了3gppnetwork.org之外,REALM参数还可以设置为其他的值,具体取决于UPF所属的领域或运营商的要求。
下面是一些常见的REALM参数取值:
REALM=ims.mnc001.mcc001.3gppnetwork.org:表示UPF所属的领域是IMS(IP Multimedia Subsystem)领域,运营商的MCC(Mobile Country Code)为001,MNC(Mobile Network Code)为001。
REALM=epc.mnc001.mcc001.3gppnetwork.org:表示UPF所属的领域是EPC(Evolved Packet Core)领域,运营商的MCC为001,MNC为001。
REALM=example.com:表示UPF所属的领域是一个自定义的领域,其名称为example.com。
DNN指定了数据网络名称(Data Network Name),也就是UPF要为其提供数据传输服务的网络的名称。
除了默认值default之外,DNN参数还可以设置为其他的值,具体取决于要连接的数据网络的名称。
下面是一些常见的DNN参数取值:
DNN=internet:表示要连接到的数据网络的名称是internet。
DNN=private_network:表示要连接到的数据网络的名称是private_network。
DNN=vpn_network:表示要连接到的数据网络的名称是vpn_network。
VPP_PLUGIN_PATH参数的意义是指定UPF所使用的VPP插件的路径。VPP插件是一些预编译的共享对象文件,可以提供特定的功能或服务,如IPSec加密、流量统计、负载均衡等。VPP插件可以通过VPP_PLUGIN_PATH参数来指定其所在的路径。
UPF使用的VPP插件取决于UPF的配置和需要提供的功能。例如,如果UPF需要提供IPSec加密服务,则需要加载IPSec插件。如果UPF需要进行流量统计,则需要加载流量统计插件。
需要注意的是,如果UPF所使用的VPP插件不存在于VPP_PLUGIN_PATH指定的路径中,UPF将无法正常工作。因此,在实际应用中,应该根据UPF的需求来设置VPP_PLUGIN_PATH参数,并确保所需的VPP插件已经安装并位于VPP_PLUGIN_PATH指定的路径中。
IF_2_NWI是UPF的一个参数,它指定了UPF连接到的下行网络接口(Network Interface)的标识符。
IF_2_NWI=access.oai.org是一种常见的UPF IF_2_NWI参数设置,它表明UPF连接到的下行网络接口是access.oai.org。access.oai.org是一个虚拟的网络接口标识符,通常用于表示UPF连接到的下行网络接口是一个外部网络接口,如互联网接口或公共移动通信网络接口。
在OAI核心网中,UPF连接到的下行网络接口的标识符必须与其他网络设备和服务的标识符相匹配,以确保UPF能够正常工作并提供正确的服务。在实际应用中,应该根据网络拓扑、安全策略和管理规则来设置IF_2_NWI参数的值。如果UPF连接到的下行网络接口是一个外部网络接口,那么IF_2_NWI=access.oai.org可能是一个合适的选择。
除了access.oai.org之外,在OAI核心网中,IF_2_NWI参数还可以设置为其他的值,具体取决于UPF连接的下行网络接口的类型和标识符。
下面是一些常见的IF_2_NWI参数取值:
IF_2_NWI=eth0:表示UPF连接到的下行网络接口是一个以太网接口,其标识符为eth0。
IF_2_NWI=enp2s0:表示UPF连接到的下行网络接口是一个以太网接口,其标识符为enp2s0。
IF_2_NWI=eth0.100:表示UPF连接到的下行网络接口是一个以太网接口的子接口,其标识符为eth0.100。
IF_2_NWI=wlan0:表示UPF连接到的下行网络接口是一个无线网络接口,其标识符为wlan0。
IF_2_NWI=ppp0:表示UPF连接到的下行网络接口是一个PPP接口,其标识符为ppp0。
在实际应用中,应该根据UPF连接的下行网络接口的实际情况来选择合适的IF_2_NWI参数取值。
oai_ext_dn: # 定义容器名称 image: oaisoftwarealliance/trf-gen-cn5g:latest # 容器镜像名称及版本号 privileged: true # 分配特权级 init: true # 初始化 container_name: oai-ext-dn # 容器名称 entrypoint: /bin/bash -c \ # 进入容器后执行的命令 "iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\ # 在nat表中添加POSTROUTING规则 "ip route add 12.2.1.2/32 via 192.168.70.142 dev eth0;"\ # 添加路由表规则,将12.2.1.2/32路由到192.168.70.142,使用eth0 "ip route add 12.1.1.129/32 via 192.168.70.143 dev eth0;"\ # 添加路由表规则,将12.1.1.129/32路由到192.168.70.143,使用eth0 "ip route add 12.1.1.2/32 via 192.168.73.201 dev eth1; ip route; sleep infinity" # 添加路由表规则,将12.1.1.2/32路由到192.168.73.201,使用eth1,输出路由表并休眠 command: ["/bin/bash", "-c", "trap : SIGTERM SIGINT; sleep infinity & wait"] # 容器启动后执行的命令,使用trap命令捕获SIGTERM和SIGINT信号,然后休眠 healthcheck: # 容器健康检查配置 test: /bin/bash -c "iptables -L -t nat | grep MASQUERADE" # 检查iptables是否包含MASQUERADE规则 interval: 10s # 每10秒运行一次健康检查 timeout: 5s # 健康检查超时时间为5秒 retries: 10 # 健康检查失败后最多重试10次 networks: # 容器网络配置 public_net: # 容器所在网络名称 ipv4_address: 192.168.70.145 # 容器IP地址 public_net_core: # 容器所在网络名称 ipv4_address: 192.168.73.145 # 容器IP地址
# 定义三个网络,分别为 public_net、public_net_access、public_net_core networks: public_net: driver: bridge name: demo-oai-public-net ipam: config: - subnet: 192.168.70.0/24 driver_opts: com.docker.network.bridge.name: "demo-oai" public_net_access: name: oai-public-access ipam: config: - subnet: 192.168.72.0/24 driver_opts: com.docker.network.bridge.name: "cn5g-access" public_net_core: name: oai-public-core ipam: config: - subnet: 192.168.73.0/24 driver_opts: com.docker.network.bridge.name: "cn5g-core"
ueransim: container_name: ueransim # 容器名称 image: ueransim:latest # 使用的镜像名称和版本 privileged: true # 是否开启特权模式 environment: # 环境变量配置 # GNB配置参数 - MCC=208 # 移动国家代码 - MNC=95 # 移动网络代码 - NCI=0x000000010 # 信令电文CI字段,基站识别标识 - TAC=0xa000 # 针对GSM和UMTS的跟踪区代码(TAC) - LINK_IP=192.168.70.152 # UE和eNodeB之间链路的IP地址 - NGAP_IP=192.168.70.152 # N1口的IP地址,即gNB与AMF之间的IP地址 - GTP_IP=192.168.70.152 # N2口的IP地址,即gNB与UPF之间的IP地址 - NGAP_PEER_IP=192.168.70.138 # AMF的IP地址 - SST=128 # gNB支持的服务类型 - SD=128 # gNB支持的服务数据 - SST_0=128 # 针对NSSAI 0的服务类型 - SD_0=128 # 针对NSSAI 0的服务数据 - SST_1=1 # 针对NSSAI 1的服务类型 - SD_1=0 # 针对NSSAI 1的服务数据 - SST_2=131 # 针对NSSAI 2的服务类型 - SD_2=131 # 针对NSSAI 2的服务数据 - IGNORE_STREAM_IDS=true # 忽略NGAP中的流ID,仅用于测试目的 # UE配置参数 - NUMBER_OF_UE=1 # UE数量 - IMSI=208950000000035 # 国际移动用户标识 - KEY=0C0A34601D4F07677303652C0462535B # 鉴别和加密算法使用的密钥 - OP=63bfa50ee6523365ff14c1f45f88737d # 运营者私有算法(OP)值 - OP_TYPE=OPC # 运营者私有算法类型 - AMF_VALUE=8000 # AMF的值 - IMEI=356938035643803 # 国际移动设备身份 - IMEI_SV=0035609204079514 # 手机软件版本号 - GNB_IP_ADDRESS=192.168.70.152 # gNB的IP地址 - PDU_TYPE=IPv4 # 用户面协议数据单元类型 - APN=default # 接入点名称 - SST_R=128 # UE请求的N-SSAI服务类型 - SD_R=128 # UE请求的N-SSAI服务数据 - SST_C=128 - SD_C=128 - SST_D=128 - SD_D=128 networks: public_net: ipv4_address: 192.168.70.152 healthcheck: test: /bin/bash -c "ifconfig uesimtun0" interval: 10s timeout: 5s retries: 5
oai-gnb: image: oaisoftwarealliance/oai-gnb:develop # GN对应的Docker镜像 privileged: true # Docker容器以特权模式运行,允许容器内进程获得更多特权 container_name: rfsim5g-oai-gnb # Docker容器的名称 environment: # 定义容器内环境变量 RFSIMULATOR: server # 信道仿真器的类型,这里为Server USE_SA_TDD_MONO: 'yes' # 使用单工作时段TDD模式 GNB_NAME: gnb-rfsim # gNB的名称 TAC: 40960 # 本地区域码 MCC: '208' # 移动国家代码 MNC: '95' # 移动网络代码 MNC_LENGTH: 2 # 移动网络代码的长度 NSSAI_SST: 1 # 希望连接的服务类型 AMF_IP_ADDRESS: 192.168.70.138 # AMF的IP地址 GNB_NGA_IF_NAME: eth0 # NGA接口名称 GNB_NGA_IP_ADDRESS: 192.168.70.153 # NGA接口IP地址 GNB_NGU_IF_NAME: eth0 # NGU接口名称 GNB_NGU_IP_ADDRESS: 192.168.70.153 # NGU接口IP地址 SDR_ADDRS: serial=XXXXXXX # 软件定义无线电(SDR)的串行端口地址 USE_ADDITIONAL_OPTIONS: --sa -E --rfsim --log_config.global_log_options level,nocolor,time # 附加选项,用于运行gNB程序 networks: # 容器连接的网络配置 public_net: # 容器连接的公共网络 ipv4_address: 192.168.70.153 # gNB IP地址 healthcheck: # 容器的健康检查配置 test: /bin/bash -c "pgrep nr-softmodem" # 检查nr-softmodem进程是否在运行 interval: 10s # 检查间隔时间 timeout: 5s # 检查超时时间 retries: 5 # 检查失败后的重试次数
oai-nr-ue1: image: oaisoftwarealliance/oai-nr-ue:develop # 使用的 Docker 镜像 privileged: true # 是否特权模式,true 代表是 container_name: rfsim5g-oai-nr-ue1 # 容器名称 environment: RFSIMULATOR: 192.168.70.153 # RF模拟器的IP地址 FULL_IMSI: '208950000000036' # UE的IMSI码 FULL_KEY: '0C0A34601D4F07677303652C0462535B' # UE的密钥 OPC: '63bfa50ee6523365ff14c1f45f88737d' # UE的OPC码 DNN: oai # UE的数据网络名称 NSSAI_SST: 1 # 请求N-SSAI的SST(用于网络切片) USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 -C 3619200000 --nokrnmod --log_config.global_log_options level,nocolor,time # UE的附加选项 depends_on: - oai-gnb # 依赖于 oai-gnb 容器 networks: public_net: ipv4_address: 192.168.70.154 # UE的IP地址 healthcheck: test: /bin/bash -c "pgrep nr-uesoftmodem" # 容器健康检查的命令 interval: 10s # 容器健康检查的间隔时间 timeout: 5s # 容器健康检查的超时时间 retries: 5 # 容器健康检查的重试次数
gnbsim: container_name: gnbsim # 容器名称 image: gnbsim:latest # 容器镜像 privileged: true # 特权模式 environment: # 环境变量 - MCC=208 # 移动国家码 - MNC=95 # 移动网络码 - GNBID=5 # 基站ID - TAC=0x00a000 # 跟踪区域码 - SST=130 # 安全分区 - SD=000082 # 服务域 - PagingDRX=v32 # 页面DRX值 - RANUENGAPID=0 # RAN UE NGAP ID - IMEISV=35609204079514 # 终端设备识别码 - MSIN=0000000037 # 移动用户识别码 - RoutingIndicator=1234 # 路由指示器 - ProtectionScheme=null # 保护方案 - KEY=0C0A34601D4F07677303652C0462535B # 鉴权密钥 - OPc=63bfa50ee6523365ff14c1f45f88737d # OPc - DNN=oai.ipv4 # 数据网络名称 - URL=http://www.asnt.org:8080/ # URL - NRCellID=1 # NR小区ID - USE_FQDN=no # 是否使用全限定域名 - NGAPPeerAddr=192.168.70.138 # NGAP Peer地址 - GTPuLocalAddr=192.168.72.156 # GTPu本地地址 - GTPuIFname=eth0 # GTPu接口名称 networks: # 网络配置 public_net: # 公共网络 ipv4_address: 192.168.70.156 # IPv4地址 public_net_access: # 公共网络访问 ipv4_address: 192.168.72.156 # IPv4地址 healthcheck: # 健康检查 test: /bin/bash -c "ip address show dev gtp-gnb" interval: 10s # 每10秒检查一次 timeout: 5s # 超时时间为5秒 retries: 5 # 重试次数为5次 networks: # 网络配置 public_net: # 公共网络 external: # 使用外部定义的网络 name: demo-oai-public-net public_net_access: # 公共网络访问 external: # 使用外部定义的网络 name: oai-public-access
硬件:
Window10系统主机一台: 32GB RAM 4CPU (RAM其实不需要这么多, 我的CPU是4CPU*4核)
软件:
VMware Workstation 16 Pro (version:16.2.3 build-19376536)
Ubuntu (version:18.04.4)
其中tshark与wireshark是用来抓包的,开始不一定需要安装
本部署流程复现了OAI例程
略
新建Ubuntu虚拟机
根据自己的环境选择核心的安装位置
根据机器实际情况选择合适的CPU数量与核心数:
最好不要少于官方推荐数量
为虚拟机分配合适的RAM:
最好不要少于官方推荐值
选择合适的虚拟机存储空间大小:
由于之前20G用了一段时间就没有内存了。我选择了40G。不过可以选择20G即使没有内存也可以再扩展。
点击自定义硬件,选择Ubuntu 18.04.4.iso镜像文件用于安装操作系统:
开启创建的Ubuntu并进行安装
什么都不安装,节约安装时间
设置合适的用户名和密码:
等待吧:
安装完成
安装此工具可以让你自由的再Window是与Ubuntu中拖拽文件与复制粘贴
#删除之前的vmtools
sudo apt-get autoremove open-vm-tools
#安装,所有步骤都按enter保持默认设置
sudo apt-get install open-vm-tools
sudo apt-get install open-vm-tools-desktop
打开设置
点击地域与语言
点击Manage Install Language
点击Install/Remove Language
找到 Chinese(simplified)点击勾勾 然后点击apply
然后会下载一会
点击输入源(source)下面的+
点击汉语
点击想要的输入法,点击添加
可以看到任务栏出现的图标
1. 卸载旧版本Docker
#卸载旧版本docker
sudo apt-get remove docker docker-engine docker-ce docker.io
#清空旧版docker占用的内存
sudo apt-get remove --auto-remove docker
#更新系统源
sudo apt-get update
2.配置安装环境
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
3. 添加阿里云的docker GPG密钥
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
4. 添加阿里镜像源
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
#更新
sudo apt-get update
5. 查看有哪些版本
apt-cache madison docker-ce
6. 安装最新版/指定版本
#安装最新版
sudo apt-get install -y docker-ce
#安装5:19.03.6~3-0~ubuntu-bionic版
sudo apt-get install -y docker-ce=5:19.03.6~3-0~ubuntu-bionic
7. 重启Docker
sudo service docker restart
#或者
sudo systemctl restart docker
8. 查看Docke版本
sudo docker version
9. 运行hello-world验证docker-ce是否安装成功
sudo docker run hello-world
#国外
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#国内
curl -L https://get.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose version
-如果安装错误可卸载重装
sudo rm /usr/local/bin/docker-compose
从docker hub上下载所需版本的镜像,分为两个步骤:设置从docker hub下载环境 ,下载镜像
oai-network-slicing@oainetworkslicing-virtual-machine:~$ sudo usermod -aG docker ${USER}
oai-network-slicing@oainetworkslicing-virtual-machine:~$ sudo docker login
docker logout
注意:此步骤不是必须的,因为即使不下载镜像,在使用docker-compose启动时会自动下载缺少的镜像
$ docker pull ubuntu:bionic
$ docker pull mysql:8.0
#!/bin/bash
sudo docker pull oaisoftwarealliance/oai-amf:v1.5.0
sudo docker pull oaisoftwarealliance/oai-nrf:v1.5.0
sudo docker pull oaisoftwarealliance/oai-spgwu-tiny:v1.5.0
sudo docker pull oaisoftwarealliance/oai-smf:v1.5.0
sudo docker pull oaisoftwarealliance/oai-udr:v1.5.0
sudo docker pull oaisoftwarealliance/oai-udm:v1.5.0
sudo docker pull oaisoftwarealliance/oai-ausf:v1.5.0
sudo docker pull oaisoftwarealliance/oai-nssf:v1.5.0
sudo docker pull oaisoftwarealliance/oai-upf-vpp:v1.5.0
git clone --branch v1.5.0 https://gitlab.eurecom.fr/oai/cn5g/oai-cn5g-fed.git
-进行一些检测与同步
oai-network-slicing@oainetworkslicing-virtual-machine:~$ cd oai-cn5g-fed/ oai-network-slicing@oainetworkslicing-virtual-machine:~/oai-cn5g-fed$ git checkout -f v1.5.0 oai-network-slicing@oainetworkslicing-virtual-machine:~/oai-cn5g-fed$ ./scripts/syncComponents.sh --------------------------------------------------------- OAI-NRF component branch : master OAI-AMF component branch : master OAI-SMF component branch : master OAI-SPGW-U component branch : master OAI-AUSF component branch : master OAI-UDM component branch : master OAI-UDR component branch : master OAI-UPF-VPP component branch : master OAI-NSSF component branch : master OAI-NEF component branch : master OAI-PCF component branch : master --------------------------------------------------------- git submodule deinit --all --force git submodule init git submodule update --init --recursive
mkdir -p /tmp/oai/slicing-with-nssf
chmod 777 /tmp/oai/slicing-with-nssf
#进入指定文件夹
cd oai-cn5g-fed/
cd docker-compose/
#启动核心网
sudo docker-compose -f docker-compose-slicing-basic-nrf.yaml up -d
我手动下载了部分镜像,如下图所示,未下载的部分镜像在使用docker-compose启动时自动进行了下载
#查看容器状态
docker ps
sudo docker pull rohankharade/gnbsim:latest
sudo docker pull rohankharade/ueransim:latest
sudo docker pull oaisoftwarealliance/oai-gnb:develop
sudo docker pull oaisoftwarealliance/oai-nr-ue:develop
sudo docker image tag rohankharade/gnbsim:latest gnbsim:latest
sudo docker image tag rohankharade/ueransim:latest ueransim:latest
sudo docker-compose -f docker-compose-slicing-ransim.yaml up -d ueransim
sudo docker-compose -f docker-compose-slicing-ransim.yaml up -d oai-gnb oai-nr-ue1
sudo docker-compose -f docker-compose-slicing-ransim.yaml up -d gnbsim
sudo docker logs oai-amf
查看gnbsim的信息
docker logs gnbsim 2>&1 | tail -10
#查看amf信息获取接入状态
sudo docker logs oai-amf 2>&1 | tail -20
sudo docker exec oai-ext-dn ping -c 4 12.1.1.2
sudo docker exec oai-ext-dn ping -c 4 12.1.1.129
sudo docker logs oai-amf > /tmp/oai/slicing-with-nssf/amf.log 2>&1 sudo docker logs oai-ausf > /tmp/oai/slicing-with-nssf/ausf.log 2>&1 sudo docker logs oai-nssf > /tmp/oai/slicing-with-nssf/nssf.log 2>&1 sudo docker logs oai-udm > /tmp/oai/slicing-with-nssf/udm.log 2>&1 sudo docker logs oai-udr > /tmp/oai/slicing-with-nssf/udr.log 2>&1 sudo docker logs oai-nrf-slice12 > /tmp/oai/slicing-with-nssf/nrf-slice12.log 2>&1 sudo docker logs oai-nrf-slice3 > /tmp/oai/slicing-with-nssf/nrf-slice3.log 2>&1 sudo docker logs oai-smf-slice1 > /tmp/oai/slicing-with-nssf/smf-slice1.log 2>&1 sudo docker logs oai-smf-slice2 > /tmp/oai/slicing-with-nssf/smf-slice2.log 2>&1 sudo docker logs oai-smf-slice3 > /tmp/oai/slicing-with-nssf/smf-slice3.log 2>&1 sudo docker logs oai-spgwu-slice1 > /tmp/oai/slicing-with-nssf/spgwu-slice1.log 2>&1 sudo docker logs oai-spgwu-slice2 > /tmp/oai/slicing-with-nssf/spgwu-slice2.log 2>&1 sudo docker logs vpp-upf-slice3 > /tmp/oai/slicing-with-nssf/vpp-upf-slice3.log 2>&1 sudo docker logs gnbsim > /tmp/oai/slicing-with-nssf/gnbsim.log 2>&1 sudo docker logs rfsim5g-oai-gnb > /tmp/oai/slicing-with-nssf/rfsim5g-oai-gnb.log 2>&1 sudo docker logs rfsim5g-oai-nr-ue1 > /tmp/oai/slicing-with-nssf/rfsim5g-oai-nr-ue1.log 2>&1 sudo docker logs ueransim > /tmp/oai/slicing-with-nssf/ueransim.log 2>&1
sudo docker-compose -f docker-compose-slicing-ransim.yaml down -t 0
sudo docker-compose -f docker-compose-slicing-basic-nrf.yaml down -t 0
无
成功部署了官方例程
成功部署了官方例程
参考文献1:OAISA5G网络切片部署官方文件:oai-cn5g-fed/docs/DEPLOY_SA5G_SLICING.md
参考文献2:OAI 基础核心网部署:oai-cn5g-fed/docs/DEPLOY_SA5G_BASIC_DEPLOYMENT.md
参考文献3:Ubuntu 18.04.4 LTS 下载地址
version: '3.8' services: mysql: container_name: mysql image: mysql:8.0 volumes: - ./database/oai_db2.sql:/docker-entrypoint-initdb.d/oai_db.sql - ./healthscripts/mysql-healthcheck2.sh:/tmp/mysql-healthcheck.sh environment: - TZ=Europe/Paris - MYSQL_DATABASE=oai_db - MYSQL_USER=test - MYSQL_PASSWORD=test - MYSQL_ROOT_PASSWORD=linux healthcheck: test: /bin/bash -c "/tmp/mysql-healthcheck.sh" interval: 10s timeout: 5s retries: 30 networks: public_net: ipv4_address: 192.168.70.131 oai-nssf: container_name: "oai-nssf" image: oaisoftwarealliance/oai-nssf:v1.5.0 environment: - INSTANCE=0 - TZ=Europe/Paris - PID_DIRECTORY=/var/run - NSSF_NAME=oai-nssf - NSSF_FQDN=nssf.oai-5gcn.eur - SBI_IF_NAME=eth0 - SBI_PORT=80 - SBI_API_VERSION=v1 - SBI_PORT_HTTP1=80 - SBI_PORT_HTTP2=8080 - NSSF_SLICE_CONFIG=/openair-nssf/etc/nssf_slice_config.yaml cap_add: - NET_ADMIN - SYS_ADMIN cap_drop: - ALL privileged: true volumes: - ./nssf_slice_config.yaml:/openair-nssf/etc/nssf_slice_config.yaml networks: public_net: ipv4_address: 192.168.70.132 oai_udr: container_name: oai-udr image: oaisoftwarealliance/oai-udr:v1.5.0 environment: - TZ=Europe/Paris - INSTANCE=0 - PID_DIRECTORY=/var/run - UDR_INTERFACE_NAME_FOR_NUDR=eth0 - UDR_INTERFACE_PORT_FOR_NUDR=80 - UDR_INTERFACE_HTTP2_PORT_FOR_NUDR=8080 - UDR_API_VERSION=v1 - MYSQL_IPV4_ADDRESS=192.168.70.131 - MYSQL_USER=test - MYSQL_PASS=test - MYSQL_DB=oai_db - WAIT_MYSQL=120 depends_on: - mysql networks: public_net: ipv4_address: 192.168.70.133 oai_udm: container_name: oai-udm image: oaisoftwarealliance/oai-udm:v1.5.0 environment: - TZ=Europe/Paris - INSTANCE=0 - PID_DIRECTORY=/var/run - UDM_NAME=OAI_UDM - SBI_IF_NAME=eth0 - SBI_PORT=80 - UDM_VERSION_NB=v1 - USE_FQDN_DNS=yes - UDR_IP_ADDRESS=192.168.70.133 - UDR_PORT=80 - UDR_VERSION_NB=v1 - UDR_FQDN=oai_udr depends_on: - oai_udr networks: public_net: ipv4_address: 192.168.70.134 oai_ausf: container_name: oai-ausf image: oaisoftwarealliance/oai-ausf:v1.5.0 environment: - TZ=Europe/Paris - INSTANCE_ID=0 - PID_DIR=/var/run - AUSF_NAME=OAI_AUSF - SBI_IF_NAME=eth0 - SBI_PORT=80 - USE_FQDN_DNS=yes - UDM_IP_ADDRESS=192.168.70.134 - UDM_PORT=80 - UDM_VERSION_NB=v1 - UDM_FQDN=oai_udm depends_on: - oai_udm networks: public_net: ipv4_address: 192.168.70.135 oai_nrf_slice12: container_name: oai-nrf-slice12 image: oaisoftwarealliance/oai-nrf:v1.5.0 environment: - NRF_INTERFACE_NAME_FOR_SBI=eth0 - NRF_INTERFACE_PORT_FOR_SBI=80 - NRF_INTERFACE_HTTP2_PORT_FOR_SBI=8080 - NRF_API_VERSION=v1 - INSTANCE=0 - PID_DIRECTORY=/var/run networks: public_net: ipv4_address: 192.168.70.136 oai_nrf_slice3: container_name: oai-nrf-slice3 image: oaisoftwarealliance/oai-nrf:v1.5.0 environment: - NRF_INTERFACE_NAME_FOR_SBI=eth0 - NRF_INTERFACE_PORT_FOR_SBI=80 - NRF_INTERFACE_HTTP2_PORT_FOR_SBI=8080 - NRF_API_VERSION=v1 - INSTANCE=0 - PID_DIRECTORY=/var/run networks: public_net: ipv4_address: 192.168.70.137 oai_amf: container_name: oai-amf image: oaisoftwarealliance/oai-amf:v1.5.0 environment: - TZ=Europe/paris - INSTANCE=0 - PID_DIRECTORY=/var/run - MCC=208 - MNC=95 - REGION_ID=128 - AMF_SET_ID=1 - SERVED_GUAMI_MCC_0=208 - SERVED_GUAMI_MNC_0=95 - SERVED_GUAMI_REGION_ID_0=128 - SERVED_GUAMI_AMF_SET_ID_0=1 - SERVED_GUAMI_MCC_1=460 - SERVED_GUAMI_MNC_1=11 - SERVED_GUAMI_REGION_ID_1=10 - SERVED_GUAMI_AMF_SET_ID_1=1 - PLMN_SUPPORT_MCC=208 - PLMN_SUPPORT_MNC=95 - PLMN_SUPPORT_TAC=0xa000 - SST_0=128 - SD_0=128 - SST_1=1 - SD_1=0xFFFFFF - SST_2=130 - SD_2=130 - AMF_INTERFACE_NAME_FOR_NGAP=eth0 - AMF_INTERFACE_NAME_FOR_N11=eth0 - SMF_INSTANCE_ID_0=1 - SMF_FQDN_0=oai_smf_slice1 - SMF_IPV4_ADDR_0=0.0.0.0 - SMF_HTTP_VERSION_0=v1 - SELECTED_0=true - SMF_INSTANCE_ID_1=2 - SMF_FQDN_1=oai_smf_slice2 - SMF_IPV4_ADDR_1=0.0.0.0 - SMF_HTTP_VERSION_1=v1 - SELECTED_1=false - MYSQL_SERVER=192.168.70.131 - MYSQL_USER=root - MYSQL_PASS=linux - MYSQL_DB=oai_db - OPERATOR_KEY=63bfa50ee6523365ff14c1f45f88737d - NRF_IPV4_ADDRESS=0.0.0.0 - NRF_PORT=80 - EXTERNAL_NRF=no - NF_REGISTRATION=no - SMF_SELECTION=yes - USE_FQDN_DNS=yes - EXTERNAL_AUSF=yes - NRF_API_VERSION=v1 - NRF_FQDN=oai_nrf_slice12 - AUSF_IPV4_ADDRESS=192.168.70.135 - AUSF_PORT=80 - AUSF_API_VERSION=v1 - AUSF_FQDN=oai_ausf - UDM_IPV4_ADDRESS=192.168.70.134 - UDM_PORT=80 - UDM_API_VERSION=v2 - UDM_FQDN=oai_udm - NRF_SELECTION=yes - EXTERNAL_NSSF=yes - NSSF_IPV4_ADDRESS=192.168.70.132 - NSSF_PORT=80 - NSSF_API_VERSION=v1 - NSSF_FQDN=oai-nssf - USE_HTTP2=no - INT_ALGO_LIST=["NIA1" , "NIA2"] - CIPH_ALGO_LIST=["NEA1" , "NEA2"] depends_on: - mysql - oai_nrf_slice12 - vpp_upf_slice3 - oai_ausf networks: public_net: ipv4_address: 192.168.70.138 oai_smf_slice1: container_name: oai-smf-slice1 image: oaisoftwarealliance/oai-smf:v1.5.0 environment: - TZ=Europe/Paris - INSTANCE=0 - PID_DIRECTORY=/var/run - SMF_INTERFACE_NAME_FOR_N4=eth0 - SMF_INTERFACE_NAME_FOR_SBI=eth0 - SMF_INTERFACE_PORT_FOR_SBI=80 - SMF_INTERFACE_HTTP2_PORT_FOR_SBI=8080 - SMF_API_VERSION=v1 - DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100 - DEFAULT_DNS_SEC_IPV4_ADDRESS=8.8.8.8 - AMF_IPV4_ADDRESS=192.168.70.138 - AMF_PORT=80 - AMF_API_VERSION=v1 - AMF_FQDN=oai_amf - UDM_IPV4_ADDRESS=192.168.70.134 - UDM_PORT=80 - UDM_API_VERSION=v2 - UDM_FQDN=oai_udm - UPF_IPV4_ADDRESS=127.0.0.1 - UPF_FQDN_0=localhost - NRF_IPV4_ADDRESS=192.168.70.136 - NRF_PORT=80 - NRF_API_VERSION=v1 - NRF_FQDN=oai_nrf_slice12 - REGISTER_NRF=yes - DISCOVER_UPF=yes - DISCOVER_PCF=no - USE_LOCAL_SUBSCRIPTION_INFO=yes - USE_LOCAL_PCC_RULES=yes - USE_FQDN_DNS=yes - DNN_NI0=default - TYPE0=IPv4 - DNN_RANGE0=12.2.1.2 - 12.2.1.128 - NSSAI_SST0=128 - NSSAI_SD0=128 - SESSION_AMBR_UL0=50Mbps - SESSION_AMBR_DL0=100Mbps depends_on: - oai_amf - oai_nrf_slice12 networks: public_net: ipv4_address: 192.168.70.139 oai_smf_slice2: container_name: oai-smf-slice2 image: oaisoftwarealliance/oai-smf:v1.5.0 environment: - TZ=Europe/Paris - INSTANCE=0 - PID_DIRECTORY=/var/run - SMF_INTERFACE_NAME_FOR_N4=eth0 - SMF_INTERFACE_NAME_FOR_SBI=eth0 - SMF_INTERFACE_PORT_FOR_SBI=80 - SMF_INTERFACE_HTTP2_PORT_FOR_SBI=8080 - SMF_API_VERSION=v1 - DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100 - DEFAULT_DNS_SEC_IPV4_ADDRESS=8.8.8.8 - AMF_IPV4_ADDRESS=192.168.70.138 - AMF_PORT=80 - AMF_API_VERSION=v1 - AMF_FQDN=oai_amf - UDM_IPV4_ADDRESS=192.168.70.134 - UDM_PORT=80 - UDM_API_VERSION=v2 - UDM_FQDN=localhost - UPF_IPV4_ADDRESS=0.0.0.0 - UPF_FQDN_0=localhost - NRF_IPV4_ADDRESS=192.168.70.136 - NRF_PORT=80 - NRF_API_VERSION=v1 - NRF_FQDN=oai_nrf_slice12 - REGISTER_NRF=yes - DISCOVER_UPF=yes - DISCOVER_PCF=no - USE_LOCAL_SUBSCRIPTION_INFO=yes - USE_LOCAL_PCC_RULES=yes - USE_FQDN_DNS=yes - DNN_NI0=oai - TYPE0=IPv4 - DNN_RANGE0=12.1.1.129 - 12.1.1.224 - NSSAI_SST0=1 - SESSION_AMBR_UL0=200Mbps - SESSION_AMBR_DL0=400Mbps depends_on: - oai_amf - oai_nrf_slice12 networks: public_net: ipv4_address: 192.168.70.140 oai_smf_slice3: container_name: oai-smf-slice3 image: oaisoftwarealliance/oai-smf:v1.5.0 environment: - TZ=Europe/Paris - INSTANCE=0 - PID_DIRECTORY=/var/run - SMF_INTERFACE_NAME_FOR_N4=eth0 - SMF_INTERFACE_NAME_FOR_SBI=eth0 - SMF_INTERFACE_PORT_FOR_SBI=80 - SMF_INTERFACE_HTTP2_PORT_FOR_SBI=8080 - SMF_API_VERSION=v1 - DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100 - DEFAULT_DNS_SEC_IPV4_ADDRESS=8.8.8.8 - AMF_IPV4_ADDRESS=192.168.70.138 - AMF_PORT=80 - AMF_API_VERSION=v1 - AMF_FQDN=oai_amf - UDM_IPV4_ADDRESS=192.168.70.134 - UDM_PORT=80 - UDM_API_VERSION=v2 - UDM_FQDN=localhost - UPF_IPV4_ADDRESS=0.0.0.0 - UPF_FQDN_0=localhost - NRF_IPV4_ADDRESS=192.168.70.137 - NRF_PORT=80 - NRF_API_VERSION=v1 - NRF_FQDN=oai_nrf_slice3 - USE_NETWORK_INSTANCE=yes - REGISTER_NRF=yes - DISCOVER_UPF=yes - DISCOVER_PCF=no - USE_LOCAL_SUBSCRIPTION_INFO=yes - USE_LOCAL_PCC_RULES=yes - USE_FQDN_DNS=yes - DNN_NI0=oai.ipv4 - TYPE0=IPv4 - DNN_RANGE0=12.1.1.2 - 12.1.1.128 - NSSAI_SST0=130 - NSSAI_SD0=130 - SESSION_AMBR_UL0=100Mbps - SESSION_AMBR_DL0=200Mbps depends_on: - oai_amf - oai_nrf_slice3 extra_hosts: - "vpp-upf.node.5gcn.mnc95.mcc208.3gppnetwork.org:192.168.70.201" networks: public_net: ipv4_address: 192.168.70.141 oai_spgwu_slice1: container_name: oai-spgwu-slice1 image: oaisoftwarealliance/oai-spgwu-tiny:v1.5.0 environment: - TZ=Europe/Paris - PID_DIRECTORY=/var/run - SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0 - SGW_INTERFACE_NAME_FOR_SX=eth0 - PGW_INTERFACE_NAME_FOR_SGI=eth0 - NETWORK_UE_NAT_OPTION=yes - NETWORK_UE_IP=12.2.1.0/24 - BYPASS_UL_PFCP_RULES=no - MCC=208 - MNC=95 - MNC03=095 - TAC=40960 - GW_ID=1 - REALM=openairinterface.org - ENABLE_5G_FEATURES=yes - REGISTER_NRF=yes - USE_FQDN_NRF=yes - UPF_FQDN_5G=oai_spgwu_slice1 - NRF_IPV4_ADDRESS=192.168.70.136 - NRF_PORT=80 - NRF_API_VERSION=v1 - NRF_FQDN=oai_nrf_slice12 - NSSAI_SST_0=128 - NSSAI_SD_0=128 - DNN_0=default depends_on: - oai_nrf_slice12 - oai_smf_slice1 cap_add: - NET_ADMIN - SYS_ADMIN cap_drop: - ALL privileged: true networks: public_net: ipv4_address: 192.168.70.142 oai_spgwu_slice2: container_name: oai-spgwu-slice2 image: oaisoftwarealliance/oai-spgwu-tiny:v1.5.0 environment: - TZ=Europe/Paris - PID_DIRECTORY=/var/run - SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0 - SGW_INTERFACE_NAME_FOR_SX=eth0 - PGW_INTERFACE_NAME_FOR_SGI=eth0 - NETWORK_UE_NAT_OPTION=yes - NETWORK_UE_IP=12.1.1.0/24 - BYPASS_UL_PFCP_RULES=no - MCC=208 - MNC=95 - MNC03=095 - TAC=40960 - GW_ID=1 - REALM=openairinterface.org - ENABLE_5G_FEATURES=yes - REGISTER_NRF=yes - USE_FQDN_NRF=yes - UPF_FQDN_5G=oai_spgwu_slice2 - NRF_IPV4_ADDRESS=192.168.70.136 - NRF_PORT=80 - NRF_API_VERSION=v1 - NRF_FQDN=oai_nrf_slice12 - NSSAI_SST_0=1 - DNN_0=oai depends_on: - oai_nrf_slice12 cap_add: - NET_ADMIN - SYS_ADMIN cap_drop: - ALL privileged: true networks: public_net: ipv4_address: 192.168.70.143 vpp_upf_slice3: image: oaisoftwarealliance/oai-upf-vpp:v1.5.0 privileged: true container_name: vpp-upf-slice3 environment: - IF_1_IP=192.168.70.201 - IF_1_TYPE=N4 - IF_2_IP=192.168.72.201 - IF_2_TYPE=N3 - IF_2_NWI=access.oai.org - IF_3_IP=192.168.73.201 - IF_3_TYPE=N6 - IF_3_IP_REMOTE=192.168.73.145 # EXT-DN IP Address - IF_3_NWI=internet.oai.org - NAME=VPP-UPF - MNC=95 - MCC=208 - REALM=3gppnetwork.org - VPP_MAIN_CORE=0 - VPP_CORE_WORKER=1 # - VPP_PLUGIN_PATH=/usr/lib64/vpp_plugins/ # RHEL7 - VPP_PLUGIN_PATH=/usr/lib/x86_64-linux-gnu/vpp_plugins/ - SNSSAI_SD=130 - SNSSAI_SST=130 - DNN=oai.ipv4 - REGISTER_NRF=yes - NRF_IP_ADDR=192.168.70.137 - NRF_PORT=8080 - HTTP_VERSION=2 depends_on: - oai_nrf_slice3 healthcheck: test: /bin/bash -c "pgrep vpp" interval: 10s timeout: 5s retries: 5 networks: public_net: ipv4_address: 192.168.70.144 public_net_access: ipv4_address: 192.168.72.144 public_net_core: ipv4_address: 192.168.73.144 oai_ext_dn: image: oaisoftwarealliance/trf-gen-cn5g:latest privileged: true init: true container_name: oai-ext-dn entrypoint: /bin/bash -c \ "iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\ "ip route add 12.2.1.2/32 via 192.168.70.142 dev eth0;"\ "ip route add 12.1.1.129/32 via 192.168.70.143 dev eth0;"\ "ip route add 12.1.1.2/32 via 192.168.73.201 dev eth1; ip route; sleep infinity" command: ["/bin/bash", "-c", "trap : SIGTERM SIGINT; sleep infinity & wait"] healthcheck: test: /bin/bash -c "iptables -L -t nat | grep MASQUERADE" interval: 10s timeout: 5s retries: 10 networks: public_net: ipv4_address: 192.168.70.145 public_net_core: ipv4_address: 192.168.73.145 networks: public_net: driver: bridge name: demo-oai-public-net ipam: config: - subnet: 192.168.70.0/24 driver_opts: com.docker.network.bridge.name: "demo-oai" public_net_access: name: oai-public-access ipam: config: - subnet: 192.168.72.0/24 driver_opts: com.docker.network.bridge.name: "cn5g-access" public_net_core: name: oai-public-core ipam: config: - subnet: 192.168.73.0/24 driver_opts: com.docker.network.bridge.name: "cn5g-core"
version: '3.8' services: ueransim: container_name: ueransim image: ueransim:latest privileged: true environment: # GNB Congig Parameters - MCC=208 - MNC=95 - NCI=0x000000010 - TAC=0xa000 - LINK_IP=192.168.70.152 - NGAP_IP=192.168.70.152 - GTP_IP=192.168.70.152 - NGAP_PEER_IP=192.168.70.138 - SST=128 - SD=128 - SST_0=128 - SD_0=128 - SST_1=1 - SD_1=0 - SST_2=131 - SD_2=131 - IGNORE_STREAM_IDS=true # UE Config Parameters - NUMBER_OF_UE=1 - IMSI=208950000000035 - KEY=0C0A34601D4F07677303652C0462535B - OP=63bfa50ee6523365ff14c1f45f88737d - OP_TYPE=OPC - AMF_VALUE=8000 - IMEI=356938035643803 - IMEI_SV=0035609204079514 - GNB_IP_ADDRESS=192.168.70.152 - PDU_TYPE=IPv4 - APN=default - SST_R=128 #Requested N-SSAI - SD_R=128 - SST_C=128 - SD_C=128 - SST_D=128 - SD_D=128 networks: public_net: ipv4_address: 192.168.70.152 healthcheck: test: /bin/bash -c "ifconfig uesimtun0" interval: 10s timeout: 5s retries: 5 oai-gnb: image: oaisoftwarealliance/oai-gnb:develop privileged: true container_name: rfsim5g-oai-gnb environment: RFSIMULATOR: server USE_SA_TDD_MONO: 'yes' GNB_NAME: gnb-rfsim TAC: 40960 MCC: '208' MNC: '95' MNC_LENGTH: 2 NSSAI_SST: 1 AMF_IP_ADDRESS: 192.168.70.138 GNB_NGA_IF_NAME: eth0 GNB_NGA_IP_ADDRESS: 192.168.70.153 GNB_NGU_IF_NAME: eth0 GNB_NGU_IP_ADDRESS: 192.168.70.153 SDR_ADDRS: serial=XXXXXXX USE_ADDITIONAL_OPTIONS: --sa -E --rfsim --log_config.global_log_options level,nocolor,time networks: public_net: ipv4_address: 192.168.70.153 healthcheck: test: /bin/bash -c "pgrep nr-softmodem" interval: 10s timeout: 5s retries: 5 oai-nr-ue1: image: oaisoftwarealliance/oai-nr-ue:develop privileged: true container_name: rfsim5g-oai-nr-ue1 environment: RFSIMULATOR: 192.168.70.153 FULL_IMSI: '208950000000036' FULL_KEY: '0C0A34601D4F07677303652C0462535B' OPC: '63bfa50ee6523365ff14c1f45f88737d' DNN: oai NSSAI_SST: 1 USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 -C 3619200000 --nokrnmod --log_config.global_log_options level,nocolor,time depends_on: - oai-gnb networks: public_net: ipv4_address: 192.168.70.154 healthcheck: test: /bin/bash -c "pgrep nr-uesoftmodem" interval: 10s timeout: 5s retries: 5 # oai-nr-ue2: # image: oai-nr-ue:develop # privileged: true # container_name: rfsim5g-oai-nr-ue2 # environment: # RFSIMULATOR: 192.168.70.153 # FULL_IMSI: '208950000000037' # FULL_KEY: '0C0A34601D4F07677303652C0462535B' # OPC: '63bfa50ee6523365ff14c1f45f88737d' # DNN: oai # NSSAI_SST: 1 # NSSAI_SD: 0 # USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 -C 3619200000 --nokrnmod # depends_on: # - oai-gnb # networks: # public_net: # ipv4_address: 192.168.70.155 # healthcheck: # test: /bin/bash -c "pgrep nr-uesoftmodem" # interval: 10s # timeout: 5s # retries: 5 gnbsim: container_name: gnbsim image: gnbsim:latest privileged: true environment: - MCC=208 - MNC=95 - GNBID=5 - TAC=0x00a000 - SST=130 - SD=000082 - PagingDRX=v32 - RANUENGAPID=0 - IMEISV=35609204079514 - MSIN=0000000037 - RoutingIndicator=1234 - ProtectionScheme=null - KEY=0C0A34601D4F07677303652C0462535B - OPc=63bfa50ee6523365ff14c1f45f88737d - DNN=oai.ipv4 - URL=http://www.asnt.org:8080/ - NRCellID=1 - USE_FQDN=no - NGAPPeerAddr=192.168.70.138 - GTPuLocalAddr=192.168.72.156 - GTPuIFname=eth0 networks: public_net: ipv4_address: 192.168.70.156 public_net_access: ipv4_address: 192.168.72.156 healthcheck: test: /bin/bash -c "ip address show dev gtp-gnb" interval: 10s timeout: 5s retries: 5 networks: public_net: external: name: demo-oai-public-net public_net_access: external: name: oai-public-access
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。