free5GCとは
オープンソースのモバイル5Gのコアネットワーク実装プロジェクト。主なコントリビュータは台湾の國立交通大學。
環境
Alibaba Cloud/ECSとAWS/EC2のUbuntu 18.04へインストールしてみた。 仕様を確認するとハードウエアは下記が必要らしいので、AlibabaCloudのecs.t5-lc1m2.largeとAWSのt2.mediumを採用。 インストール手順は同じ。ストレージは160GBとあるけどインストールするだけならAlibabaCloudデフォルトの40GBあれば余裕でAWSデフォルト8GBでも行ける。
Ubuntu20.04でも行けるかもしれないが、18.04はaptで指定のカーネルバージョンに変えられるので18.04のほうが楽。
- Hardware
- CPU: Intel i5 processor
- RAM: 4GB
- Hard drive: 160G
- NIC card: 1Gbps ethernet card
- Hardware recommended
- CPU: Intel i7 processor
- RAM: 8GB
- Hard drive: 160G
- NIC card: 10Gbps ethernet card
インストール
必要なパッケージインストール
apt upgradeするとkernelバージョンが上がりすぎてしまうのでここでは省略。apt upgradeを実行した場合は後述の指定カーネルで起動するように適宜grubの設定を。
# apt -y update
# apt -y install mongodb wget git gcc cmake autoconf libtool pkg-config libmnl-dev libyaml-dev
カーネル変更
UPFが使用するGTPモジュールをビルドするため、カーネルは5.0.0-23-generic指定
# apt -y install linux-image-5.0.0-23-generic linux-headers-5.0.0-23-generic
# reboot
# uname -r
5.0.0-23-generic
GTPモジュールビルド
# git clone https://github.com/PrinzOwO/gtp5g.git
# cd gtp5g
# make
# make install
ネットワーク設定
フォワーディングとマスカレードをオンに
# sysctl -w net.ipv4.ip_forward=1
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
GOインストール
指定バージョンのGOをインストール
# cd
# wget https://dl.google.com/go/go1.12.9.linux-amd64.tar.gz
# tar -C /usr/local -zxvf go1.12.9.linux-amd64.tar.gz
# mkdir -p ~/go/{bin,pkg,src}
# echo 'export GOPATH=$HOME/go' >> ~/.bashrc
# echo 'export GOROOT=/usr/local/go' >> ~/.bashrc
# echo 'export PATH=$PATH:$GOPATH/bin:$GOROOT/bin' >> ~/.bashrc
# echo 'export GO111MODULE=off' >> ~/.bashrc
# source ~/.bashrc
# go get -u github.com/sirupsen/logrus
free5GCビルド
# cd $GOPATH/src
# git clone https://github.com/free5gc/free5gc.git
# cd free5gc
# git submodule update --init
# cd $GOPATH/src/free5gc
# ./install_env.sh
# ./build.sh
テスト
NF Register
あるノードが立ち上がると自分が提供する機能をNRF(Network Exposure Function)へ登録にいくのでその確認。
ターミナルを2つ立ち上げ、一方でNRFを事前に起動
# cd $GOPATH/src/free5gc/bin
# ./nrf
もう一方でamf起動
# cd $GOPATH/src/free5gc/bin
# ./amf
/nnrf-nfm/v1/nf-instances/1de0a621-dbbf-49e4-9b35-0ffe414942adというURLへPUT、つまり1de0a621-dbbf-49e4-9b35-0ffe414942adというIDのAMFインスタンスをRegisterしたということなんだろう。AMFをCtl+cで停止するとDELETEした後にAMFプロセスが停止される。
テストツール
test.shが準備されていて色々できるが知識不足で何が起きているのかログを読み切れない。要勉強
# cd $GOPATH/src/free5gc/
# ./test.sh
Usage: ./test.sh [ TestRegistration | TestServiceRequest | TestXnHandover | TestN2Handover | TestDeregistration | TestPDUSessionReleaseRequest | TestPaging | TestNon3GPP ]
Non 3GPPアクセスが実装されているように見えるので、5G基地局や端末の無線部分のシミュレータがなくても色々できそう。
Web UI
Subscriber(つまりSIM)を登録したりできるWeb UIあり。下記、サーバを起動する方法。port 5000で立ち上がる
# cd $GOPATH/src/free5gc/webconsole
# go run server.go
http://[インスタンスのEIP]:5000/
user: admin
pass: free5gc
でアクセス。多くのことはできない。
備考
EC2での起動カーネルの変更
# awk -F\' '/submenu|menuentry / {if($1=="menuentry "){print m++ " : " $2}else \
if($1=="submenu "){print m " : " $2}else \
{print " " m ">" s++ " : " $2}}' /boot/grub/grub.cfg
0 : Ubuntu
1 : Advanced options for Ubuntu
1>0 : Ubuntu, with Linux 5.0.0-23-generic
1>1 : Ubuntu, with Linux 5.0.0-23-generic (recovery mode)
1>2 : Ubuntu, with Linux 4.15.0-1065-aws
1>3 : Ubuntu, with Linux 4.15.0-1065-aws (recovery mode)
/etc/defaults/grubのGRUB_DEFAULを編集。ここではUbuntu, with Linux 5.0.0-23-genericなので**"1>0"**を選択
# cat /etc/default/grub
・・・省略・・・
# GRUB_DEFAULT=0
GRUB_DEFAULT="1>2"
・・・省略・・・
# update-grub
参考
https://linuxbucket.com/reverting-to-a-previous-linux-kernel-version/