組み込みLinux端末と付き合っていると時刻同期の問題が付きまとってくる。(方法だけを見たい人は■を探してね)
みんな「組み込み」だからと時刻同期用のボタン電池搭載をあきらめ電源をきったら
「時刻?あっ?忘れたわ」という呆れた態度をとってくるのだ。
※もちろんこれには理由がある。ボタン電池には寿命がある。保守部品が必要になるということは運用上めんどくさいという考え方もあるのだ。
IoTが注目されはじめ組み込みLinuxシステムの量も格段に増え、ログを一時的に保存するこれらの端末にも時刻同期が要求されることが多くなった。時刻をあわせる方法はいろいろある。私の解決するべき事例を紹介する前にどんな同期方法があるか簡単に紹介しよう。
1.組み込みLinuxをインターネットに接続し時刻サーバ(NTPD)と同期させる。
2.ローカルエリアに時刻サーバ(NTPD)を設置し同期させる。
2.RTCモジュール(ボタン電池付き)を外付けし保持できるようにする。
3.GPSモジュールを外付けし起動時に時刻同期させるようにする。
4.た~みなる~で~しゅどうで~じこくを~にゅうりょくする。
◎解決すべき事例
「私の研究室では、インターネットにつなぐことはできず、予算や保守性の問題でNTPサーバをローカルエリアに新規設置できず。GPSモジュールやRTCモジュールを組み込みLinux機に追加することはかなわず。唯一ターミナル君が正しい時刻を保持し続けており、複数台の組み込みLinux機の司令塔の役割をしているという環境におかれている。」
●解決の糸口(私の事例の場合)
・組み込みLinux機は時刻を保持できない。
・ターミナル機(SSHクライアント)は正しい時刻を保持できる。
・組み込みLinux機の処理はターミナル機からの指示で行われる。(SSH接続が定期的に行われる)
・SSHクライアント画面ではターミナル側の時刻は取得できない。
・SSHクライアント画面ではユーザが任意に時刻を設定することはできる。(sudo date -s ●●●●/●●/●●)
■解決方法
解決方法はいたってシンプル。なんとSSHクライアントソフトのスクリプト機能で解決する方法だ。これならばSSHクライアントからSSHサーバへ接続した際にSSHクライアントの時刻をサーバへ伝えられる。
今回はWinodwsのRLoginというソフトを用いる。
1.起動して、ssh設定を終えている前提で話を進めよう。「編集ボタン」を押してみてほしい。
2.スクリプトのタブを開くと、スクリプトを記述できるスペースがある。
(スクリプト仕様書を見てもらってもいいが、次で時刻設定のサンプルスクリプトコードを記載する)
[サンプルスクリプトコード]
Document.Open();
wait(CONNECT);
sopen(OPEN_LOOK);
swait(6, “$”);
a = time();
str_ye = strftime(“sudo date -s 20%y/%m/%d\n”, a);
str_ho = strftime(“sudo date -s %H:%M:%S\n”, a);
sputs(str_ye);
swait(6, “:”);
sputs(str_ho);
sclose();
3.これで接続すると、SSH接続時にターミナル機の時刻がサーバに設定されるのだ。
少なくともユーザが手入力で設定するよりは、マシになった。煩わしい行程を省けたのだ。最終的にターミナル機を省き、中央の端末だけGPS受信できるようにしてクライアント兼サーバとして動作させれば完全なスタンドアロンで動作できるようになりそうだ。
同等の条件で困っている人は、非常にすくないだろうがメモとして残しておくことにする。