magma v1.3.3(Durango) + OpenAirInterface L2 nFAPI Simulator v1.0.0によるLTE環境の構築

Yohei Motomura
nttlabs
Published in
26 min readApr 6, 2021

こんにちは,NTT研究所の本村です.
前回の記事(モバイルコアのOSS magmaの最新動向 ~Magma Developers Conference 2021参加レポート~)Open Mobile Network Infra Meetup #1における発表(magmaの概要および特徴の紹介)をご覧になった方から「magmaの環境構築方法を教えて欲しい」,「Orchestratorがどのように動いているか知りたい」といったご相談をいくつか頂きました.そこで本記事では,magma v1.3.3(Durango)とOpenAirInterface L2 nFAPI Simulator v1.0.0から構成されるLTE環境の構築方法やmagmaの各機能の特徴をご紹介したいと思います.

※magmaの基本的な情報はリンク先の記事や資料で紹介していますので,こちらを先にご確認いただけますと幸いです.
magmaの概要および特徴の紹介
モバイルコアのOSS magmaの最新動向 ~Magma Developers Conference 2021参加レポート~

magma v1.3.3(Durango)+OpenAirInterface L2 nFAPI Simulator v1.0.0の検証環境の概要

本記事で構築する環境ですが,端末と基地局はOpenAirInterfaceのL2 nFAPI Simulator v1.0.0,EPCはmagmaのAccess GW v1.3.3,そしてEPCを管理・制御するmagmaのOrchestrator/NMS v1.3.3から構成される環境を構築していきます(図1).

図1. magma v1.3.3(Durango)+OpenAirInterface L2 nFAPI Simulator v1.0.0の検証環境の構成

実機としてはServerを4台(うち1台はclient用のPC)使用しています.また,今回私が使用したServerのOSや機器スペックは以下となります.※これら機器よりも低いスペックの物理ServerやVM環境等でも問題なく動作するかと思います.

◇ Server 1: OpenAirInterface L2 nFAPI Simulator v1.0.0
OS: Ubuntu18.04.5 Server
CPU: Intel Core i5–10210U
LAN adapter: Intel Ethernet Connection I219-V (10.0.2.100)
Memory: 16GB

◇ Server 2: magma Access GW v1.3.3
OS: Debian9.13.0
CPU: Intel Core i5–10210U
LAN adapter: Intel Ethernet Connection I219-V (10.0.2.1), ASIX AX88179 (192.168.0.20)
Memory: 16GB

◇ Server 3: magma Orchestrator/NMS v1.3.3
OS: Ubuntu20.04.2 Server
CPU: Intel Core i5–10210U
LAN adapter: Intel Ethernet Connection I219-V (192.168.0.10)
Memory: 16GB

◇ Server 4: Client PC (Server 1-3へのssh & Orchestrator/NMSのWeb UIへのアクセス)
OS: Ubuntu18.04.5 Desktop
CPU: Intel Core i5–9400F
LAN adapter: Realtek RTL8168 (192.168.0.30), ASIX AX88179 (10.0.2.10)
Memory: 16GB

【手順1】Server 1: OpenAirInterface L2 nFAPI Simulator v1.0.0の環境構築

まず,OpenAirInterface L2 nFAPI Simulator v1.0.0をServer 1に導入します.こちらはOpenAirInterface公式のマニュアルに従って導入を進めました.

また,nFAPIはRANのMACとPHYでの分離(O-RANのoption6 split)を可能にする機能です.そのため,図1のServer 1内部ではOAI-eNBとOAI-UEで分離している表記にしていますが,正確にはそれぞれの機能はoption6で分離されています.ただ,本記事上では便宜上eNBとUE とみなして扱います.

【open-nFAPI】
https://github.com/cisco/open-nFAPI

◇ 手順1.1 OpenAirInterfaceのソースコード取得
OpenAirInterface v1.0.0のソースコードを取得し,eNB用のフォルダ(enb_folder)とUE用のフォルダ(ue_folder)それぞれにコードを配備しました.

# Server 1
$ sudo apt update
$ sudo apt upgrade
$ cd ~/
$ git clone https://gitlab.eurecom.fr/oai/openairinterface5g/ enb_folder
$ cd enb_folder
$ git checkout -b v1.0.0 refs/tags/v1.0.0
$ cd ..
$ cp -Rf enb_folder ue_folder

◇ 手順1.2 UEのconfigの変更
SIMの認証情報に関連するue_eurecom_test_sfr.confの設定を変更しました.

$ cp ~/ue_folder/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf ~/ue_folder/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf.bk
$ vim ~/ue_folder/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf
変更箇所(★)
↓↓↓
UE0:
{
SIM: {
MSIN=”0000000001";★
USIM_API_K=”00112233445566778899aabbccddeeff”;★
OPC=”000102030405060708090a0b0c0d0e0f”;★
MSISDN=”33611123456";
};
# Home PLMN Selector with Access Technology
HPLMN= “00101”;★

◇ 手順1.3 eNBのconfigの変更
図1のNW設定に合わせて,rcc.band7.tm1.nfapi.confの設定を変更しました.

$ cp ~/enb_folder/ci-scripts/conf_files/rcc.band7.tm1.nfapi.conf ~/enb_folder/ci-scripts/conf_files/rcc.band7.tm1.nfapi.conf.bk
$ vim ~/enb_folder/ci-scripts/conf_files/rcc.band7.tm1.nfapi.conf
変更箇所(★)
↓↓↓
plmn_list = ( { mcc = 001; mnc = 01; mnc_length = 2; } );★
mme_ip_address = ( { ipv4 = "10.0.2.1";★

ENB_INTERFACE_NAME_FOR_S1_MME = "ens1";★
ENB_IPV4_ADDRESS_FOR_S1_MME = "10.0.2.100";★
ENB_INTERFACE_NAME_FOR_S1U = "ens1";★
ENB_IPV4_ADDRESS_FOR_S1U = "10.0.2.100";★
ENB_IPV4_ADDRESS_FOR_X2C = "10.0.2.100";★

◇ 手順1.4 eNB/UEのビルド
eNB/UEそれぞれビルドを実行します../build_oai -Iは外部パッケージをインストールするオプションで,初回のビルド時のみ実行が必須となります.

$ cd ~/enb_folder
$ source oaienv
$ cd cmake_targets
$ ./build_oai -I
$ ./build_oai --eNB -t ETHERNET -c
$ cd ~/ue_folder
$ source oaienv
$ cd cmake_targets
$ ./build_oai --UE -t ETHERNET -c
$ cd ~/ue_folder/targets/bin/
$ cp .u* ../../cmake_targets/
$ cp usim ../../cmake_targets/
$ cp nvram ../../cmake_targets/

◇ 手順1.5 NWの設定
L2 nFAPI Simulatorの動作に必要なIPアドレスを割り当てます.

$ sudo ifconfig lo: 127.0.0.2 netmask 255.0.0.0 up
$ cd ~/ue_folder/cmake_targets/tools
$ source init_nas_s1 UE

【手順2】Server 2: magma Access GW v1.3.3の環境構築

次に,magma Access GW v1.3.3をServer 2に導入します.こちらもmagma公式のマニュアルに従って導入を進めていきます.

◇ 手順2.1 OSの導入
公式マニュアルの手順に従いDebian9.13.0をインストールします.ユーザ名やパスワードも公式マニュアルに指定されている以下の設定値を使用します.

・Hostname: “magma”
・Domain name : “”
・Root password: “magma”
・Username : “magma”
・Password: “magma”
・Partition disk: “Use entire disk”
・Select disk to partition: “sda”
・Partitioning scheme: “All files in one partition”
・Only tick ssh server and utilities (untick every other)

※この後のデプロイ処理に使用するスクリプトagw_install.sh内で公式マニュアル指定の設定値がいくつか紐づけられているため,もしユーザ名等を別のものに変更した場合はagw_install.shの対応する設定値を自身で変更する必要があります.

◇ 手順2.2 magmaのデプロイ
agw_install.shを実行しAccess GWのデプロイを実行します.

$ su
# wget https://raw.githubusercontent.com/magma/magma/v1.3.3/lte/gateway/deploy/agw_install.sh
# bash agw_install.sh

デプロイ状況は以下のコマンドで適宜確認することができます.AGW installation is done.が表示されると正常にデプロイが実施されています.

$ su
# journalctl -fu agw_installation

【手順3】Server 3: magma Orchestrator/NMS v1.3.3の環境構築

最後にmagma Orchestrator/NMS v1.3.3をServer 3に導入します.magma公式ではterraformやhelmでAWSにOrchestrator/NMSを導入するマニュアルが提供されていますが,今回はより簡易に環境を構築できるdocker-compose版の環境を構築したいと思います.

また,OrchestratorとNMSはそれぞれ別の機能となります.OrchestratorはプログラマブルにAccess GWを制御するために必要となるRESTful APIを提供しています.また,Swagger UIでRESTful APIのドキュメントも別途提供しています.NMSはWeb GUIによるmagmaの管理機能となります.NMSの処理はOrchestratorのRESTful APIを叩くことで実行されています.OrchestratorのみでもAccess GWの制御は可能なのですが,より簡易にmagmaを扱うために本記事ではNMSも導入いたします.

◇ 手順3.1 必要な外部パッケージの導入
dockerやpythonなど必要となるパッケージを導入します.

# docker
$ sudo apt update
$ sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io
$ sudo systemctl status docker
$ sudo usermod -aG docker ubuntu
# docker-compose
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod a+x /usr/local/bin/docker-compose
$ docker-compose --version
# python 3.7.3
$ sudo apt install python3
$ sudo apt install python3-pip
$ pip3 install ansible fabric3 jsonpickle requests PyYAML
$ sudo apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev libffi-dev xz-utils tk-dev
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ pyenv install 3.7.3
$ pyenv global 3.7.3
$ source ~/.bashrc

◇ 手順3.2 Orchestratorの導入

$ cd ~/
$ git clone https://github.com/magma/magma.git
$ git checkout -b v1.3.3 refs/tags/v1.3.3
$ cd ~/magma/orc8r/cloud/docker
$ ./build.py -a
$ ./run.sh -all

◇ 手順3.3 NMSの導入

$ cd ~/magma/nms/app/packages/magmalte
$ docker-compose build magmalte
$ docker-compose up -d
$ ./scripts/dev_setup.sh

【手順4】Server 4: Client PCの設定

Client PCからmagmaのOrchestratorやNMSにアクセスするための設定を適応していきます.

◇ 手順4.1 NMSへのアクセス設定
magmaのNMSはマルチテナント機能が含まれており,各テナントは名前ベースのバーチャルホストにより識別されています.そのため,https:://{Orchestrator/NMSのIPアドレス}でNMSにアクセスしてもNMS側はどのテナントへのアクセスか識別することができずエラーが発生します.そのためClient PCで以下の設定を実施することで今回はエラーを回避しました.※magma公式の手順でAWSに環境を構築する場合はRoute53(DNS)等を別途設定するためこの問題は発生しません.

$ sudo vim /etc/hosts
192.168.0.10 magma-test
192.168.0.10 master

また,masterが全体管理用のテナント,magma-testが個別環境のテナントとなります.この後の設定ではmagma-testのテナントにログインし,環境設定を進めていきます.https://magma-test/にアクセスすると以下の図2のログイン画面が表示されます.Emailにadmin@magma.test, Passwordにpassword1234を入力すると,これまでの設定に問題がなければNMSのDashboard(図3)が表示されます.

図2. magma NMSのログイン画面
図3. magma NMSのDashboard画面

◇ 手順4.2 Swagger UIへのアクセス設定
magmaのOrchestratorで提供されるRESTful APIの情報をSwagger UIから取得することができます.Client PCからSwagger UIにアクセスするためには証明書のインポートが必要となります.Orchestrator/NMSを導入したServerの以下の場所に配置されているadmin_operator.pfxをClient PCにダウンロードし証明書をインポートしてください.証明書のPasswordはmagmaです.

$ ls ~/magma/.cache/test_certs
admin_operator.key.pem bootstrapper.key controller.crt rootCA.key vpn_ca.crt
admin_operator.pem certifier.key controller.csr rootCA.pem vpn_ca.key
admin_operator.pfx certifier.pem controller.key rootCA.srl

証明書が正常にインポートされると,https://{Orchestrator/NMSのIPアドレス}:9443/apidocs/v1/にアクセスすることで以下の図4の画面に遷移することができます.

図4. magmaのSwagger画面

【手順5】Access GWとOrchestrator/NMSの接続

これまでの手順でAccess GWとOrchestrator/NMSはそれぞれ単体としては動作していますが,システムとして連携して動作させるにはいくつかの設定が追加で必要となります.

◇ 手順5.1 証明書の配備
手順4.2と同様に,Orchestrator/NMSのServerの以下の場所に配置されているrootCA.pemをコピーしAccess GW内の/var/opt/magma/tmp/certs/に配置します.

# Orchestrator
$ ls ~/magma/.cache/test_certs
admin_operator.key.pem bootstrapper.key controller.crt rootCA.key vpn_ca.crt
admin_operator.pem certifier.key controller.csr rootCA.pem vpn_ca.key
admin_operator.pfx certifier.pem controller.key rootCA.srl
# Access GW
$ sudo mkdir -p /var/opt/magma/tmp/certs/
$ sudo mv rootCA.pem /var/opt/magma/tmp/certs/rootCA.pem

◇ 手順5.2 Access GWのconfig設定
Access GWからOrchestrator/NMSにアクセスするための設定をAccess GWに追記します.

# Access GW
$ sudo mkdir -p /var/opt/magma/configs
$ cd /var/opt/magma/configs
$ sudo vim control_proxy.yml
cloud_address: controller.magma.test
cloud_port: 7443
bootstrap_address: bootstrapper-controller.magma.test
bootstrap_port: 7444
rootca_cert: /var/opt/magma/tmp/certs/rootCA.pem
$ sudo vim /etc/hosts
192.168.0.10 controller.magma.test
192.168.0.10 bootstrapper-controller.magma.test
$ sudo service magma@* stop
$ sudo service magma@magmad restart

◇ 手順5.3 Orchestrator/NMSの設定
NMSでmagma-testテナントにログインし,左端のNetwork→Add Networkを押して新規Networkを作成します(図5).Network IDやNetwork Name,Descriptionは任意のもので問題ありませんが,今回は以下に設定しました.※ここで設定するIDはAPIを叩く際に使用するnetwork_idとなります.

・Network ID: test
・Network Name: test network
・Add Description: test network

図5. Network追加画面

次に左端のEquipmet→Add Newを押して新規のGWを作成します(図6).各パラメータは以下に設定しました.Hardware UUIDとChallenge Keyは連携したいAccess GWの情報を入力する必要があります.Access GWに接続し,show_gateway_info.pyで取得できる情報を入力します.

・Gateway Name: gw1
・Gateway ID: gw1
・Hardware UUID: xxxxxxxx–xxxx–xxxx–xxxx-xxxxxxxxxxxx
・Version:
・Gateway Description: test gw
・Challenge Key: xxxxxxxxxxxxxxxxxxxxxxxxxxxx

# Access GW
$ show_gateway_info.py
Hardware ID:
------------
xxxxxxxx–xxxx–xxxx–xxxx-xxxxxxxxxxxx
Challenge Key:
-----------
xxxxxxxxxxxxxxxxxxxxxxxxxxxx
図6. GW追加画面

GW追加後,Access GWに接続して以下のコマンドを入力します.Access GWとOrchestratorが問題なく接続できている場合は以下のメッセージが表示されます.

$sudo journalctl -u magma@magmad -f
Mar 07 21:36:06 magma magmad[16568]: INFO:root:Processing config update gw1
Mar 07 21:36:09 magma magmad[16568]: INFO:root:Checkin Successful! Successfully sent states to the cloud!

また,NMSの左端のEquipmet→gw1の画面から接続状況を別途確認することも可能です.

図7. GWの概要画面

【手順6】SIM情報の登録

◇ 手順6.1 APNの追加
NMS左端のTraffic→APNs→Add New APNを押しAPNを追加します.今回は以下の値を設定しました

"root":{2 items
"apn_configuration":{2 items
"ambr":{2 items
"max_bandwidth_dl":100000000
"max_bandwidth_ul":100000000
}
"qos_profile":{4 items
"class_id":9
"preemption_capability":false
"preemption_vulnerability":false
"priority_level":15
}
}
"apn_name":"internet"
}

◇ 手順6.2 SIMの認証情報の追加
次にSIMの認証情報を登録します.NMSの左端のSubscriber→Add Subscriberを押し,以下の認証情報を追加します.

・IMSI: 001010000000001
・Auth Key: 00112233445566778899aabbccddeeff
・Auth OPC: 000102030405060708090a0b0c0d0e0f
・Active APNs: internet

Access GWとOrchestrator/NMSの連携がうまくいっていると,NMSで登録した情報がAccess GWにも自動で同期されます.Access GW内にSIMの認証情報が追加されているかどうかは以下のコマンドで確認可能です.

# Access GW
$ subscriber_cli.py list
IMSI001010000000001
$ subscriber_cli.py get IMSI001010000000001
sid {
id: "001010000000001"
}
gsm {
}
lte {
state: ACTIVE
auth_key: "\000\021\"3DUfw\210\231\252\273\314\335\356\377"
auth_opc: "\000\001\002\003\004\005\006\007\010\t\n\013\014\r\016\017"
}
state {
}

構築環境の動作確認

最後にOpenAirInterface L2 nFAPI Simulatorを起動させ,magmaのAccess GWにUEからアタッチしてみましょう.OpenAirInterface L2 nFAPI Simulatorを導入しているServerにログインし,以下のコマンドを入力してeNBとUEのシミュレータを起動します.

# OpenAirInterface L2 nFAPI Simulator
$ cd ~/enb_folder/cmake_targets
$ sudo -E ./lte_build_oai/build/lte-softmodem -O ../ci-scripts/conf_files/rcc.band7.tm1.nfapi.conf

$ cd ~/ue_folder/cmake_targets
$ sudo -E ./lte_build_oai/build/lte-uesoftmodem -O ../ci-scripts/conf_files/ue.nfapi.conf --L2-emul 3 --num-ues 1 --nums_ue_thread 1

ここまでの設定に問題がなければIMSI:001010000000001の端末がアタッチされ,192.168.128.xxxのIPがUE相当の仮想インターフェイス(oip1)に割り振られる挙動が確認できるかと思います.

# OpenAirInterface L2 nFAPI Simulator
$ip a
4: oip1: <BROADCAST,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
link/generic 00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00
inet 192.168.128.115/24 brd 192.168.128.255 scope global oip1
valid_lft forever preferred_lft forever
$ ping 8.8.8.8 -I oip1
PING 8.8.8.8 (8.8.8.8) from 192.168.128.115 oip1: 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=6 ttl=113 time=51.1 ms
64 bytes from 8.8.8.8: icmp_seq=7 ttl=113 time=62.0 ms

また,NMSからも同様に端末の接続情報は確認可能です.左端のMetricsから接続している端末数やThroughputの情報等を網羅的に確認することができます(図8).

図8. magma NMSのMetrics表示画面

おわりに

本記事ではmagma v1.3.3(Durango)とOpenAirInterface L2 nFAPI Simulator v1.0.0から構成されるLTE環境の構築方法をご紹介いたしました.magmaに興味があるという方は是非こちらの環境を構築しmagmaの各種機能をお試し頂けますと幸いです.

また,私たちNTTは,モバイル分野に関するオープンソースコミュニティで共に活動する仲間を募集しています.興味のある方はぜひ弊社採用情報ページをご覧ください.

--

--