【ローカル5G】 free5GCとリアルgNBでiPhone接続を試す。②

* * *
※本記事は2024年9月9日時点の内容です。
この記事は私がfree5GCとリアルgNB(ローカル5G用小型基地局= Small Cell）を使ってiPhone接続を試す機会があり、その過程をまとめたものです。
free5GCのインストールについては基本的には全てfree5GCプロジェクトのWEBサイトを参考に進めました。

https://free5gc.org/

インストールしたバージョンは以下の通りです。
OS　: 　Ubuntu 20.04.6 LTS
Linux Kernerl　:　5.4.0-193-generic
free5GC　:　v3.4.2
<br>
過去記事はこちら
[① Ubuntuインストール編](https://qiita.com/Takashi_Eifuku/items/133b26da9013f35cdf68 "【ローカル5G】 free5GCとリアルgNBでiPhone接続を試す。①")
* * *
<br>

# free5GCインストール
## A. 前提条件
### 1. Linux Kernel Versionの確認
free5GC WEBサイトには「UPFエレメントを使用する為にはLinuxカーネルの5.0.0-23-genericまたは5.4.xバージョンを使用する必要があります。」とありましたので uname -r コマンドでバージョン確認。
<br>

### 2. Go言語インストール
free5GC WEBサイトの指示に従って、バージョン1.21.8をインストールしました。
私の場合はGo言語はインストールされていませんでしたので、以下コマンドでGo言語をインストールしました。

```ruby:go言語インストール
wget https://dl.google.com/go/go1.21.8.linux-amd64.tar.gz
sudo tar -C /usr/local -zxvf go1.21.8.linux-amd64.tar.gz
mkdir -p ~/go/{bin,pkg,src}
# The following assume that your shell is bash:
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=auto' >> ~/.bashrc
source ~/.bashrc
```
<br>
インストール後にバージョン確認

```
root@free5gc:~# go version
go version go1.21.8 linux/amd64
```
<br>

### 3. C-Plane Supporting Packagesインストール
まずはupdate、wgetとgitのインストールを実行。
```
sudo apt -y update
sudo apt -y install wget git
```
<br>

CPUがAVXをサポートしているか確認。"avx"が表示されればOKかと。
```
lscpu | grep avx
```
<br>

#### MongoDB Community Editionのインストール
a. パッケージマネージメントシステムが使用する公開鍵のインポート
```
sudo apt install -y gnupg curl
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | \
sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor
```
<br>
b. MongoDB用リストファイル作成（Ubuntu 20.04用)

```
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
```
<br>
c. ローカルパッケージデータベースをリロードとMongoDBパッケージのインストール

```
sudo apt update
sudo apt install -y mongodb-org
```
<br>
d. MongoDB Community Edition実行とステータス確認

```
 #MongoDB実行 
sudo systemctl start mongod

 #ステータス確認 
sudo systemctl status mongod
```
確認結果：　active(running)になっている事を確認。
![スクリーンショット 2024-09-10 115139.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883115/58e18c58-46b3-ddab-e3c4-40cefe1427a9.png)
<br><br>

### 4. U-Plane Supporting Packagesインストール

```
sudo apt -y update
sudo apt -y install git gcc g++ cmake autoconf libtool pkg-config libmnl-dev libyaml-dev
```
<br><br>
### 5. Linuxホストのネットワーク設定
コマンド2行目の \<dn_interface> 部分はインターフェース名を入れます。
インターフェース名は ifconfig や ip a などで確認します。
```
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -o <dn_interface> -j MASQUERADE
sudo iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1400
sudo systemctl stop ufw
sudo systemctl disable ufw # prevents the firewall to wake up after a OS reboot
```
（例） インターフェース名が "enp0s31f6"の場合
sudo iptables -t nat -A POSTROUTING -o enp0s31f6 -j MASQUERADE
<br>

## B. C-Planeエレメントインストール
### 1. free5GCリポジトリをクローン
v3.4.2をインストール
※free5GC WEBによるとv3.4.2が最新安定版との事。
```
cd ~
git clone --recursive -b v3.4.2 -j `nproc` https://github.com/free5gc/free5gc.git
```
<br>

### 2. ネットワーク機能サービスのコンパイル
```
cd ~/free5gc
make
```
<br><br>
## C. U-Plane機能インストール（UPF）
### 1. Linux Kernel Versionの確認
UPFが使用するGTPカーネルモジュールには、Linuxカーネルバージョン5.0.0-23-genericまたは5.4.xが必要との事。
私が使ったバージョンは既に何回も確認されているように「5.4.0-193-generic」です。
<br>
### 2. 5G GTP-U kernelモジュールビルド
```
git clone -b v0.8.10 https://github.com/free5gc/gtp5g.git
cd gtp5g
make
sudo make install
```
<br>

## D. Web Console インストール
### 1. nodejsインストール
```
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - 
sudo apt update
sudo apt install -y nodejs
corepack enable # setup yarn automatically
```
<br>

### 2. Web Consoleビルド
```
cd ~/free5gc
make webconsole
```
マニュアルビルドの場合はこちらのコマンドを実行。
```
cd ~/free5gc/webconsole/frontend
yarn install
yarn build
rm -rf ../public
cp -R build ../public
cd ..
go build -o bin/webconsole server.go
```
<br>

## E. 動作テスト
これでインストールが完了したので一度テストしておきます。
テスト開始前に以下コマンドを実行。
```
cd ~/free5gc
make upf
chmod +x ./test.sh
```
私の場合は2行目の「make upf」が何度やってもうまく行きませんでしたが無視して進めました。これまでのところ特に問題は発生してません。
<br>
### a. Registrationテスト
```
cd ~/free5gc
./test.sh TestRegistration
```
実行するとログが流れてややしばらくしてテスト結果が表示されました。
```ruby:テスト結果
--- PASS: TestRegistration (3.25s)
PASS
ok  test6.094s
```
PASSになればOK。
FAILの場合にはエラー部分を確認して対応が必要ですが、何かが正しくインストールされていない場合やサービスが正しく起動していない場合がほとんどだと思います。
私の場合はupdateやupgradeがうまくできていなかったり、MongoDBのサービスが停止していたりで何度か失敗しました。
エラー箇所は流れるログの中で [ERRO] で表示されます。
<br>
同じように他の機能もテストを進めます。
<br>

### b. GUTIRegistrationテスト
```
./test.sh TestGUTIRegistration
```
<br>

### c. ServiceRequestテスト
```
./test.sh TestServiceRequest
```
<br>

### d. 他機能のテスト
その他機能テストについてはfree5GC WEBを参照ください。

https://free5gc.org/guide/4-test-free5gc/

<br>
free5GCインストールについてはこれにて終了。

次回記事ではfree5GCのconfig編集過程についてまとめようと思います。

https://qiita.com/Takashi_Eifuku/items/f89b6ddffc9969de3f5a