ユアスタンド株式会社所属
筆者はユアスタンド株式会社のインターン生です.
ユアスタンド株式会社では電気自動車(EV)の充電器をマンションを中心に導入し、自社開発のアプリによる運用に取り組んでいます.
普段は電気自動車充電器の充電スイッチのon, offを制御するソフトウェアの改修業務を担当しています.
本記事ではOverlayfsを有効化したRaspberryPiにて, 定期的に再起動する機能を作成している時に発見した注意点についてまとめています.
環境
Raspberry Pi 3 Model B+
Raspberry Pi OS with desktop(32bit) Released: 2021-05-07
事象
crontabでラズパイを再起動する処理を設定し, Overlayfsを有効化すると永遠に再起動され続ける.
事象の再現方法
1.crontabの設定
$ crontab -e
/tmpcrontab.FcGKNr/crontab
----------------------------------------------
* * * * * sudo reboot #任意の時刻を設定
2.Overlayfs有効化
$ sudo raspi-config nonint enable_overlayfs
3.手動で再起動
$ sudo reboot
4.設定した時刻まで待つ
5.再起動され続ける
事象が起きる原因
前提としてラズパイはデフォルトでRTCが装着されていません.
従って, ネットワークに接続しないと時刻の同期ができません.
Overlayfsを有効化すると, 有効化してシャットダウンした時点のラズパイの設定を保持します.
つまり, Overlayfsを有効化したラズパイを再起動すると, ラズパイの時刻はOverlayfsをかけてシャットダウンした時点の時刻を保持します.
その後, ネットワークに接続するとラズパイは時刻を同期します.
時刻がcronで設定した時刻を跨ぐことでcron処理が発火します.
ラズパイのワークフロー
具体例
- 2021/1/1 00:00:00 に2021/1/2 00:00:00で再起動するcronを設定してOverlayfsを有効化し,再起動した
- 2021/1/2 00:00:00 に予定通り再起動処理が実行された
- 2021/1/2 00:00:00~ 再起動で立ち上がったラズパイの時刻は2021/1/1 00:00:00に設定されている
- NTPにより2021/1/1 00:00:00から2021/1/2 00:00:00以降に時刻が更新される
- cronが発火, 再起動処理が行われる
解決策
同僚が考案してくれました.
Overlayfsを有効化する時, 時刻を未来に設定する
過去から発火時刻を跨ぐのがダメなら未来から時刻を更新すれば良いのです.
ラズパイのワークフロー
具体例
- 2021/1/1 00:00:00 に2021/1/2 00:00:00で再起動するcronと再起動時にNTPを有効化するcronを設定. NTPを無効化, 時刻を2038/1/19 03:14:07に設定. Overlayfsを有効化し,再起動した
- 2021/1/2 00:00:00 に予定通り再起動処理が実行された
- 2021/1/2 00:00:00~ 再起動で立ち上がったラズパイの時刻は2038/1/19 03:14:07に設定されている
- NTPにより2038/1/19 03:14:07から2021/1/2 00:00:00以降に時刻が更新される
- cronは発火せず, 再起動処理が行われない
コマンド
1.crontabで再起動時NTPの有効化
$ crontab -e
/tmpcrontab.FcGKNr/crontab
----------------------------------------------
* * * * * sudo reboot #任意の時刻を設定
@reboot sudo timedatectl set-ntp true #追記
2.Overlayfs有効化と時刻の設定
sudo raspi-config nonint enable_overlayfs
sudo timedatectl set-ntp false
sudo date --set="2038/01/19 03:14:07"
sudo reboot