Kodama's home / tips.

GPS clock(衛星電波時計) TS-820 を用いた NTP 時刻サ−バ

通常は信頼できる時刻サーバに時刻を問い合わせるようにすると良い.

以下では, Linux で古野電気 GPS clock TS-820 を用いて, NTP 時刻サ−バを立ててみた. 気になるソフト的な対応状況だが, Linux kernel 2.0 と kernel 2.4 で導入してみた.

製品内容

古野電気 TS-820の製品には, "取扱説明書", "装備要領書"(設置手順), "プロトコル仕様書"(serial ラインのプロトコルの資料), "プログラマ−ズマニュアル"(SunOS への組み込み解説)等詳しい資料と, 基本のアンテナ工事セットが付属している. 15mのケ−ブル,ビニ−ルテ−プ,自己融着テ−プ, アンテナ固定用クランプまで同梱してあるので, アンテナの支柱さえ確保しておけばこれだけでも設置できる. 今回はアンテナとの距離がかなりあったので オプション品のアンテナ延長ケ−ブルを用いた. アンテナは非常にコンパクトで設置しやすいが, 衛星を見通せるように設置場所を選ぶ必要がある. PC との接続は通常のシリアルケ−ブルを用いて行う.

メーカに技術的問題で問い合わせしたが, 担当の方は迅速で適切な対応だったので好感が持てる. 最近は, PPSkit や NTP デーモンのソースの方で問題なくこの製品に対応している.

設置

Linux kernel 2.4系の場合

必要なもの (カーネルと NTP が協力しあって時刻サーバを作るので, カーネルソースと NTP のソース, カーネルのパッチが必要.)
  1. PPSkit-2.1.2
    カーネルを外部時計の PPS 信号に対応させるパッチ
  2. ntpd の新版
    PPSkit-2.1.2 には ntpd-4.0 のパッチが含まれていますが, ntpd-4.0 は現在配布されていないようです. 最近の ntpd はパッチ無しで問題が無いようなので ntp-stable-4.2.0a-20040225.tar.gz を用いてみました.
  3. kernel2.4.21
    PPSkit-2.1.2 は linux2.4.21 対応の PPS 用パッチです. かならず, PPSkit に対応するソースを用います.

# 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

Linux カーネルコンパイル

PPS kit パッチをあてる.
# 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.h
NTP, 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 を使っているか確認.

ntpd コンパイル

ntp ソースの html/index.html に解説あり.

通常のバイナリ配布では 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); に変更.

GPS デバイス

ドライバは generic NMEA を使用するので, /dev/gps1 を作成. (シリアルポート通信速度4800baud、データ長8bit、パリティなし、ストップビット1bit に自動的に設定されます.)

# ln -s /dev/ttyS0 /dev/gps1

ttyS0 の取り合いにならないように /etc/inittab を確認します. (多分気にしなくても問題なし)

/etc/ntp.conf

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

動作確認

cat /proc/version で nano kernel を使っているか確認.

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 の例

# /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

Linux kernel 2.0系の場合

(obsolete)

以下は 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.