SSHクライアント側の時刻をサーバに同期させるには?RLoginで(Raspberry Pi/Jetson TK1など)

組み込み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_time_sync

 

ssh_time_sync1

■解決方法

解決方法はいたってシンプル。なんとSSHクライアントソフトのスクリプト機能で解決する方法だ。これならばSSHクライアントからSSHサーバへ接続した際にSSHクライアントの時刻をサーバへ伝えられる。

 

今回はWinodwsのRLoginというソフトを用いる。

1.起動して、ssh設定を終えている前提で話を進めよう。「編集ボタン」を押してみてほしい。

01

 

2.スクリプトのタブを開くと、スクリプトを記述できるスペースがある。

(スクリプト仕様書を見てもらってもいいが、次で時刻設定のサンプルスクリプトコードを記載する)

02

[サンプルスクリプトコード]


 

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受信できるようにしてクライアント兼サーバとして動作させれば完全なスタンドアロンで動作できるようになりそうだ。

ssh_time_sync2

 

同等の条件で困っている人は、非常にすくないだろうがメモとして残しておくことにする。

 



【解決】Waiting up to 60more seconds for network configuration… Boot遅いよ。何やってんの?

どのサイトでも、とりあえずsleep削ればいいんじゃない?ばっかり書いてあって解決できていなかったので掲載しようと思う。

Waiting for network configuration…

Waiting up to 60more seconds for network configuration…

Linuxユーザで固定IPアドレスを設定していて、OS DISOをCloneしたりすると、はまる人が多いだろう。

 

この現象にはまる人は以下の原因が考えられる

1.そもそもネットワーク設定が間違っている。eth設定が無駄に多すぎるとかもね(/etc/network/interfaces)

2.呪文の様に/etc/init/failsafe.confのsleep行をコメントアウトしろと言われている。

3.70-persistent-net.rulesという盲点に目を通さないでいる。

 

今回は3を解説しよう。

001

 

例:サーバAとサーバBがありサーバAディスクをクローンしサーバBに差し替え同じアドレスのまま運用したいとする。その際あなたは単純にクローンディスクをつなげbootすると「Waiting for network configuration…」を見ることになるだろう。

 

 

原因:

これは70-persistent-net.rulesが原因で引き起こされている。

70-persistent-net.rulesはLinuxがネットワークデバイス(MACアドレス)とeth設定を結びつけその情報を保持している。

 

例えば例と同じようにeth0に192.168.0.1と設定し、サーバAに差し込んだ場合70-persistent-net.rulesにはサーバAのネットワークデバイス(MACアドレス)とeth0設定をペアですよ。と関連付けてしまう。その後サーバBに差し替えた際にはeth0の設定が適用されるのでは無く新たなデバイスなのだからeth1設定とペアにし始めるのだ。

 

 

あなたの望みが:

サーバAに差し込んでもサーバBに差し込んでも同じようにeth0のまま使いたい!!あなたがそう思っているなら解決方法はsleep時間を直すことでも差し替えの度にコマンド打ち込むことでもない。

 

 

70-persistent-net.rulesを殺せばいいのだ:

この場合70-persistent-net.rulesが関連付け保存する事じたいが問題なのだ。

 

 

手順1:既にある設定を消す

まずは既に記録されている70-persistent-net.rules記述を消す

sudo vim /etc/udev/rules.d/70-persistent-net.rules

を実行し以下のコメント行以外の部分を全て消して保存しよう。

002

 

 

手順2:70-persistent-net.rulesよ!!さようなら!!

sudo vim /lib/udev/write_net_rules

を実行し以下のように編集します。

編集前:RULES_FILE=’/etc/udev/rules.d/70-persistent-net.rules’

編集後:#RULES_FILE=’/etc/udev/rules.d/70-persistent-net.rules’

RULES_FILE=’/dev/null ‘

 

これで保存して再起動してみよう。煩わしい設定やsleepの呪文とはおさらばできるはずだ。

どちらのサーバにディスクを差し込んでもIPは192.168.0.1だおめでとう!!

 

※あくまで例のケースを紹介しています。エラーや警告には必ず原因があるので解決しない時は頭を動かそう!!

 

参照したサイト等

Ubuntuでオフラインでの起動時に120秒待たされる原因がわかった

http://l1048576.blogspot.jp/2012/05/ubuntu120.html

Ubuntu で Waiting for network configuration エラー

http://4jiokisoft.blogspot.jp/2012/12/ubuntu-waiting-for-network-configuration.html

6.57. Udev-145

http://lfsbookja.osdn.jp/6.5.ja/chapter06/udev.html