それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

OpenWrtで サービスを作成する( iperf3 の例)

OpenWrtでサービスをサクッと作る

公式サイト参考資料や、既存のinitスクリプトを見れば、大体わかります。

iperf3 をサンプルに、起動してみました。

iperf3 はそれ自体が fork/exec の機能を持っていて daemon 起動するので簡単ですね。

iperf3 の daemon起動

iperf3 -s --daemon 

これに後で終了しやすいようにオプションを入れてあげます。

iperf3 -s --daemon --pidfile /path/to/pid -B 192.168.1.1

あとは、これを使って pidファイルから PIDを取得して終了すればいいわけです。

/etc/init.d/iperf3

サクッと作るとこんな漢字

#!/bin/sh /etc/rc.common

START=95
STOP=01

pidfile=/var/run/iperf3.pid
ip=192.168.1.1

start(){
  echo start iperf3
  echo     iperf3 --server --daemon --pidfile $pidfile --bind $ip
  echo
  iperf3 --server --daemon --pidfile $pidfile --bind $ip
}
stop() {
  echo stop iperf3
  if [ -e $pidfile ] ; then
    pid=`cat $pidfile`
    kill $pid
  fi
}

shebang

1行目のshebanが特殊です。ここでこれを指定すると start/stop 関数をサービス起動終了に使ってくれます。

#!/bin/sh /etc/rc.common

START/STOP

ここは少しわかりにくいですが、いにしえの手法 /etc/rc.dを知っているとサクッとわかります。

START=95
STOP=01

START=95を指定すると/etc/rc.d/S95iperf3が作成されます。
STOP=01を指定すると/etc/rc.d/K01iperf3 が作成されます。

/etc/rc.dよって、開始時の呼順、終了時の呼順を制御しています。辞書順です。

起動終了のテスト

作ったスクリプトを /etc/init.dに設置したら使えます。

cp iperf3-service /etc/init.d

起動してみます。

# service iperf3 start

起動を確認します

# ps w | grep iperf3

終了します。

# service iperf3 stop

終了を確認します。

# ps w | grep iperf3

enable で有効にする

作ったサービスをenableにすれば、サービスが有効になります。

# service iperf3 enable

起動時実効有効になったのを確認する。 /etc/rc.d/S95 が作成される

root@OpenWrt:~# ls -la /etc/rc.d/S* | grep iperf
lrwxrwxrwx    1 root     root            16 Feb 19 17:58 /etc/rc.d/S95iperf3 -> ../init.d/iperf3

終了時の実効が有効になったのを確認する。 /etc/rc.d/K01 が作成される

root@OpenWrt:~# ls -la /etc/rc.d/K* | grep iperf
lrwxrwxrwx    1 root     root            16 Feb 19 17:58 /etc/rc.d/K01iperf3 -> ../init.d/iperf3

起動時と終了時で順番が違うのは、起動時では最後に、終了時には最初に、それぞれ処理をしてほしいからです。

有効になったのを確認する。

ここまでで、WEB-UI/Luciから有効になったのが確認できます。 f:id:takuya_1st:20220219181838p:plain

永続化する。

/etc/init.d のファイルは、バックアップに含まれないので、バージョンアップ時に消えてしまいます。

mv /etc/init.d/iperf3 /etc/config/my_custom/services/iperf3-service
ln -s /etc/config/my_custom/services/iperf3-service /etc/init.d/iperf3 

/etc/config はバックアップに含まれるので、これでファイルがバックアップに入ります。

ただ、バックアップからの復元時に /etc/init.dへ自動に書き戻す事はできないので、注意が必要です。どうしてもやりたければ、opkg のパッケージを作ったほうがいいかもしれない。

参考資料にある USE_PROCDについて

USE_PROCD=1

USE_PROCDを使ったほうが、daemon化が必要ないので便利そうですが。 iperf3にはdaemon機能があるので、今回は使っていません。

参考資料

https://openwrt.org/docs/guide-developer/procd-init-script-example