Project Time Server

時刻サーバプロジェクト ~『みんながStratum1』計画~
活動記録と関連情報を掲載します

GPSに同期したNTPサーバ(FreeBSD機)の設定

2008-11-24 18:15:53 | 作業記録
FreeBSD機でGPSのPPS信号に同期したNTPサーバを設定しました。
以下、設定方法を記します。

環境:
 OS: FreeBSD 7.0
 GPS受信機: GPSレシーバセット EasyTime
        http://www.rakuten.co.jp/gps/387357/614348/614350/
       Garmin製 時刻同期用GPSコア マース15tm 内蔵
        http://www.rakuten.co.jp/gps/387357/465139/470224/
 接続: シリアル(RS-232C) ストレートケーブル

方法:

1. カーネル構築
※ /usr/src 以下に、X以外の全ソースがあることが前提です。
/usr/src/sys/i386/conf 以下に、GENERICカーネルのconfigファイルがありますので、

# cd /usr/src/sys/i386/conf
# cp GENERIC GPS
# vi GPS
として、以下の行を書き換え、または追加してください。

ident GENERIC <この行を
ident GPS <に書き換え

options PPS_SYNC <この行を適当なところに追加

次に、カーネルを再構築します。
# config GPS
# cd ../../compile/GPS
# make depend; make

-- 環境にもよりますが、数十分~数時間かかります --

# make install

これで、カーネルがPPSを取得できるようになります。
再起動して、無事起動したら、

# sysctl kern.version

と入力して例えば下記のように表示されれば、「ident GPS」で作成したカーネルで起動していることを確認できます。

(表示例)
kern.version: FreeBSD 7.0-RELEASE #0: Mon Oct 13 15:36:54 JST 2008
sample@test.example.jp:/usr/src/sys/i386/compile/GPS

2. GPSの接続と確認
シリアルケーブルをGPS受信機とPC本体のシリアルポートに接続してください。
次に、
# vi /etc/devfs.conf
として、適当なところに
link cuad0 gps0
link cuad1 gps1 (おまけ)
を追加して、
# /etc/rc.d/devfs restart
としてください。
/dev/gps0 ができていることと思います。
# jerm /dev/gps0
としてみてください。

jermでシリアル接続の確認(必須ではありません)
packages またはports
(/usr/ports/comms/jerm/)
を使って、jermをインストールしてください。
インストール後、
# jerm /dev/gps0
とすると、ずらずらっと文字列が出てくると思います。
(出てこなければgps0に信号が来ていません。)
# cat /dev/gps0
でも表示されます。

GarminのGPSはNMEAフォーマットで信号を送ってきますので
+IGNBRK -BRKINT -IGNPAR -PARMRK -INPCK -ISTRIP -INLCR -IGNCR -ICRNL
-IXON -IXOF -OPOST -ONLCR -OXTABS -ONOEOT....
と出た後に、
$GPRMC,004205,V,3534.5642,N,14008.6974,E,000.0,199.8,071008,007.0,W*75
と、時刻、緯度、経度が出てきます。
NMEAフォーマットの詳細は以下のページに詳しいです。

http://bg66.soc.i.kyoto-u.ac.jp/forestgps/nmea.html

3: NTPサービスの準備

GPS受信機は、そのままではFreeBSDのntpdが信号を受け取ることができませんので、受信機ユニット内部のショートチップをはずす必要があります。
基板上のシルク印刷を正立視して右上のショートチップの右側、「UNIX」の文字の下のショートチップを取り外してください。
これによりのRS-232Cの4p-6pの短絡を開放できます。

4: NTPサービスの起動
#vi /etc/rc.conf
として、以下の2行を適当なところに記入してください。
ntpd_enable="YES"
ntpd_config="/etc/ntp/ntp.conf"

次に、ntpサービスの設定ファイルを作成します。
# vi /etc/ntp/ntp.conf
として、以下の4行を記入してください。

pidfile /var/run/ntpd.pid
driftfile /var/db/ntpd.drift
server 127.127.20.0
fudge 127.127.20.0 time1 -1

127.127.20.0 は、ローカルホストの20(NMEA)の0番を指します。
NTPサービスのrefclock番号の仕様は以下で見つけました。

http://obswww.unige.ch/~bartho/xntp_faq/faq3Carb.htm

次に、ntpdを起動します。
# /etc/rc.d/ntpd start

5: 確認
# ntpq -p
# ntpq -p -c rv
# ntpdc -c kern

あたりを実行してみてください。
以下のように出力されれば、GPSからの電波を取れています。
左から3個目の数字「0」が、親(GPS)のStratum数を表します。
(ここが0ということはこのサーバはStratum1ということになります。)

remote refid st t when poll reach delay offset jitter
==============================================================================
GPS_NMEA(0) .GPS. 0 l 99 64 2 0.000 -5.897 0.002