ZYNQのLinuxのハードウェア初期化用にsystemdで起動するサービスを作る
TCP/IPのリモート接続を待つサーバプログラムの起動や、ZYNQのハードウェアの初期化を行うためのプログラムを、これまで/etc/rc.localに書いてきましたが、rc.localに書くのは現在のLinuxでは非推奨であるようです。
やりたいことは2つあって、1つ目はTCP/IPのサーバを起動すること。もう一つはLinuxの起動時に1回だけ初期化を行うことです。TCP/IPのサーバなんかは予期せず停止した場合に再起動してくれるとありがたいです。それぞれ、cszserverとcszinitというサービスを作ることにします。
こういったことをするのにsystemdとかsystemctlといった仕組みを使うのがモダンな方法なので、その方法を調べてみました。
最初にやることはスクリプトを作ることです。
まず、TCP/IPのサーバプログラムのcszserverという実行ファイルがあって、これを起動するためのスクリプトを/opt/cszserver.shに作ります。
#!/bin/bash
/usr/local/bin/cszserver 1069
次に、1回だけ起動するスクリプトを/opt/cszinit.shとして作ります。
#!/bin/bash
/bin/chmod 666 /dev/uio0
/bin/chmod 666 /dev/uio1
/bin/echo enabled > /sys/devices/soc0/amba/e0000000.serial/tty/ttyPS0/power/wakeup
/home/share/autorun
cszinit.shでは、UIO(ユーザIOドライバ)を、一般ユーザでも使えるように実行権限を設定しているのと、ZYNQの低消費電力モードからの復帰機能を有効にしていること、それから、/home/share/autorunというスクリプトを起動しています。
シェルスクリプトファイルを作ったら実行権限を設定します。
$ chmod 755 /opt/cszserver.sh chmod 755 /opt/cszinit.sh
次に、/etc/systemd/system/にサービスの設定ファイルを書きます。
まずは、繰り返し起動したいサービスの定義、/etc/systemd/system/cszserver.service を書きます。
[Unit]
Description = Cosmo-Z API relay server
[Service]
ExecStart = /opt/cszserver.sh
Restart = always
Type = simple
[Install]
WantedBy = multi-user.target
この意味ですが、ExecStartでは先ほど作った起動スクリプトを指定し、Restart=alwaysでは、停止したら自動再起動することを指定します。type=simpleやWantedByの設定は深く考えなくてよいでしょう。
次に1回だけ起動したサービスの定義、/etc/systemd/system/cszsinit.service を書きます。
[Unit]
Description = Cosmo-Z initialize
[Service]
ExecStart = /opt/cszinit.sh
Restart = no
Type = oneshot
[Install]
WantedBy = multi-user.target
ExecStartと、RestartとTypeのところが異なります。
こうして/etc/systemd/systemの下に.serviceファイルを作ったら、
# systemctl list-unit-files --type=service | grep csz
でcszが付くサービスの一覧を表示させてみます。
root@cszmini:~# systemctl list-unit-files --type=service | grep csz
cszinit.service disabled
cszserver.service disabled
設定ファイルを作っただけなのでdisabledとして表示されました。
これらのサービスを有効にするにはsystemctl enable cszserverとsystemctl enable cszinitを実行します。
systemctl enable <サービス名>を実行するとシンボリックリンクが作成されます。
root@cszmini:~# systemctl enable cszserver
Created symlink /etc/systemd/system/multi-user.target.wants/cszserver.service → /etc/systemd/system/cszserver.service.
root@cszmini:~# systemctl enable cszinit
Created symlink /etc/systemd/system/multi-user.target.wants/cszinit.service → /etc/systemd/system/cszinit.service.
そして、 systemctl start cszserver と systemctl start cszinit を実行すれば、これらのサービスが起動します。
rebootしても自動的に起動するようになります。
systemdに登録して嬉しいことは、システムにちゃんとサービスとして登録されているため、systemctl status で表示されて「しっかりした製品だなという印象」を与えられること、
それから、サービスが予期せず停止してもすぐに再起動してくれることです。ためしにkill -9 でシグナルを送ってみるとすぐに再起動してくれます。
この自動再起動という特徴は、ハードウェアの監視や、リソースの管理プログラムを作る場合にはかなり重要です。
まとめると、
- /opt あたりにサービスのシェルスクリプトを作って、実行権限を付与する
- /etc/systemd/system/<サービス名>.service を作る
- systemctl enable <サービス名> でインストールされる
- systemctl start <サービス名> で起動される
ということです。.serviceファイルの中の書き方次第で、強制再起動にもワンショットにもすることができます。
| 固定リンク
コメント