2002年12月30日

Linuxザウルスの時刻合わせ

今年の夏に、ザウルスSL-A300を購入しました。あまり使い勝手のよくないPIMに辟易しながらも、普通に使っていました。ところが、二つの後続機種 (SL-B500, SL-C700) が出てから、ネット上に情報が急激にあふれ出し、それに触発されて、もっと使いやすくするためにあれこれ工夫してみようと思いました。

そんな中、ネットで時刻合わせという、一見地味ながらも実用的なテクニックを紹介した塚本牧生さんのページに行きあたりました。

私のはA-300なのでちょっとスクリプトが違うのですが、ほぼ同じような要領で、自動的に時刻合わせが行えました。

さてここからがオリジナルのネタなんですが、母艦 (Windows XPマシン) の時刻に合わせることができないかと、考えてみました。

Windows 2000 や XP は、Windows Time という、NTP 準拠のサービスが動いています。コマンドプロンプトで net time /setsntp:NTPサーバ名 と入れると、そのNTPサーバに時刻を合わせます。さらに自分自身もNTPサーバとしてリクエストを受け付けるようになります(*1)。

ザウルスを母艦に接続しているときに、ザウルスのターミナルから ntpdate -d 192.168.129.1 と打ってみれば、母艦が NTP のリクエストに応答するのがわかります(*2)。それだけでは電源オフ後に時刻が元に戻ってしまうので、塚本さんのページにある対処が必要ですが。

じゃあ、ネット接続時と同様に、母艦にUSB接続したタイミングで、自動的にntpdateを起動する方法がないものか、と思って、ザウルスのなかの設定ファイルらしきものをあさり、見つけました。

/etc/hotplug/usbd.func というのがそれです。母艦とUSBでつながったときに、このシェルスクリプトにある usbd_net_if_up() という関数が呼び出されます。ここに ntpdate コマンドと echo W > /var/spool/at/trigger を書けばよさそうです。

しかし、これではうまくいきませんでした。USB接続された直後は、まだ母艦にIPアドレスが振られていないので、ntpdate がエラーになります。

そこで、約1分の間に10回ほど ntpdate を試みて、成功したら終了するスクリプトを作ってみました。

http://noir.s7.xrea.com/pub/zaurus/tryntpdate.sh

このシェルスクリプトを /etc/hotplug に置きます。ザウルスドライブで本体メモリにコピーしたとすると、

(A300の場合)


cp ~/Documents/tryntpdate.sh /etc/hotplug
chmod 755 /etc/hotplug/tryntpdate.sh

(B500, C700の場合はこれでいいのかな?)


su
cp ~zaurus/Documents/tryntpdate.sh /etc/hotplug
chown root /etc/hotplug/tryntpdate.sh
chmod 755 /etc/hotplug/tryntpdate.sh

いちど /etc/hotplug/tryntpdate.sh を直接実行して動作を確認するとよいでしょう。

それから、/etc/hotplug/usbd.func を編集します (バックアップはとっておきましょう)。usbd_net_if_up() 関数の末尾の閉じ括弧の直前 (usbd_net_if_down() とある行の2行前)に、

/etc/hotplug/tryntpdate.sh &

という行を加えます。行末の「&」が重要です。

これで、いったんザウルスの電源を切り、ケーブルをつないでから電源を入れてみると、自動的に時刻が合わせられます。

いちおう私のところではうまく動作していますが、あくまで自己責任で。うまくいかないと、ザウルスショット、ザウルスドライブが使えなくなりますのでご注意ください。

*1 ただし、ルータが外部へのUDP 123番ポートの接続をふさいでいるとダメなので注意。

*2 NTPサーバの連続稼働時間が短いと、同期できないことがあるみたいです。ザウルスから ntpdate -d 192.168.129.1 とやってみて、stratum が 16 だと、まだダメということです。

(追記) 上のスクリプトと手順をipkgにまとめたものを作ってみました。

http://noir.s7.xrea.com/pub/zaurus/tryntpdate_0.0.1-1_arm.ipk

最初に Zaurus Archives::Downloads から ntpdate をダウンロード、インストールしてから、上のipkgをインストールすれば、作業完了です。

これも、SL-A300でしか動作確認していないので、くれぐれもご注意を。

Posted by Hiroyuki KUROSAKI at 2002年12月30日 01:07 このエントリーを含むはてなブックマーク
この記事の TrackBack URL:
http://noir.s7.xrea.com/mt/mt-tb.cgi/24
Comments

追記。Windows XP でのNTPサーバの指定は、タスクバーの右端の時刻をクリック→日付と時刻の調整→[インターネット時刻]タブ でいけました。

Posted by: noir on 2002年12月29日 20:36

もうひとつ追記。/etc/hotplug/usbd.func の編集は、次のコマンドでいけます。

cd /etc/hotplug
cp -p usbd.func usbd.func.orig
sed -e '/^usbd_net_if_up()/,/^usbd_net_if_down()/{' -e '/^}$/s@^@/etc/hotplug/tryntpdate.sh \&\
@' -e '}' usbd.func.orig > usbd.func

sedのコマンド行が長すぎてややこしいので、これもシェルスクリプトにまとめたほうがいいか。

Posted by: noir on 2002年12月29日 22:27

>NTPサーバの連続稼働時間が短いと、同期できないことがあるみたいです。ザウルスから ntpdate -d 192.168.129.1 とやってみて、stratum が 16 だと、まだダメということです。

はじめまして。私はA300愛好家です。母艦との同期の際に時刻あわせができるようにしたくこのホームページにたどり着きました。私の母艦はXPですが、stratum が 16になっています。この場合、どこをどうすれば連続接続時間を長くすることができるのでしょうか?アドバイスを頂ければ幸いです。よろしくお願いします。

Posted by: 廣嶋 俊治 on 2003年12月13日 12:47

こんにちは。よろしくお願いします。

Windowsの「日付と時刻のプロパティ」の「インターネット時刻」タブに、「自動的にインターネット時刻サーバと同期する」という項目がありますが、これがオンになっていて、「今すぐ更新」ボタンをクリックして強制的に更新すると、stratumが3に上がるようです。

もし、ファイヤウォール内で、外部へのUTPポート123番が塞がっている場合には、タイムサーバへの接続ができず、更新に失敗してしまいます。そのへんから探ってみるとよいのではないかと思います。

Posted by: noir on 2003年12月13日 15:30

早速のアドバイスありがとうございます。その後、うまく接続でき時刻合わせができました。ありがとうございました。

Posted by: 廣嶋 俊治 on 2003年12月16日 00:54
Post a comment

サイン・インを確認しました、 さん。コメントしてください。 (サイン・アウト)

(いままで、ここでコメントしたとがないときは、コメントを表示する前にこのウェブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)


情報を登録する?