Kodama's home / tips.
以下では, Linux で古野電気 GPS clock TS-820 を用いて, NTP 時刻サ−バを立ててみた. 気になるソフト的な対応状況だが, Linux kernel 2.0 と kernel 2.4 で導入してみた.
メーカに技術的問題で問い合わせしたが, 担当の方は迅速で適切な対応だったので好感が持てる. 最近は, PPSkit や NTP デーモンのソースの方で問題なくこの製品に対応している.
# cd /usr/src # tar xzvf PPSkit-2.1.2.tar.gz # tar xzvf ntp-stable-4.2.0a-20040225.tar.gz # tar xzvf linux-2.4.21.tar.gz # ls PPSkit-2.1.2/ linux-2.4.21/ ntp-stable-4.2.0a-20040225/ PPSkit-2.1.2.tar.gz linux-2.4.21.tar.gz ntp-stable-4.2.0a-20040225.tar.gz # ln -s linux-2.4.21 linux # ln -s /usr/src/linux/include/linux /usr/include/linux
# cd /usr/src/linux # patch -p1 < ../PPSkit-2.1.2/patch-2.4.21 # ln -s /usr/src/linux/include/linux/timepps.h /usr/include/sys/timepps.h # ln -s /usr/src/linux/include/linux/timex.h /usr/include/sys/timex.hNTP, PPS と SERIAL 関係を有効にして普通に再構築します.
CONFIG_EXPERIMENTAL=y CONFIG_NTP=y CONFIG_NTP_PPS=y CONFIG_NTP_PPS_DEBUG=y CONFIG_NTP_PPS_SERIAL=y CONFIG_SERIAL=y再起動して, cat /proc/version で nano kernel を使っているか確認.
通常のバイナリ配布では PPS 信号に対応していないと思われます. timepps.h, timex.h を参照できるようにしておいてから, 自分でコンパイルします.
普通に ./configure, make します. PPS 対応になっているかどうか configure の結果で確認します. PPSkit には古い ntpd へのパッチが含まれていますが, 最近の版の ntpd では不要なようです.
(optional) 以下のようにして ntp ソースの ntpd/refclock_nmea.c の初期化部分で TS-820 を RMC 信号モードに設定すると, 信号が短くなって良いかも知れません. まあ,気分の問題で,あまり差は無いようですが...
gps_send(pp->io.fd,"$PMOTG,RMC,0000*1D\r\n", peer); を gps_send(pp->io.fd,"$PFEC,GPint,ZDA00,GGA00,GSV00,VTG00,RMC01\r\n",peer); に変更.
ドライバは generic NMEA を使用するので, /dev/gps1 を作成. (シリアルポート通信速度4800baud、データ長8bit、パリティなし、ストップビット1bit に自動的に設定されます.)
# ln -s /dev/ttyS0 /dev/gps1
ttyS0 の取り合いにならないように /etc/inittab を確認します. (多分気にしなくても問題なし)
server 127.127.20.1 を指定し, PPS 信号を有効にします. (関係部分の抜粋)
enable pps # pps /dev/oncore.pps.0 hardpps # Furuno TS-820 GPS clock. c.f. refclock_nmea.c in ntpd source tree. server 127.127.20.1 prefer # generic MNEA /dev/gps1 fudge 127.127.20.1 flag3 1 refid GPS # enable kernel PPS disciplineとりあえず, local で動作を確認, 後でアクセスコントロールを調整しなおします.
### access control ### restrict 0.0.0.0 mask 0.0.0.0 ignore restrict 127.0.0.0 mask 255.0.0.0 # accept local network # restrict 192.168.1.0 mask 255.255.255.0 # accept private network
ntpd を起動( -d でデバッグモード).
# ntpd -d
起動後, エラーが無いか, PPS 信号を認識しているか, などを確認. /var/log/syslog, /var/log/ntpstats/ などの動作記録を参照. ntptime, ntpdc -c sysinfo, ntpdc -c kerninfo, ntpdc -p, ntpq -p で ntp の動作情報を見る事ができます.
1日放っておいてから安定性(jitter など)を確認します.
安定したら, 内蔵の時計との解離を避けるために, 1日1回ていど hwclock --systohc すると良い.
hwclock(8) によると, Linux カーネルには, 11分ごとにシステムクロックをハードウェアクロックにコピーするようなモードがあるらしい. xntpd はこのモードをオンにするとのこと. 一定時間毎の書き込みを気にする必要はないのかもしれない. (未確認)
時刻の同期が不安定なマシン(vmware などの仮想マシン)では ntp での同期もしにくいかもしれない. adjtimex と併用すると良いかも. (未確認)
# /etc/ntp.conf, configuration for ntpd #logfile /var/log/xntpd driftfile /var/lib/ntp/ntp.drift statsdir /var/log/ntpstats/ authenticate no ### statistics ### statistics loopstats peerstats clockstats filegen loopstats file loopstats type day enable filegen peerstats file peerstats type day enable filegen clockstats file clockstats type day enable ### server ### enable pps # pps /dev/oncore.pps.0 hardpps # Furuno TS-820 GPS clock. c.f. refclock_nmea.c in ntpd source tree. server 127.127.20.1 prefer # generic MNEA . /dev/gps1 fudge 127.127.20.1 flag3 1 refid GPS # enable kernel PPS discipline ### access control ### restrict 0.0.0.0 mask 0.0.0.0 ignore restrict 127.0.0.0 mask 255.0.0.0 # accept local network # restrict 192.168.1.0 mask 255.255.255.0 # accept private network
以下は 2.0系がメインだった頃の記述です. これから作業するなら新しいカーネルで行いましょう.
kernel 2.0系に関しては, 古野電気のWEBペ−ジ を参照して担当者に連絡すると, Linux版 serial.c ドライバ−ソ−ス, ntpd ソ−ス, ntpdの変更分のソ−スが入ったCD と インスト−ルマニュアルを入手できる. 担当の方は迅速で適切な対応だったので好感が持てる.
実際のインスト−ル作業だが, 古野電気では RedHat 5.2 用として出しているが, kernel の serial.c を差し替えるだけなので, どの配布系でも問題は無いはずだ. (自己責任でね!) とりあえず Debian の kernel-2.0.38 で試してみた. マニュアルでは module にするように指示があったが kernel に組み込みで問題は無いようだ.
ntpd のソ−スも2つのソ−スを差し替えて configure と make するだけ. 普通の kernel の make をしたことがあるなら失敗のしようが無いほど簡潔だ.
安定したら, 内蔵の時計との解離を避けるために, 1日1回ていど hwclock --systohc すると良い.
Kodama's home / tips.