1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

4GPi を搭載したラズパイを Zabbix + Netbird で遠隔監視する

1
Last updated at Posted at 2026-11-02

はじめに

メカトラックス株式会社の8kuma8です。

4G(LTE)回線で現場に設置したラズパイの状態を現地に行かずに遠隔で確認することができれば便利です。本記事では、4GPi ver.2 を搭載したラズパイの温度・電波強度・通信量などを Zabbix で収集し、以下の図のようにダッシュボードで分かりやすく可視化する方法をご紹介します。

スクリーンショット 2026-10-30 21.01.53.png

Zabbix で監視するには、監視サーバーとラズパイの間で通信できる必要があります。しかし、SIM に割り当てられるアドレスはキャリア NAT 配下のプライベート IP のため、そのままでは監視サーバーとラズパイは通信することができません。そこで、今回は Netbird でラズパイと監視サーバーを同じ仮想ネットワークに参加させ、通信できるようにします。

構成

本記事で構築するシステムの構成は以下のとおりです。

architecture.png

  • 監視対象(以下、ラズパイ側と呼びます)
    • Raspberry Pi 4 + 4GPi
    • Zabbix agent 2 と Netbird クライアントをインストールし、LTE 回線のみでインターネットに接続します
  • Zabbix 監視サーバー
    • Raspberry Pi 5
    • Zabbix 7.0 LTS(公式 Docker Compose)と Netbird クライアントをインストールし、LAN 内に設置します

流れ

以下の順に進めます。

  1. 監視サーバーに Zabbix サーバーを構築する
  2. ラズパイ側を LTE 回線に接続する
  3. Netbird でラズパイ側と監視サーバーを接続する
  4. ラズパイに Zabbix agent 2 をインストールし、Zabbix に登録する
  5. 監視項目(SoC 温度・電波強度・通信モジュールの電源)を追加する
  6. Zabbix のダッシュボードで可視化する

実行環境

DSC_0110.jpg

監視サーバー

  • Raspberry Pi 5(2GB)
  • Raspberry Pi OS Lite 64-bit(2026-10-06 版、Debian 13.7、カーネル 6.18.50+rpt-rpi-2712)
  • Docker Engine 29.9.2、Docker Compose v5.6.1(Docker 公式 apt リポジトリ)
  • Zabbix server 7.0.32(zabbix-docker の 7.0 ブランチ、PostgreSQL)
  • Netbird 0.81.5

対象ラズパイ

  • Raspberry Pi 4 Model B
  • 4GPi ver.2
  • 4GPi 用 OS イメージ 4gpi-trixie-lite-arm64-20260605(Raspberry Pi Imager の「4GPi OS Trixie (64-bit)」、Debian 13.5、カーネル 6.18.33+rpt-rpi-v8)
  • SIM: SORACOM Air(plan-D)
  • Zabbix agent 2 7.0.22(Debian 標準パッケージ)
  • Netbird 0.81.5

ラズパイの操作は、今回はシリアルコンソール(UART)で行っています。必要に応じて SSH など接続方法を選択してください。

1. Zabbix サーバーを構築する

監視サーバーの Pi 5 には、Raspberry Pi Imager で Raspberry Pi OS Lite(64-bit)を書き込みます。Imager の設定で、ホスト名を zabbix-server とします。

本記事では、 Docker を用いて Zabbix サーバーを構築します。

Docker は、Docker 公式ドキュメントの Install using the apt repository の手順でインストールします。リポジトリを登録した後、以下のコマンドを実行します。

user@zabbix-server:~$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
user@zabbix-server:~$ sudo usermod -aG docker $USER

usermod で自分のユーザーを docker グループに追加すると、sudo なしで docker コマンドを実行できます。反映するには一度ログアウトし、同じユーザーでログインし直してください。

Zabbix は、公式の Docker Compose(zabbix-docker)を使用して構築します。

user@zabbix-server:~$ git clone https://github.com/zabbix/zabbix-docker.git
user@zabbix-server:~$ cd zabbix-docker
user@zabbix-server:~/zabbix-docker$ git checkout 7.0
user@zabbix-server:~/zabbix-docker$ docker compose -f ./compose_pgsql.yaml up -d

ラズパイのメモリ容量によっては、up -d の際に zabbix-server と Web サーバーに「Your kernel does not support memory limit capabilities」という警告が表示されることがあります。Compose に記載されたメモリ上限が無視されるという警告ですが、本記事では大きなメモリ容量を使わないのでそのまま続行しました。

数分待ってから PC のブラウザで http://<サーバーの IP アドレス>/ を開き、Admin / zabbix でログインします。今回は、PC と監視サーバーが同じ LAN 内にあるため、監視サーバーのプライベート IP アドレスを指定しました。

スクリーンショット 2026-10-30 21.13.00.png

Zabbix のブラウザ画面は、既定では日本時間になっていないため、Administration → General → GUI の Default time zone を Asia/Tokyo に設定しておきます。

2. ラズパイを LTE 回線に接続する

4GPi 用 OS イメージを Raspberry Pi Imager で書き込みます。手順は以下の記事をご参照ください。

Imager の設定で、ホスト名を rpi-4gpi-01 としておきます。このホスト名が、後ほど Netbird の管理画面と Zabbix に表示される名前になります。起動後、SIM の APN で接続を作成します。

user@rpi-4gpi-01:~$ sudo nmcli con add type gsm ifname "*" con-name soracom apn soracom.io user sora password sora
user@rpi-4gpi-01:~$ sudo nmcli con up soracom
user@rpi-4gpi-01:~$ ip a show wwan0

実行結果

4: wwan0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1430 qdisc fq_codel state UNKNOWN group default qlen 1000
    link/none
    inet 10.xxx.xxx.xxx/28 brd 10.xxx.xxx.xxx scope global noprefixroute wwan0
       valid_lft forever preferred_lft forever

wwan0 にプライベート IP(10.x.x.x)が割り当てられていれば接続完了です。

このアドレスはキャリア NAT 配下のプライベート IP のため、監視サーバーとはそのままでは通信できません。そのため、以下のように Netbird を導入することで通信可能にします。

3. Netbird でラズパイと監視サーバーを接続する

3.1 Netbird にサインアップし、setup key を作成する

Netbird にサインアップし、Settings → Setup Keys → Create で key を作成します。Reusable にしておくと複数台で使い回すことができます。

Ephemeral は必ず OFF にしてください。ON にすると、10分を超えてオフラインになったピアが自動で削除されます。4G 回線では通信断が10分を超えることもあるため、そのたびに監視対象が消えてしまいます。

3.2 クライアントをインストールする(サーバー・ラズパイ共通)

$ curl -fsSL https://pkgs.netbird.io/install.sh | sh
$ sudo netbird up --setup-key <SETUP_KEY>
$ netbird status

netbird up で一度登録すると、再起動後も自動で接続されます。netbird status に表示される NetBird IP(100.x.x.x)が、仮想ネットワーク上のアドレスです。

3.3 疎通確認

監視サーバーからラズパイ側の Netbird アドレス(100.x.x.x)に ping が通れば完了です。新規アカウントでは、既定のポリシーで全ピア間の通信が許可されています。

4. ラズパイに Zabbix agent 2 をインストールする

標準リポジトリに Zabbix 7.0 系のエージェントバイナリが用意されているため、apt でインストールします。

user@rpi-4gpi-01:~$ sudo apt install zabbix-agent2

agent 2 は zabbix ユーザーで動作します。後述の持続バッファで使用するため、先に /var/lib/zabbix ディレクトリを作成し、所有者を zabbix に変更しておきます。

user@rpi-4gpi-01:~$ sudo mkdir /var/lib/zabbix
user@rpi-4gpi-01:~$ sudo chown zabbix:zabbix /var/lib/zabbix

/etc/zabbix/zabbix_agent2.conf を以下のように設定します。100.y.y.y は監視サーバーの Netbird アドレスです。Hostname は Zabbix 側のホスト名と一致させる必要があります。

/etc/zabbix/zabbix_agent2.conf
Server=100.y.y.y
ServerActive=100.y.y.y
Hostname=rpi-4gpi-01
EnablePersistentBuffer=1
PersistentBufferFile=/var/lib/zabbix/agent2.db
PersistentBufferPeriod=24h

後半の3行は持続バッファの設定で、通信が切断されている間に収集した値を SQLite に保持しておき、復旧後にまとめて送信します。本記事では、24時間分までディスクに保持する設定にしています。

agent 2 を再起動します。

user@rpi-4gpi-01:~$ sudo systemctl restart zabbix-agent2

PC の Zabbix Web 画面で、Data collection → Hosts → Create host を開き、Host name に rpi-4gpi-01、Templates に「Linux by Zabbix agent active」を指定し、Host groups を選択して登録します。数分でホストの Availability(ZBX)が緑になり、CPU・メモリ・ディスクなどの値が届き始めます。

スクリーンショット 2026-10-30 1.13.20.png

5. 監視項目を追加する

「Linux by Zabbix agent active」テンプレートには、CPU・メモリ・ディスク・稼働時間と、インターフェースごとの通信量が含まれています。ここでは、テンプレートに含まれないもののうち、現地へ行かずに状態を把握するのに役立つ以下の3種類のパラメータを追加します。

項目 取得方法
SoC 温度 標準キー vfs.file.contents[/sys/class/thermal/thermal_zone0/temp](単位は 1/1000 ℃)
4G の電波強度(RSRP・RSRQ・RSSI・SNR) UserParameter で mmcli --signal-get -J を実行し、JSON を依存アイテムで分解
4GPi の通信モジュールの電源 UserParameter で 4gpictl status を実行(on / off)

5.1 ラズパイ側の設定

パラメータ取得のためのコマンドは、agent 2 と同じ zabbix ユーザーで実行されます。4gpictl は GPIO を読み取るため、zabbix ユーザーを gpio グループに追加しておきます。なお、mmcli の方は追加の権限なしで実行できます。

user@rpi-4gpi-01:~$ sudo usermod -aG gpio zabbix

mmcli の電波強度の詳細値は、--signal-setup で更新間隔を設定しないと取得できません。この設定はラズパイを再起動すると消えてしまうため、NetworkManager の dispatcher(接続に変化があるたびに /etc/NetworkManager/dispatcher.d/ 以下のスクリプトを呼び出す仕組み)で、LTE の接続が上がるたびに設定し直すようにします。モデムの番号は変わることがあるため、-m any を指定しています。

user@rpi-4gpi-01:~$ sudo tee /etc/NetworkManager/dispatcher.d/90-4gpi-signal-setup <<'EOF'
#!/bin/sh
[ "$1" = "wwan0" ] || exit 0
[ "$2" = "up" ] || exit 0
/usr/bin/mmcli -m any --signal-setup=10
EOF
user@rpi-4gpi-01:~$ sudo chmod 755 /etc/NetworkManager/dispatcher.d/90-4gpi-signal-setup
user@rpi-4gpi-01:~$ sudo nmcli con down soracom; sudo nmcli con up soracom

取得したいパラメータを UserParameter として /etc/zabbix/zabbix_agent2.d/4gpi.conf に記述し、agent 2 を再起動します。agent 2 から呼び出される際は PATH が異なる場合があるため、コマンドはフルパスで記述します。

user@rpi-4gpi-01:~$ sudo tee /etc/zabbix/zabbix_agent2.d/4gpi.conf <<'EOF'
UserParameter=modem.signal,/usr/bin/mmcli -m any --signal-get -J
UserParameter=4gpi.power,/usr/sbin/4gpictl status
EOF
user@rpi-4gpi-01:~$ sudo systemctl restart zabbix-agent2

zabbix_agent2 -t で、キーを1回だけ実行して値が取得できることを確認します。

user@rpi-4gpi-01:~$ sudo -u zabbix zabbix_agent2 -t 4gpi.power
4gpi.power                                    [s|on]
user@rpi-4gpi-01:~$ sudo -u zabbix zabbix_agent2 -t modem.signal
modem.signal                                  [s|{"modem":{"signal":{ ... "lte":{"error-rate":"--","rsrp":"-91.00","rsrq":"-7.00","rssi":"-65.00","snr":"16.80"}, ... }}}]

5.2 Zabbix サーバー側に監視項目(アイテム)を追加登録する

Data collection → Hosts → rpi-4gpi-01 → Items → Create item で、以下のアイテムを作成します。Type はいずれも Zabbix agent (active) です。

スクリーンショット 2026-10-30 1.15.59.png

スクリーンショット 2026-10-30 1.16.51.png

Name Key Type of information Update interval Preprocessing
SoC temperature vfs.file.contents[/sys/class/thermal/thermal_zone0/temp] Numeric (float) 1m Custom multiplier 0.001
4GPi module power 4gpi.power Character 1m なし
Modem signal (raw) modem.signal Text 1m なし(History は Do not store)
wwan0 bytes per interval net.if.total[wwan0] Numeric (unsigned) 1m Simple change(Custom on fail: Discard value)
wt0 bytes per interval net.if.total[wt0] Numeric (unsigned) 1m Simple change(同上)

電波強度は、Modem signal (raw) を Master item とした Dependent item として作成し、前処理の JSONPath で分解します。

スクリーンショット 2026-10-30 1.25.06.png

スクリーンショット 2026-10-30 1.27.12.png

Name JSONPath
LTE RSRP (dBm) $.modem.signal.lte.rsrp
LTE RSRQ (dB) $.modem.signal.lte.rsrq
LTE RSSI (dBm) $.modem.signal.lte.rssi
LTE SNR (dB) $.modem.signal.lte.snr

電波の値が取得できない場合、mmcli は数値の代わりに -- を返し、依存アイテムが Not supported になります。前処理に「Matches regular expression: ^-?[0-9.]+$」を追加し、Custom on fail で Discard value を選択しておくと、その回の値だけを破棄することができます。

net.if.total は起動してからの送受信の合計バイト数のため、Simple change で1分あたりの通信量に変換します。wt0(Netbird)の分も取得しておくと、wwan0(LTE 全体)との差から Netbird の上乗せ分を確認することができます。

スクリーンショット 2026-10-30 16.22.27.png

6. ダッシュボードで可視化する

ここまでで、ラズパイの状態が Zabbix へ集まるようになりました。最後に、ダッシュボードで可視化して状態を見やすくします。Dashboards → Create dashboard で新しくダッシュボードを作成した後、ウィジェットを配置し、現場の状態を1画面で確認できるようにします。本記事では、以下のウィジェットを配置しました。

スクリーンショット 2026-10-30 21.01.53.png

ウィジェット 表示内容
Geomap 設置場所。地図上のデバイスの緯度・経度の場所にピンが表示されます。(今回は手動で仮の値を設定しています。)
Item value 通信モジュールの電源(on / off)
Gauge SoC 温度
Graph LTE RSRP・SNR の推移。電波の変動と通信断の関係を後から追えます
Graph wwan0 と wt0 の1分あたりの通信量。LTE 全体と Netbird の中身の差がそのまま見えます

機器の場所や温度、電波、通信量が、現地に行かずに一目で分かるようになりました。Zabbix 7.0 では、複数台を六角形のタイルで並べる Honeycomb ウィジェットなど様々なものが用意されているため、自分の好みにあったレイアウトで機器の状態を容易に把握できるダッシュボードが作成できます。

おわりに

本記事では、4GPi ver.2 を搭載したラズパイの温度・電波強度・通信モジュールの電源・通信量を Zabbix で収集し、ダッシュボードで可視化しました。agent 2 のインストールと UserParameter の追加だけで、現場に置いたラズパイの状態を1画面で容易に把握できるようになりました。

なお、LTE 回線では、監視を加えることで通信量がどれほど増えるかも気になるところです。監視で使用する通信量については別の記事でご紹介する予定です。

LTE 回線でラズパイを監視する際の参考にしていただければ幸いです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?