APRESIA Technical Blog

OAIを使い仮想マシン上で5Gシステムの実験環境を構築する方法

本記事の目的

5Gは3GPPによって動作仕様が定められていますが、規格の記述量が多いため、処理シーケンスの全体像を把握することが難しいです。ですので、実際に5Gのシステムが動作する環境を作り、その動作を見ながら3GPP規格を読むことで、その理解が深まる可能性があります。OAIを使えば、そのような環境を、仮想マシン上に簡単に作ることができます。本記事では、その環境を構築する方法をご紹介します。

OAIの「5g_f1_rfsimulator」環境

今回は、以下のOAIのソフトウェアを使って、試験環境を構築します。
https://gitlab.eurecom.fr/oai/openairinterface5g
このソフトウェアは、CIのために、様々な構成を使って試験ができる環境が用意されています。今回は、例としてCU/DUを分離した5Gシステムを構築できる以下の構成を使って、実験環境を構築します。
https://gitlab.eurecom.fr/oai/openairinterface5g/-/tree/develop/ci-scripts/yaml_files/5g_f1_rfsimulator
上記は以下の5g_rfsimulatorがベースになっています。この実験環境はUEからDUの無線区間はrfsimulatorというシミュレータを使って模擬することで、UEから外部ネットワークまでのEnd to Endの通信を模擬することができます。具体的な実行方法の説明は以下にありますので、これを参考にして、上記の環境を動かしていきます。
https://gitlab.eurecom.fr/oai/openairinterface5g/-/tree/develop/ci-scripts/yaml_files/5g_rfsimulator
今回、構築する試験環境は以下のdocker-compose.yamlにて定義されています。
https://gitlab.eurecom.fr/oai/openairinterface5g/-/blob/develop/ci-scripts/yaml_files/5g_f1_rfsimulator/docker-compose.yaml
この定義を図にすると以下になります。このようなネットワークの実験環境を構築してみたいと思います。

図1 構築する5Gネットワークのテスト環境

用意する環境と事前準備

今回用意した仮想マシンのスペックは以下です。
  • OS: Ubuntu 20.04
  • CPU:16コア
  • メモリ:8GB
  • ストレージ:64GB (環境構築後は7GB程度を消費)
仮想マシンにはあらかじめ、docker-ceとdocker-composeをインストールします。注意点ですが、新しいバージョンのdocker-composeではOAIの環境が動作しません。今回の環境では1.27.4のバージョンのdocker-composeを使用しました。

環境の構築方法

OAIのソースコードをクローンします。
git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git
クローンしたソースコードの以下の場所に移動します。
cd ./openairinterface5g/ci-scripts/yaml_files/5g_f1_rfsimulator
このディレクトリにあるdocker-compose.yamlに、構築する全てのソフトウェアの定義が記載されています。ただし、"docker-compose up -d"の一つのコマンドで環境を起動することはサポートされていません。以下のように、ステップを踏んで、順番にソフトウェアを起動します。
docker-compose up -d mysql oai-nrf oai-amf oai-smf oai-spgwu oai-ext-dn
docker-compose up -d oai-cu
docker-compose up -d oai-du
docker-compose up -d oai-nr-ue
上記のコマンドを実行すると、必要なdokcerイメージがダウンロードされていない場合は、それらのイメージをダウンロードすることも自動で実施されます。上記のコマンドを実行すると、最終的には以下のようにdockerイメージがダウンロードされます。
$ docker images
REPOSITORY                           TAG       IMAGE ID       CREATED        SIZE
oaisoftwarealliance/oai-nr-ue        develop   fd4575f44c6a   3 days ago     542MB
oaisoftwarealliance/oai-gnb          develop   21c5ab35fe31   3 days ago     720MB
mysql                                8.0       91b53e2624b4   12 days ago    565MB
oaisoftwarealliance/trf-gen-cn5g     focal     2f53b8349504   4 months ago   246MB
oaisoftwarealliance/oai-smf          v1.5.0    c4e57c5f5f24   5 months ago   137MB
oaisoftwarealliance/oai-amf          v1.5.0    02b4144bafb4   5 months ago   144MB
oaisoftwarealliance/oai-nrf          v1.5.0    ecd320f67e16   5 months ago   134MB
oaisoftwarealliance/oai-spgwu-tiny   v1.5.0    4a507079626f   5 months ago   118MB
また、起動するdockerコンテナは以下のようになります。
$ docker ps
CONTAINER ID   IMAGE                                       COMMAND                  CREATED          STATUS                    PORTS                          NAMES
763769781e9f   oaisoftwarealliance/oai-nr-ue:develop       "/opt/oai-nr-ue/bin/…"   6 minutes ago    Up 6 minutes (healthy)                                   rfsim5g-oai-nr-ue
449bb7092657   oaisoftwarealliance/oai-gnb:develop         "/opt/oai-gnb/bin/en…"   11 minutes ago   Up 11 minutes (healthy)                                  rfsim5g-oai-du
250233887e9b   oaisoftwarealliance/oai-gnb:develop         "/opt/oai-gnb/bin/en…"   11 minutes ago   Up 11 minutes (healthy)                                  rfsim5g-oai-cu
4808d04411f1   oaisoftwarealliance/trf-gen-cn5g:focal      "/bin/bash -c ' ipta…"   15 minutes ago   Up 15 minutes (healthy)                                  rfsim5g-oai-ext-dn
09c16e73bf27   oaisoftwarealliance/oai-spgwu-tiny:v1.5.0   "python3 /openair-sp…"   15 minutes ago   Up 15 minutes (healthy)   2152/udp, 8805/udp             rfsim5g-oai-spgwu
633d32ccb235   oaisoftwarealliance/oai-smf:v1.5.0          "python3 /openair-sm…"   15 minutes ago   Up 15 minutes (healthy)   80/tcp, 8080/tcp, 8805/udp     rfsim5g-oai-smf
2cc85d196c19   oaisoftwarealliance/oai-amf:v1.5.0          "python3 /openair-am…"   15 minutes ago   Up 15 minutes (healthy)   80/tcp, 9090/tcp, 38412/sctp   rfsim5g-oai-amf
f2d6cc28c264   mysql:8.0                                   "docker-entrypoint.s…"   15 minutes ago   Up 15 minutes (healthy)   3306/tcp, 33060/tcp            rfsim5g-mysql
b03385fdb5fc   oaisoftwarealliance/oai-nrf:v1.5.0          "python3 /openair-nr…"   15 minutes ago   Up 15 minutes (healthy)   80/tcp, 9090/tcp               rfsim5g-oai-nrf
この記事では割愛しますが、"docker logs -f "を実行すれば、各コンテナのコンソールログを見ることができます。UEのアタッチなど、各イベントにて、各コンテナが実行する処理を、このコンソールログから追うことができます。

UEから外部ネットワークへの通信確認

全てのコンテナが起動すれば、UEのコンテナから外のネットワークへ通信ができる状態になっています。実際にUEコンテナに入って、外部への通信ができるか確認します。以下のコマンドで、UEのコンテナに入ります。
docker exec -ti rfsim5g-oai-nr-ue bash
UEコンテナの中でip adコマンドを実行すると、oaitun_ue1というインタフェースができていることを確認できます。このインタフェースに、5Gコアから割り当てられたIPアドレス(この例では12.1.1.2)が設定されています。
# ip ad
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: oaitun_ue1:  mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500
link/none
inet 12.1.1.2/24 brd 12.1.1.255 scope global oaitun_ue1
valid_lft forever preferred_lft forever
24: eth0@if25:  mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:c0:a8:47:96 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.71.150/26 brd 192.168.71.191 scope global eth0
valid_lft forever preferred_lft forever
このoaitun_ue1を使って外部ネットワークにpingを実行すると、以下のように疎通することが確認できます。
# ping -I oaitun_ue1 10.XX.XX.XX
PING 10.XX.XX.XX (10.XX.XX.XX) from 12.1.1.2 oaitun_ue1: 56(84) bytes of data.
64 bytes from 10.XX.XX.XX: icmp_seq=1 ttl=62 time=29.5 ms
64 bytes from 10.XX.XX.XX: icmp_seq=2 ttl=62 time=28.5 ms
64 bytes from 10.XX.XX.XX: icmp_seq=3 ttl=62 time=17.7 ms
64 bytes from 10.XX.XX.XX: icmp_seq=4 ttl=62 time=15.2 ms
64 bytes from 10.XX.XX.XX: icmp_seq=5 ttl=62 time=23.7 ms
64 bytes from 10.XX.XX.XX: icmp_seq=6 ttl=62 time=28.7 ms
このとき、DUからCU、CUからUPFの通信は全てpublic_netの名前が付いたブリッジインタフェースに流れています。ですので、public_netインタフェースに流れるフレームをtcpdumpにてキャプチャすると、pingフレームが以下のようにカプセリングされていることが分かります。

図2 DUからCU方向のカプセル化されたpingフレーム 図3 CUからUPF方向のカプセル化されたpingフレーム

まとめ

OAIを使った、5GのEnd to Endの通信を確認できる環境の構築方法をご紹介しました。実際に試していただくと、OAIにて用意されたネットワーク構成を構築するだけなら、それほど手間をかけずに環境を作れることが分かると思います。また、ネットワークの構成を変えた実験環境を構築したい場合は、途中でご紹介したdocker-compose.yamlの定義を変更することで所望の実験環境を構築することができます。
この記事が何かの役に立てば幸いです。